/*! jQuery v1.7.1 jquery.com | jquery.org/license */
(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(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 ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(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===bT,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=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();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(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,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=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.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 d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+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(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,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"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&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,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},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)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML="   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.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?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.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)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){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,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.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&&!l.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&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.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&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),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(j,"")+" ";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(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.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]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),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]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.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!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},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=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([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}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&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=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null: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=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=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(t){s=function(a,b){var c=0,d=b||[];if(g.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 u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)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 v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=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}),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)&&(o.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:[]}},o.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&&(o.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")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(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;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},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 V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={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,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(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 f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(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(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(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=f.clean(arguments);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,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.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 f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},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]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.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?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[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","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.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(c||!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 cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("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,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},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||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.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=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=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(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.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;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.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):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
//======================== COOKIE =========================
/** @static */
function setCookie (name, value, time_in_hours, path, domain, secure) 
{
	expires = false;
	if (time_in_hours != -1)
	{
		if (!time_in_hours)	time_in_hours = 5;
		
		var d = new Date();
		d.setHours(d.getHours() + time_in_hours);
		expires = d.toGMTString()
	}
	
	if (!path)	path = "/";
	
	if (!domain)	domain = "." + window.location.hostname.replace(/^www./gi, "");
	
	
	document.cookie = name + "=" + escape(value) +
		((expires) ? "; expires=" + expires : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
}

/** @static */
function getCookie(name) 
{
	var cookie = " " + document.cookie;
	var search = " " + name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	
	if (cookie.length > 0) 
	{
		offset = cookie.indexOf(search);
		if (offset != -1) 
		{
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1) 
			{
				end = cookie.length;
			}
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	
	return(setStr);
}

/** @static */
function setCookieAndGo(name, value, path)
{
	setCookie(name, value);
	if (!path)
		window.location.reload(true);
	else
		window.location = path;
}

/** удаляет параметр Cookie,
установив ему время жизни 1 Января 1970 года
@static
*/
function delCookie(name, path, domain)
{
	if (!path)	path = "/";
	if (!domain)	domain = "." + window.location.hostname.replace(/^www./gi, "");
	document.cookie = name + "=" + 
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		"; expires=Thu, 01-Jan-70 00:00:01 GMT";
}
/** @static */
function delCookieAndGo(name, path)
{
	delCookie(name, null, null);
	if (!path)
		window.location.reload(true);
	else
		window.location = path;
}

//================= ОБЩЕГО НАЗНАЧЕНИЯ ======================
/** @static */
function Reload()
{
	window.location.reload(true);
}
/** @static */
function Go(url)
{
	window.location = url;
}
/** @static */
function GoBlank(url)
{
	window.open(url);
	return false;
}

/** @static */
function PrepareFloat(st)
{
	st = "" + st;
	st = st.replace(",", ".");
	st = st.replace(/[^0-9.\-+]+/, "");
	if (!st || st == "")
		return "0";
	
	return st;
}
/** @static */
function GetFloat(st)
{
	if (!isNaN(1 * st)) return 1 * st;
	
	var result = 1*PrepareFloat(st);
	if (isNaN(result))
		return 0;
		
	return result;
}
/** @static */
function PrepareInt(st)
{
	st = "" + st;
	st = st.replace(/[^0-9\-+.,]+/g, "");
	if (!st || st == "")
		return "0";
		
	return st;
}
/** @static */
function GetInt(st)
{
	if (!isNaN(1 * st)) return Math.round(1 * st);
	
	var result = 1*PrepareInt(st);
	if (isNaN(result))
		return 0;
		
	return result;
}
/** @static */
function digit_to_str(d, drob, fra)
{
	if (!drob)
		drob = 2;
		
	var st = "";
	st += Round(d, drob);
	
	st = st.replace(".", ",");
	
	var pos_c = st.indexOf(",");
	if (pos_c == -1)
	{
		pos_c = st.length;
		st += ",00";
	}
	else
	{
		st += "00";
		st = st.substr(0, pos_c + drob + 1);
	}
		
	var part1 = st.substr(0, pos_c);
	var start = part1.length % 3;
	
	var part1_r = part1;
	for (var i = start ? start : 3, j = 0; i < part1.length - 1; i+= 3, j++)
	{
		part1_r = part1_r.substr(0, i + j) + " " + part1_r.substr(i + j);
	}
	
	var result = part1_r + st.substr(pos_c);
	
	if (!fra)
	{
		result = result.replace(/[0]+$/g, "");
		result = result.replace(/,$/g, "");
	}
	
	return result;
	
}
/** @static */
function floatf(d, percision, fra)
{
	return digit_to_str(d, percision, fra);
}



//================= FORMS ======================
function CheckSearchForm(form)
{
	
	if (form.qs.value == "" || form.qs.value == form.qs.EmptyText)
	{
		alert(Msg.enter_request_string)
		form.qs.focus()
		return false
	}
	
	if (form.qs.value.length < 3)
	{
		alert(Msg.short_request_string)
		form.qs.focus()
		return false
	}
	return true
}

function CheckHiddenInputForm(form)
{
	for (var i = 0; i < form.elements.length; i++)
	{
		el = form.elements[i];
		if(el.HiddenInput && el.EmptyText == el.value)
			el.value = "";
	}
	return true;
}
/** @static */
function InitHiddenInput(sForm, sElement, text)
{
	var pForm = document.getElementById(sForm)
	if (!pForm)
		return
		
	var pEl = pForm.elements[sElement]
	
	if (!pEl)
		return
	
	
	pEl.EmptyText = text
	pEl.HiddenInput = true;
	SetHiddenInputText(null, pEl)
	pEl.onblur = SetHiddenInputText
	pEl.onfocus = ClearHiddenInputText
	
}
function onSubmitHiddenInput(pForm) 
{
	if (!pForm)	return;
	
	for	(var i=0; i< pForm.elements.length; i++)
	{
		var pEl = pForm.elements[i];
		if (pEl.HiddenInput && pEl.EmptyText == pEl.value)
			pEl.value = '';	
	}
}
function SetHiddenInputText(e, p)
{
	if (!p)
		p = this

	if (p.value == "")
		p.value = p.EmptyText
}

function ClearHiddenInputText(e, p)
{
	if (!p)
		p = this
	
	if (p.value == p.EmptyText)
		p.value = ""
		
}
function FiltersSubmit(pForm)
{
	var filters = [];
	
	for (var i = 0; i < pForm.elements.length; i++)
	{
		var el = pForm.elements[i];
		if (el.getAttribute("filter_helper"))
			continue;
		
		switch(el.nodeName)
		{
			case "SELECT":
				if (el.multiple)
				{
					var v = "";
					
					for(var j in el.options)
					{
						if (el.options[j].selected && el.options[j].value)
						{
							if (v)
								v += ";";
								
							v += el.options[j].value;
						}
					}
					
					filters[el.name] = { data_type: "single", data: v };
					
					
				}
				else
				{
					filters[el.name] = { data_type: "single", data: el.value };
				}
				break;
				
			case "INPUT":

				if (el.getAttribute("type") == "checkbox" && el.checked)
				{
					if (!filters[el.name])
						filters[el.name] = { data_type: "single", data: el.value };
					else
					{
						filters[el.name]["data_type"] = "list";
						filters[el.name]["data"] += ";" + el.value;
					}
				}
				else if (el.getAttribute("type") == "radio" && el.checked)
				{
					filters[el.name] = { data_type: "single", data: el.value };
				}
				else if (el.getAttribute("type") == "text")
				{
					if (pForm[el.name + "_extra"] && el.value)
					{
						var pExtra = pForm[el.name + "_extra"];
						var val = PrepareFloat(el.value);
						
						if (pExtra.value == 1 || pExtra.value == 2)
						{
							filters[el.name] = { data_type: "range", data: (pExtra.value == 2 ? val : "x") + "--" + (pExtra.value == 1 ? val : "x") };
						}
						else
							filters[el.name] = { data_type: "single", data: val };
							
					}
					else if (pForm[el.name + "_to"])
					{
						var pTo = pForm[el.name + "_to"];
						var val_from = PrepareFloat(el.value);
						var val_to = PrepareFloat(pTo.value);

						if (val_from || val_to)
							filters[el.name] = { data_type: "range", data: (val_from ? val_from : "x") + "--" + (val_to ? val_to : "x") };
					}
					else if(el.value)
					{
						filters[el.name] = { data_type: "single", data: PrepareFloat(el.value) };
					}
				}
				break;
		}
	}
	
	var url = "";
	for (var key in filters)
	{
		if (filters[key] && filters[key]["data"])
		{
			url += url.length == 0 ? "?" : "&";
			url += key + "=" + filters[key]["data"];
		}
	}
	
	if (pForm.action)
		url = pForm.action + url;
	else
		url = location.pathname + url;

	location = url;
	
}


function getFormRequest(form)
{
	var request = "";
	for (var i = 0; i < form.elements.length; i++)
	{
		var item = form.elements[i];
		if(item.name)
		{
			switch(item.type)
			{
				case "radio":
				case "checkbox":
					if(item.checked)
						request = request + (request? "&" : "" ) + item.name + "=" + item.value;	
					break;
				case "text":
					request = request + (request? "&" : "" ) + item.name + "=" + item.value;	
					break;
			}
		}
	}
	return request;
}


var FdbRelParams = [];

function FdbParamGetDepended(p)
{	
	var pForm = p.form;
	//if (!pForm)
		//return [];
	
	var param_id = p.getAttribute("param_id");
	if (!param_id) return [];
	var depended_elements = [];
	
	for (var i = 0; i < pForm.elements.length; i++)
	{
		var pp = pForm.elements[i];
		if (pp.getAttribute("rel_param") == param_id)
		{
			depended_elements.push(pp);
		}
	}
	
	return depended_elements;
}

function FdbParamChanged(p)
{
	var depended_elements = FdbParamGetDepended(p);
	var value_id = parseInt(p.value); if (isNaN(value_id))	value_id = 0; 
	
	if (depended_elements)
	{
		for (var i = 0; i < depended_elements.length; i++)
		{
			var pp = depended_elements[i];
			var ppp = pp.parentNode;

			if (value_id)
			{
				var params = {"name_id": pp.getAttribute("param_id"), "rel_value": p.value, "id": pp.getAttribute("field_id"), "class_name": pp.className, "empty_caption": pp.getAttribute("empty_caption"), "rel_empty_caption": pp.getAttribute("rel_empty_caption")};
				if (!params.id)
					$.extend(params, { "rel_param": pp.getAttribute("rel_param"), "name": pp.getAttribute("name") });
                
				$.get(
					  "/feedback/ajax_param_field",
					  params,
					  function (data, status) { FdbParamComplete(data, status, ppp); },
					  "html"
					 );	
				
				FdbParamPreloader(pp);
			}
			else
				FdbParamClearValues(pp);
		}
	}

}

function FdbParamPreloader(p)
{
	var depended_elements = FdbParamGetDepended(p);
	
	var pp = p.parentNode;
	if (pp)
	{	
		pp.innerHTML = "<img src='"+ StaticUrl + "/img/img/loading.gif'>";
	}
	
		
	for (var i = 0; i < depended_elements.length; i++)
		FdbParamClearValues(depended_elements[i]);
}

function FdbParamClearValues(p)
{

	if (p.options)
	{
		/*
		while (p.options.length > 0)
		{
			if (p.options.remove)
				p.options.remove(0);
			else
				p.options[0].remove()
			
		}
		*/
		$(p).empty();
		var newElem = document.createElement("option");
		newElem.text = p.getAttribute("rel_empty_caption");
		newElem.value = 0;
		p.options.add(newElem);
		
		p.disabled = true;
	}
	
	var depended_elements = FdbParamGetDepended(p);
	
	for (var i = 0; i < depended_elements.length; i++)
		FdbParamClearValues(depended_elements[i]);
}

function FdbParamComplete(data, status, p)
{
	if (status == "success")
	{
		$(p).html(data);
	}
}

function FdbParamError(request)
{
	
}


function FdbChangeClass(p, class_in, class_out)
{
	var curr_class = p.className;
	var base_class = curr_class;
	
	curr_class = curr_class.replace(class_out,' ');
	if (base_class == curr_class)
		p.className = curr_class + ' ' + class_in;
	else
		p.className = curr_class + class_in;
}

/** @static */
function GetPos(el)
{
    if (!el || !el.offsetParent)return false;
    var res=Array()
    res["left"] = el.offsetLeft;
    res["top"] = el.offsetTop;
    var objParent = el.offsetParent;
    while (objParent.tagName.toUpperCase()!="BODY")
    {
        res["left"] += objParent.offsetLeft;
        res["top"] += objParent.offsetTop;
        objParent = objParent.offsetParent;
    }
	
    res["right"]=res["left"]+el.offsetWidth;
    res["bottom"]=res["top"]+el.offsetHeight;
    return res;
}
/** @static */
function CancelBubble(e)
{
	if (!e && window.event)
		e = event;
		
	if (!e)
		return;
		
	if (e.stopPropagation)
		e.stopPropagation();
	else
		e.cancelBubble = true;
}
/** @static */
function PreventDefault(e)
{
	e = getEvent(e);
	
	if (!e)
		return false;
		
	if (e.preventDefault)
		e.preventDefault();
	else
		e.returnValue= false;
		
	return false;
}
/** @static */
function getEvent(e)
{
	if (!e)
		e = window.event;
	
	if (e.pageX == undefined)
		e.pageX = GetInt(e.clientX + $(document.body).scrollLeft()
		);
		
	if (e.pageY == undefined)
		e.pageY = GetInt(e.clientY + $(document.body).scrollTop());
	
	return e;
}
/** @static */
function in_array(needle, haystack)
{
	if([].indexOf != undefined)
	{
		return haystack.indexOf(needle) != -1; // На всякий случай приведем к bool
	}
	else
	{
		for (var k in haystack)
			if (haystack[k] == needle)
				return true;
	}
			
	return false;
}
/** @static */
function array_find(needle, haystack)
{
	if([].indexOf != undefined)
	{
		return haystack.indexOf(needle);
	}
	else
	{
		for (var k in haystack)
			if (haystack[k] == needle)
				return k;
	}
			
	return -1;
}
/** @static */
function array_length(array)
{
	var i;
	for (i in array) {}
	
	i = GetInt(i);
	return i ? i + 1 : 0;
}
/** @static */
function array_implode(glue, array)
{
	var result = "";
	for (var i in array)
	{
		if (result)
			result += glue;
			
		result += array[i];
	}

	return result;
}
/** @static */
function array_del_value(value, array)
{	
	var result = [];
	for (var i in array)
	{
		if (array[i] != value)
			result.push(array[i]);
	}

	return result;
}

var __time_dd1;
var __time_dd2;

function time_point()
{
	__time_dd1 = new Date();
}

function time_show()
{
	__time_dd2 = new Date();
	ConsoleLog(__time_dd2.getSeconds() - __time_dd1.getSeconds() + __time_dd2.getMilliseconds() / 1000 - __time_dd1.getMilliseconds() / 1000);
}
/** @static */
function array_remove(array, i)
{
	var array1 = array.slice(0, i);
	var array2 = array.slice(1 * i + 1);
	
	return array1.concat(array2);
}
/** @static */
function array_remove_range(array, i, len)
{
	i = 1 * i 
	var array1 = array.slice(0, i);
	var array2 = array.slice(i + len);
	
	return array1.concat(array2);
}



/** @static */
function object_merge(obj1, obj2)
{
	var result = {};
	if (obj1)
	{
		for (var i in obj1)
			result[i] = obj1[i];
	}
	
	if (obj2)
	{
		for (var i in obj2)
			result[i] = obj2[i];
	}

	return result;
}
/** @static */
function object_add(obj1, obj2)
{
	if (!obj1) return;
	
	if (obj2)
	{
		for (var i in obj2)
			obj1[i] = obj2[i];
	}
}
/** @static */
function array_merge(arr1, arr2)
{
	var result = [];
	if (arr1)
	{
		for (var i in arr1)
			result.push(arr1[i]);
	}
	
	if (arr2)
	{
		for (var i in arr2)
			result.push(arr2[i]);
	}

	return result;
}
/** @static */
function array_sub(arr, start, length)
{
	var res = [];
	var end = length && length + start < arr.length ? start + length : arr.length;
	
	for (var j=start; j < end; j++) {
		res[res.length] = arr[j];
	}
	return res;
}
/** @static */
function url_add_param(url, name, value)
{
	return url + (url.indexOf('?') > 0 ? '&' : '?') + name + '=' + value;
}
/** @static */
function empty(val)
{
	return !val || val == "" || val == null;
}
/** @static */
function trim(string)
{
	if (!string) return "";
	return string.replace(/(^\s+)|(\s+$)/g, "");
}

/** @static */
function ConsoleLog(arg)
{
	if (window.console !== undefined && window.console.log !== undefined && window.DSEDebugMode !== undefined)
		Function.prototype.apply.call(console.log, console, arguments);
}
/** @static */
window.pr = ConsoleLog;


/** @static */
function ConsoleDir(arg)
{
	if (window.console !== undefined && window.console.dir !== undefined && window.DSEDebugMode !== undefined)
		Function.prototype.apply.call(console.dir, console, arguments);
}

/** @static */
function Round(num, percision)
{
	return Math.round(GetFloat(num) * Math.pow(10, percision)) / Math.pow(10, percision);
}

/** @static */
function NewDate(date_string)
{
	if(!date_string) return new Date();
	var split_date = date_string.split('-');
	return new Date(split_date[0], split_date[1]-1, split_date[2]);
}


/** @static */
function EvalReturn(code, is_single_value)
{
	if (!code)
		return null;
		
	return 'function __alpha_func() { '+ (is_single_value ? 'return ' : '') + code +' }; try{ __alpha_func(); } catch(ex) { ConsoleLog(ex); }';
}
/** @static */
function uniqid()
{
	return ((new Date()).getTime() + "" + Math.floor(Math.random() * 1000000)).substr(0, 18);
}

/** @static */
function IsHtml(text)
{
	if ((/<[a-z]+/i).test(text)) return true;
	return false;
}

/** @static */
/*function UnsafeHtml(html)
{
	return html.replace(/˂/g, '<').replace(/˃/g, '>');
}
*/
/** Объединяет jQuery-объекты в один новый
@static
*/
$.dseUnion = function(arrays)
{
	var new_array = $(arguments[0]);
	
	for(var i=1; i<arguments.length; i++)
	{
		new_array = new_array.add($(arguments[i]));
	}
	
	return new_array;
};

/** @static */
window.pr = ConsoleLog;

/** @static */
function ExplodeKeyValue(str, seporator_main, seporator_values)
{
	if (!str) return {};
 	var subs = str.split(seporator_main);
	var rreturn = {};
	for (var key in subs)
	{
		var subs2 = subs[key].split(seporator_values);
		
		if (subs2[0] && subs2[0] != '0')
			rreturn[subs2[0]] = subs2[1];
	}
	
	return rreturn;
}

/** @static */
function ImplodeKeyValue(array, seporator_main, seporator_values)
{
	var rreturn = "";
	for (var key in array)
	{
		if (rreturn) rreturn += seporator_main;
		rreturn += key + seporator_values + array[key];
	}
	
	return rreturn;
}
/** @static */
function event_add(obj, name, func)
{
	if (!obj) return;
	if (!obj[name]) obj[name] = [];
	else if (typeof obj[name] == 'function')
	{
		obj[name] = [obj[name]];
	}
	if (obj[name].push)
		obj[name].push(func);
}
/** @static */
function event_remove(obj, name, func)
{
	if (!obj || !obj[name]) return;
	if (typeof obj[name] == 'function')
	{
		if (obj[name] == func)
			obj[name] = null;
	}
	else if (obj[name].push)
		array_del_value(func, obj[name]);	
}
/** @static */
function event_call(obj, name, _this, args)
{
	if (!obj || !obj[name]) return;
	if (typeof obj[name] == 'function')
	{
		return obj[name].apply(_this, args);
	}
	else
	{
		for(var key = 0; key < obj[name].length; key++)
		{		
			if (typeof obj[name][key] == 'function')
				if (obj[name][key].apply(_this, args) === false) return false;
		}
	}
}

var $$ = {};

//#region общие
/** Вывод стандартньго сообщения alert(Msg.error_ajax)
@static
*/
function SH_AlertAjaxError(xhr)
{
	if (xhr && xhr.status == 403)
		alert(Msg.permission_deny);
	else
		alert(Msg.error_ajax);
}
//#endregion


//#region SH_table_set
function SH_table_set_state(selector, class_name, layer)
{
	if (!layer)
		layer = $(selector);

	//layer.css("height", layer.outerHeight());
	var td = layer.find("td:first");
	td.hide();
	td.siblings().hide();
	layer.find("td." + class_name).css('display', $.browser.msie ? 'block' : 'table-cell');
}

function SH_table_set_state_this(p, class_name)
{
	SH_table_set_state(false, class_name, $(p).closest("[SH_root]"));
}
//#endregion




//#region RowCommon
function DeleteRowsCommon(p)
{
	var pForm = getParentByTag(p, "FORM");
	if ($(pForm).find(":checked").length == 0)
		return;

	if (confirm(Msg.really_delete_selected))
	{

		pForm.elements["delete"].value = 1;
		pForm.submit();
	}
}


function DeleteRowCommon(p, url)
{
	if (confirm(Msg.really_delete_select))
	{
		location = url;
	}
}


function ReadRowsCommon(p)
{
	var pForm = getParentByTag(p, "FORM");
	if ($(pForm).find(":checked").length == 0)
		return;


	pForm.elements["read"].value = 1;
	pForm.submit();

}
//#endregion


//#region Currency
function CurrencyChange(p, not_reload)
{
	var pForm = $(p).parents("form:first").get(0);
	setCookie("__cy_id", pForm.cy.value, 240);
	setCookie("cy_id", "", -2);

	if (!not_reload)
		window.location.reload(true);
}

function CurrencyCalculationShow(p, show)
{
	var layer = $("#currency_calc_tooltip");
	layer.stop();

	if (show)
	{

		var orig_price = $(p).attr("CY_price").toLowerCase();
		var orig_cy_id = $(p).attr("CY_i").toLowerCase();


		if (GetFloat(orig_price) <= 0.0)
			return;

		var sHtml = "";
		var sHtmlDisplay = "";

		if (orig_cy_id != CurrencyDisplay)
			sHtmlDisplay = "<div class='p2'><img src='"+ StaticUrl +"/img/icons/flags/by-cy/"+ CurrencyList[CurrencyDisplay].id +".gif' width='16' height='11' class='icon'><b>" + CurrencyConvert(orig_price, orig_cy_id, CurrencyDisplay) + "</b></div>";


		for(var k in CurrencyList)
		{
			if (CurrencyList[k]["id"] != CurrencyDisplay && CurrencyList[k]["id"] != orig_cy_id)
				sHtml += "<div class='p2'><img src='"+ StaticUrl +"/img/icons/flags/by-cy/"+ CurrencyList[k].id +".gif' width='16' height='11' class='icon'>" + CurrencyConvert(orig_price, orig_cy_id, CurrencyList[k]["id"]) + "</div>";
		}

		layer.find("td:first").html(sHtmlDisplay + sHtml);

		var position = $(p).position();
		layer.css("top", position.top - 20);
		layer.css("left", position.left + $(p).width() + 5);
		layer.css("opacity", 1);
		layer.show();

	}
	else
	{
		layer.fadeOut("fast");
	}

}

function CurrencyOriginShow(p, show)
{
	var layer = $("#currency_calc_tooltip");
	layer.stop();

	if (show)
	{

		var orig_price = $(p).attr("CY_origin_price").toLowerCase();
		var orig_cy_id = $(p).attr("CY_origin_i").toLowerCase();
		var orig_units = $(p).attr("CY_origin_units");

		if (GetFloat(orig_price) <= 0)
			return;
		//if (orig_cy_id == CurrencyDisplay)
		//	return;

		var sHtml = "<div class='p2'>" + Msg.prod_seller_price_set + "</div><div class='p2'><img src='"+ StaticUrl +"/img/icons/flags/by-cy/"+ CurrencyList[orig_cy_id].id +".gif' width='16' height='11' class='icon'><b>" + CurrencyList[orig_cy_id].format.replace('%s', digit_to_str(orig_price )) + (orig_units ? " /"+ orig_units : "") +"</b></div>";

		layer.find("td:first").html(sHtml);

		var position = $(p).position();
		layer.css("top", Math.min(position.top - 20, $("body").scrollTop() + $(window).height() - layer.height() - 20));
		var left = position.left + $(p).width() + 5;
		if (left + layer.outerWidth() > $(window).width())
			left = position.left - layer.outerWidth() - 5;

		layer.css("left", GetInt(left));
		layer.css("opacity", 1);
		//layer.fadeIn("fast");
		layer.show();

	}
	else
	{
		layer.fadeOut('fast');
	}

}

function CurrencyConvert(orig_price, orig_cy_id, new_cy_id)
{
	var f = digit_to_str(orig_price / CurrencyRate[new_cy_id] * CurrencyRate[orig_cy_id]);
	if (f == 0)
		f = "~0"
	return CurrencyList[new_cy_id].format.replace('%s', f);
}
//#endregion


//#region Import
function ImportSelectColumn(i_col, class_name)
{
	i_col--;

	var pTable = $("#import_preview").get(0);

	$(pTable).find("td,th").each(function () { $(this).removeClass(class_name) } );

	if (i_col >= 0)
	{

		for (var i = 0; i < pTable.rows.length; i++)
		{
			$(pTable.rows[i].cells[i_col]).addClass(class_name);
		}
	}

	ImportInitCaptions();
}

function ImportInitCaptions()
{
	var table = $("#import_preview");
	table.find("th").each(function () {

		var caption = "";
		var th = $(this);

		if (th.hasClass("sysid"))
			caption += ", " + Msg.prod_code;

		if (th.hasClass("name"))
			caption += ", " + Msg.prod_name;

		if (th.hasClass("units"))
			caption += ", " + Msg.prod_units;

		if (th.hasClass("price_1"))
			caption += ", " + Msg.prod_price_1;

		if (th.hasClass("price_2"))
			caption += ", " + Msg.prod_price_2;

		if (th.hasClass("notice"))
			caption += ", " + Msg.prod_comment;

		if (caption.length > 0)
			caption = caption.substr(2);
		else
			caption = this.cellIndex + 1;

		th.html(caption);

	} );
}

function ImportSelectColumnInit()
{
	var pTable = $("#import_preview").get(0);
	var pForm = getParentByTag(pTable, "FORM");

	ImportSelectColumn(pForm.col_sysid.value, "sysid");
	ImportSelectColumn(pForm.col_price_1.value, "price_1");
	ImportSelectColumn(pForm.col_price_2.value, "price_2");

	if (pForm.col_name) ImportSelectColumn(pForm.col_name.value, "name");
	if (pForm.col_units) ImportSelectColumn(pForm.col_units.value, "units");
	if (pForm.col_notice) ImportSelectColumn(pForm.col_notice.value, "notice");
}
//#endregion


//#region PNM_show
function PNM_show(p, show, e)
{
	var el = $(p);
	el.BCH(function(){ PNM_show(this, 0, false); });
	var root = el.parents("[PNM_root]:first");
	var button = root.find("[PNM_button]");
	var message = root.find("[PNM_message]");

	if (message.is(":hidden") && show == -1 || show == 1)
	{
		button.find(".content").html(Msg.close);

		var position = button.position();
		message.css("top", position.top + 30);
		message.css("left", position.left - message.width() + button.width());

		message.fadeIn("fast");
		el.ToggleBCH(true);
	}
	else if (show == 0 || show == -1)
	{
		button.find(".content").html(Msg.know_more);
		message.hide();
		el.ToggleBCH(false);
	}


	CancelBubble(e);
}
//#endregion


//#region ReinitDepended
function ReinitDependedElements()
{
	$("[depend_on]").each(function () {

		ReinitDependedElement(this);

	});
}

function ReinitDependedElement(p)
{
	var depend_el = $(p).attr("depend_on");
	var form = $(p).parents("form:first");

	var main_element = form.find("#" + depend_el);

	if (main_element.length)
	{
		var pMain_element = main_element.get(0);
		if (pMain_element.checked)
		{
			p.disabled = false;
		}
		else
		{
			p.disabled = true; p.value = 0;
		}
	}
}
//#endregion


//#region Price Complain/Decomplain
function ComplainPrice(prod_id, ent_id)
{
	if (!confirm(Msg.complain_for_price))
		return;

	$.ajax({
		type: "POST",
		url: "/user/ajax/complain-price",
		data: {
				"prod_id": 	prod_id,
				"ent_id":	ent_id
			},
		complete: function(data, status){
			alert(data.responseText);
		}
	});
}

function DecomplainPrice(prod_id, ent_id, price)
{
	if (!confirm(Msg.actual_price))
		return;

	$.ajax({
		type: "POST",
		url: "/user/ajax/decomplain-price",
		data: {
				"prod_id": 	prod_id,
				"ent_id":	ent_id,
				"price":	price
			},
		complete: function(data, status){
			alert(data.responseText);
		}
	});
}
//#endregion



//#region  Универсальный скрыватель
/** Скрытие элемента по таймеру после mouseout
@param JQuery/DOMElement $toggle_elements - Скрываемые элементы
@param JQuery/DOMElement $hover_elements - Дополнительные элементы, блокирующие скрытие
@param function $hide_callback - Функция, вызываемая перед скрытием элемента
@param object $options - Дополнительные опции
bind_to_hover - сохранять настройки класса во вспомогательном элементе, вместо скрываемого.
Полезно если один и тот же элемент вызывается из событий нескольких элементов.
delay - Задержка перед скрытием элемента
@static */
function iHidderInit(toggle_elements, hover_elements, hide_callback, options)
{
	toggle_elements = $(toggle_elements);
	hover_elements = $(hover_elements);

	var hidder = toggle_elements.data('$Hidder');

	// проверяем, инициализирован ли уже...
	if (!hidder)
	{
		hidder = new iHidderClass(toggle_elements, hover_elements, hide_callback, options);
		toggle_elements.data('$Hidder', hidder);
	}
	
	if (options && options.bind_to_hover && !hover_elements.data('$Hidder'))
	{
		hover_elements.data('$Hidder', hidder);
		hidder.InitHover(hover_elements);
	}
	
	return hidder;
}

function iHidderClass(toggle_elements, hover_elements, hide_callback, options)
{
	var _this = this;
	//this.uniq_id = hover_elements.find("a").html();
	this.timer = false;
	// Сохраним для внешнего обработчика
	this.toggle_elements = toggle_elements;
	this.hover_elements = hover_elements;
	
	this.state = true;

	this.options = options ? options : {};

	// вешаем обработчики
	toggle_elements.add(hover_elements).mouseover(function(e){ _this.ClearTimer() });
	toggle_elements.add(hover_elements).mouseout(function(e){ _this.StartTimer(); });

	// очистка таймера
	this.ClearTimer = function() { if (_this.timer) { clearTimeout(_this.timer); _this.timer = false;   } }

	//запуск таймера
	this.StartTimer = function()
	{
		_this.ClearTimer();
		var delay = GetInt(_this.options.delay) ? GetInt(_this.options.delay) : 150;
		_this.timer = setTimeout(function(){ _this.Hide() }, delay);
	}

	// скрытие
	this.Hide = function()
	{
		if(this.state) // Если включен
		{
			// есть свой обработчик?
			if (hide_callback)
			{
				hide_callback(_this); return;
			}
	
			// скрываем по-умолчанию моментально
			toggle_elements.hide();
		}
	}
	
	this.ToggleState = function(is_on)
	{
		this.state = is_on;
	}

	// Для случаев, когда toggle-элементы один, а hover-много
	this.InitHover = function(hover_elements)
	{
		hover_elements.mouseover(function(){ _this.ClearTimer() });
		hover_elements.mouseout(function(){ _this.StartTimer() });
	}
}
//#endregion


//#region SH_Image
function SH_ImageViewerShow(src)
{
	AjaxDlg.EditAuto('/core/ajax/image_viewer_dlg', { 'src' : src })
}


//#endregion

//=========================
//#region pager ajax
function PagerUpdateToAjax(name, object)
{
	$(name).find('a').click(PagerAjaxClick).each(function()
	{
		this.PagerAjaxData = object;
	}).end()
	.find('select[onajax]').attr("onchange", '').unbind('change').change(PagerAjaxChange).each(function()
	{
		this.PagerAjaxData = object;
	});

}
function PagerAjaxChange(e)
{
	eval($(this).attr('onajax'));
	this.PagerAjaxData.start(this, e);
	$(this.PagerAjaxData.cont).load($(this).attr("urlajax"), this.PagerAjaxData.data, this.PagerAjaxData.end);
}
function PagerAjaxClick(e)
{
	this.PagerAjaxData.start(this, e);
	$(this.PagerAjaxData.cont).load($(this).attr("href"), this.PagerAjaxData.data, this.PagerAjaxData.end);
	return false;
}
//#endregion

//=========================
//#region jquery addon
/** Устанавливеет класс name с замещением всех прежних */
jQuery.fn.setClass = function(name)
{
 	return this.each(function()
   	{
		this.oldClass = this.className;
		this.className = name;
	});
};
/** Востанавливает состояние класса до вызова setClass() */
jQuery.fn.restoreClass = function()
{
	return this.each(function()
   	{
		this.className = this.oldClass;
	});
};
/** Устанавливает checkbox в выбранное состояние */
jQuery.fn.check = function()
{
	 return this.each(function() { 
	 	this.checked = true; 
	 	if ($(this).attr('_check_new'))
	 		CheckNew_Click(this);
	 });
}
/** Устанавливает checkbox в невыбнанное состояние */
jQuery.fn.uncheck = function()
{
	 return this.each(function() { 
	 	this.checked = false; 
	 	if ($(this).attr('_check_new'))
	 		CheckNew_Click(this);
	 });
}
/** Переключает состояние checkbox на противоположное */
jQuery.fn.toggleCheck = function()
{
	 return this.each(function() { this.checked = !this.checked; });
}
/** Устанавливает checkbox в состояние checked */
jQuery.fn.setCheck = function(checked)
{
	 return this.each(function() { this.checked = checked; });
}

/** определяет, явлется ли obj обьектом jquery */
jQuery.isJqObject = function(obj)
{
	 return obj.jquery ? true : false;
}
/** переключение состояний
@param $name - имя атрибута
@param $state - значение атрибута, на который нужно переключится. 
Внимание! Знак "!" в конце означает, что при переключении в это состояние нужно сохранить текущую высоту и ширину
@param $std_show - true - для показа использовать show()
иначе - изменять сотсояние display на this.is('td') ? 'block' : 'table-cell'
*/
jQuery.fn.switchTo = function(name, state, std_show, first_siblings)
{
	var items;
	if (first_siblings)
		items = this.find("["+name+"]:first").siblings("["+name+"]");
	else
		items = this.find("["+name+"]");
	
	// Нужно ли сохранять текущую ширину и высоту при смене?
	var keep_size = false;
	
	if (state.indexOf("!") != -1)
	{
		keep_size = true;
		state = state.replace("!", "");
		
		var current_width = this.outerWidth();
		var current_height = this.outerHeight();
	}
	
	items.each(function()
	{
		var _this = $(this);
		var ar = _this.attr(name).split(' ');
		if (in_array(state, ar))
		{
			if (keep_size)
			{
				_this.width(current_width); _this.height(current_height);
			}
				
			if (std_show) _this.show();
			else 
			{
				switch(_this.get(0).tagName)
				{
					case "SPAN":
					_this.css('display', 'inline');
					break;
					
					case "TD":
					_this.css('display', $.browser.msie ? 'block' : 'table-cell');
					break;
					
					case "TR":
					_this.css('display', $.browser.msie ? 'block' : 'table-row');
					break;
					
					default:
					_this.css('display', 'block');
				}
			}
		}
		else _this.hide();
	});
	return this;
}
/** приращение числового значения
@param value - велечина приращения
*/
jQuery.fn.increment = function(value)
{
	this.each(function()
	{
		var old = parseInt(this.innerHTML);
		if (!old) old = 0;
		$(this).html(old + value);
	});
	return this;
}

/** замена класса firstClass на secondClass */
jQuery.fn.replaceClass = function(firstClass, secondClass)
{
	return this.each(function()
   	{
  		var _this = $(this);
		if(_this.hasClass(firstClass)) _this.removeClass(firstClass).addClass(secondClass);
	});
};
/** перезапуск запроса ajax */
jQuery.fn.reAjax = function(oAjax)
{
	if (this.length > 0)
	{
		if (this.get(0).oAjax)	this.get(0).oAjax.abort();
		this.get(0).oAjax = oAjax;
	}
	return this;
};
/** Сабмитит ближайщую форму-родителя */
jQuery.fn.SubmitForm = function(signed_names)
{
	var form = this.closest('form');
	ClearSignedFields(form, signed_names);
	this.closest('form').submit();	
}

/** Возвращает строку, кот. можно выполнить через eval в контексте места вызова 
@param bool is_single_value - Если true, добавляет "return " к строке выполняемому eval 
*/
jQuery.fn.attrEval = function(attr_name, is_single_value)
{
	if (!attr_name)
		return null;

	var value = this.attr(attr_name);
	if (!value)
		return null;

	return EvalReturn(value, is_single_value);
};

//#endregion

//============= Группа Checkbox ============
//#region Группа Checkbox
/** Саязывает checkbox с атрибутоми all и one (одинаковых их значениями) совмесным соответствующим поведением:
при выборе all будут выбраны все соответсткующие one
и на оборот при выборе всех one будет выбран и их all
@static
*/
function initCheckboxes()
{
	$(":checkbox[all]").click(function()
	{
		var st = this.checked;
		$("input[one=" +$(this).attr("all") +  "]").each(function() { this.checked = st; });
	});
	$(":checkbox[one]").click(function()
	{
		var f = true;
		$("input[one=" +$(this).attr("one") +  "]").each(function() { f &= this.checked; });
		$("input[all=" +$(this).attr("one") +  "]").setCheck(f);
	});
}
//#endregion

//============= hover ==================
//#region hover
/** все элементы с атрибутом hover при наведении будут менять класс на значение hover
ко всем элементы с атрибутом hoverall при наведении будут добавлен класс значения hoveradd
@static
*/
function initHover(root)
{
	var root = root ? $(root) : $('body');

	root.find("[hover]").hover(
	  function () {
		$(this).setClass($(this).attr("hover"));
	  },
	  function () {
		$(this).restoreClass();
	  }
	);

	root.find("[hoveradd]").hover(
	  function () {
		$(this).addClass($(this).attr("hoveradd"));
	  },
	  function () {
		$(this).removeClass($(this).attr("hoveradd"));
	  }
	);
}
//#endregion
//==================== END =============

//#region Разное
function SH_InitCurrencyTooltip(container)
{
	container.find("[CY_i]").hover(function (e) { CurrencyCalculationShow(this, 1, e); }, function (e) { CurrencyCalculationShow(this, 0, e); })

	container.find("[CY_origin_i]").hover(function (e) { CurrencyOriginShow(this, 1, e); }, function (e) { CurrencyOriginShow(this, 0, e); })
}

function SH_ChangeLanguage(lang, not_reload)
{
	setCookie("lang", lang, 9000); //console.log(window.location.href.replace('sl=eng', ''));
	var url = window.location.href.replace('sl=eng', '');
	if (!not_reload && window.location.href != url)
	{
		Go(url);
		return;
	}

	if (!not_reload)
		window.location.reload(true);
}

function SH_BagReportShow(show)
{
	var layer = $('div.report_popup').BCH(function(){ SH_BagReportShow(false); });
	layer.toggle(show).ToggleBCH(layer.is(':visible'));
}

function InitBlinking ()
{
	setInterval(function () { $('.blink').toggleClass('hidden_v'); }, 1000);
}

function SH_UserLang(p)
{
	setCookie('ul', p.value, 240);
}
//#endregion

//================= рисование тени =====================================
//#region рисование тени

var dropShadowZindex = 1;  //z-index counter

$.fn.dropShadow = function(options)
{
	// Default options
	var opt = $.extend({
		left: 4,
		top: 4,
		blur: 2,
		opacity: .5,
		color: "black",
		swap: false
		}, options);
	var jShadows = $([]);  //empty jQuery collection

	// Loop through original elements
	this.not(".dropShadow").each(function()
	{
		var jthis = $(this);
		var shadows = [];
		var blur = (opt.blur <= 0) ? 0 : opt.blur;
		var opacity = (blur == 0) ? opt.opacity : opt.opacity / (blur * 8);
		var zOriginal = (opt.swap) ? dropShadowZindex : dropShadowZindex + 1;
		var zShadow = (opt.swap) ? dropShadowZindex + 1 : dropShadowZindex;

		// Create ID for shadow
		var shadowId;
		if (this.id) {
			shadowId = this.id + "_dropShadow";
		}
		else {
			shadowId = "ds" + (1 + Math.floor(9999 * Math.random()));
		}

		// Modify original element
		$.data(this, "shadowId", shadowId); //store id in expando
		$.data(this, "shadowOptions", options); //store options in expando
		jthis
			.attr("shadowId", shadowId)
			.css("zIndex", zOriginal);
		if (jthis.css("position") != "absolute") {
			jthis.css({
				position: "relative",
				zoom: 1 //for IE layout
			});
		}

		// Create first shadow layer
		bgColor = jthis.css("backgroundColor");
		if (bgColor == "rgba(0, 0, 0, 0)") bgColor = "transparent";  //Safari
		if (bgColor != "transparent" || jthis.css("backgroundImage") != "none"
				|| this.nodeName == "SELECT"
				|| this.nodeName == "INPUT"
				|| this.nodeName == "TEXTAREA") {
			shadows[0] = $("<div></div>")
				.css("background", opt.color);
		}
		else {
			shadows[0] = jthis
				.clone()
				.removeAttr("id")
				.removeAttr("name")
				.removeAttr("shadowId")
				.css("color", opt.color);
		}
		shadows[0]
			.addClass("dropShadow")
			.css({
				height: jthis.outerHeight(),
				left: blur,
				opacity: opacity,
				position: "absolute",
				top: blur,
				width: jthis.outerWidth(),
				zIndex: zShadow
			});

		// Create other shadow layers
		var layers = (8 * blur) + 1;
		for (i = 1; i < layers; i++) {
			shadows[i] = shadows[0].clone();
		}

		// Position layers
		var i = 1;
		var j = blur;
		while (j > 0) {
			shadows[i].css({left: j * 2, top: 0});		   //top
			shadows[i + 1].css({left: j * 4, top: j * 2});   //right
			shadows[i + 2].css({left: j * 2, top: j * 4});   //bottom
			shadows[i + 3].css({left: 0, top: j * 2});	   //left
			shadows[i + 4].css({left: j * 3, top: j});	   //top-right
			shadows[i + 5].css({left: j * 3, top: j * 3});   //bottom-right
			shadows[i + 6].css({left: j, top: j * 3});	   //bottom-left
			shadows[i + 7].css({left: j, top: j});		   //top-left
			i += 8;
			j--;
		}

		// Create container
		var divShadow = $("<div></div>")
			.attr("id", shadowId)
			.addClass("dropShadow")
			.css({
				left: jthis.position().left + opt.left - blur,
				marginTop: jthis.css("marginTop"),
				marginRight: jthis.css("marginRight"),
				marginBottom: jthis.css("marginBottom"),
				marginLeft: jthis.css("marginLeft"),
				position: "absolute",
				top: jthis.position().top + opt.top - blur,
				zIndex: zShadow
			});

		// Add layers to container
		for (i = 0; i < layers; i++) {
			divShadow.append(shadows[i]);
		}

		// Add container to DOM
		jthis.after(divShadow);

		// Add shadow to return set
		jShadows = jShadows.add(divShadow);

		// Re-align shadow on window resize
		$(window).resize(function()
		{
			try {
				divShadow.css({
					left: jthis.position().left + opt.left - blur,
					top: jthis.position().top + opt.top - blur
				});
			}
			catch(e){}
		});

		// Increment z-index counter
		dropShadowZindex += 2;

	});  //end each

	return this.pushStack(jShadows);
};


$.fn.redrawShadow = function()
{
	// Remove existing shadows
	this.removeShadow();

	// Draw new shadows
	return this.each(function()
	{
		var shadowOptions = $.data(this, "shadowOptions");
		$(this).dropShadow(shadowOptions);
	});
};


$.fn.removeShadow = function()
{
	return this.each(function()
	{
		var shadowId = $(this).shadowId();
		$("div#" + shadowId).remove();
	});
};


$.fn.shadowId = function()
{
	return $.data(this[0], "shadowId");
};


$(function()
{
	// Suppress printing of shadows
	var noPrint = "<style type='text/css' media='print'>";
	noPrint += ".dropShadow{visibility:hidden;}</style>";
	$("head").append(noPrint);
});

//#endregion

// --------- FLASH map ------------
//#region FLASH map

var SH_geofilter_loaded = false;
var SH_geofilter_extra = false;
function MapInit ()
{

}

function MapShow(show, e, extra_data)
{
	var layer = $("#map").BCH(function(){ MapShow(false, false); }, true);
	var body = $("body");

	SH_geofilter_extra = extra_data ? extra_data : false;

	if (show)
	{
		if (SH_geofilter_loaded)
		{
			//MapInit();
		}
		else
		{
			MapLoad();
		}

		layer.css("top", Math.max(0, body.scrollTop() + ($(window).height() - layer.height()) / 2));
		layer.css("left", body.scrollLeft() + ($(window).width() - layer.width()) / 2);

		layer.fadeIn("fast", function(){ layer.ToggleBCH(true); });
	}
	else
	{
		layer.fadeOut("fast", function(){ layer.ToggleBCH(false); });

	}
}


function MapLoad()
{
	var so = new SWFObject(""+ StaticUrl +"/all/flash/map.swf?rnd=3", "flash_map", 800, 400, 9, "#FFFFFF");
	// so.addParam("wmode", "transparent");
	so.addParam('allowScriptAccess', 'always');
	so.addVariable("v", "1.0");
	so.addVariable("lang", Lang);
	so.addVariable("serverName", "www.promdex.com");

	so.write("map");

	SH_geofilter_loaded = true;

}


function MapDisableOnOff(on)
{
	setCookieAndGo("geofilter_disabled", on, false);
}

function MapReset()
{
	GeoFilterSaveData('', '');
}
//#endregion

//#region GeoFilter
function GeoFilterGetData()
{
	var result = {}
	if (SH_geofilter_extra)
	{
		result.country = SH_geofilter_extra.country;
		result.obl = SH_geofilter_extra.obl;
	}
	else
	{
		result.country = getCookie('geofilter_country');
		result.obl = getCookie('geofilter_obl');
	}

	if (!result.country) result.country = '';

	if (!result.obl) result.obl = '';

	return result;
}

function GeoFilterSaveDataFlash(country_ids, oblast_ids)
{
	GeoFilterSaveData(country_ids, oblast_ids)
}

function GeoFilterCloseFlash()
{
	MapShow(false);
}

function GeoFilterSaveData(country_ids, oblast_ids)
{
	if (!country_ids.indexOf)
		country_ids = array_implode(";", country_ids);

	if (!oblast_ids && !oblast_ids.indexOf)
		oblast_ids = array_implode(";", oblast_ids);

	if (!country_ids) country_ids = '';
	if (!oblast_ids) oblast_ids = '';


	if (SH_geofilter_extra)
	{
		if (SH_geofilter_extra.callback)
		{
			SH_geofilter_extra.callback(country_ids, oblast_ids);
		}
	}
	else
	{
		setCookie("geofilter_country", country_ids, 240);
		setCookie("geofilter_obl", oblast_ids, 240);

		MapDisableOnOff(0);
	}
}

function switchTab(p)
{
	$("[tab]").removeClass("curr_tab");
	var h = $(p).addClass("curr_tab").attr("tab");

	$("[tabblock]").each(function() {
		if ($(this).attr("tabblock") == h)
			$(this).show();
		else
			$(this).hide();
	});
}
//#endregion


//#region Вывод флага для валют

function SH_CyFlagSelectInit()
{
	$(document).ready(function() {
		$('[SH_flag_root]').find('select').each(function()
		{
			SH_CyFlagSelectUpdate(this);
			$(this).change(function () { SH_CyFlagSelectUpdate(this) });
		});
	});

}
function SH_CyFlagSelectUpdate(p)
{
	var root = $(p).closest("[SH_flag_root]");
	var img = root.find("img[SH_flag_img]");
	var sel = root.find("select");
	var value = sel.val();
	if (value)
	{
		img.attr({"src": StaticUrl +"/img/icons/flags/by-cy/"+ value +".gif"});
		img.css({'visibility':'visible'});
	}

}
//#endregion




//#region JFSelect - Выпадающие списки
function JFSelect(id)
{
	this.timer = null;
	this.root = $('table[JFS_root=' + id + ']');
	this.popup = this.root.find('div.' + id).not('.op_selected_name');
	this.arrow = this.root.find('td.arrow');
	if (this.root.length == 0 || this.root.popup == 0) return;
	return this;
}

JFSelect.prototype.InitEvents = function ()
{
	var _this = this;
	this.root.hover(function () { _this.onNodeHover() }, function () { _this.onNodeUnHover() });
}

JFSelect.prototype.onNodeHover = function ()
{
	if (this.timer)
	{
		clearTimeout(this.timer);
		this.timer = null;
	}
	var offset = this.arrow.position().left + this.arrow.width() + 1;
	if($.browser.msie)
	{
		offset -= 1;
		this.arrow.find('div.abs').height('17px');
		this.popup.css('margin-top', '2px');
	}
	else if($.browser.mozilla) offset -= 2; // Мозила к ширине объекта плюсует и бордеры
	var position = offset - this.popup.width();
	this.popup.show().css("left", position);
	this.root.addClass('hovered');
}

JFSelect.prototype.onNodeUnHover = function ()
{
	var _this = this;
	this.timer = setTimeout(function () { _this.hide_options() }, 500);
}

JFSelect.prototype.hide_options = function ()
{
	this.popup.hide();
	this.root.removeClass('hovered');
}

function JFS_postForm(name, key, node)
{
	$("input[name='" + name + "']").val(key);
	$(node).closest("form").submit();
}
//#endregion

//############### ToolTip - BEGIN ##############################################################
//#region ToolTip

function HM_ToolTip_Show (p)
{

	var tooltip = $("div[HM_tooltip]:first").BCH(function(){ HM_ToolTip_Hide(); });

	var image = "";

	var content_obj = $("[HM_tooltip_content]:first");

	// если есть картинка - генерим и тег для неё
	var img_src = $(p).attr('HM_image');
	var image_block = content_obj.find('td[HM_image_block]');
	if (img_src)
	{
		image = '<img src="' + img_src + '" class="icon" />';
		image_block.show();
	}
	else image_block.hide();

	// пичкаем контент
	image_block.html(image);
	var notice_block = content_obj.find('[HM_notice_block]');
	var text_block = content_obj.find('[HM_text_block]');
	var notice, text;
	if(notice = $(p).attr('HM_notice'))
	{
		notice_block.html(notice);
		notice_block.show();
	}
	else notice_block.hide();
	if(text = $(p).attr('HM_text'))
	{
		text_block.html(text);
		text_block.show();
	}
	else text_block.hide();

	// Задание ширины
	var width = $(p).attr('HM_width');
	// "Динамическая" ширина, тянется от контента
	if(width=='dyn') HM_tooltip_width = content_obj.width() + 16;
	else
	{
		HM_tooltip_width = width;
		content_obj.css('width', width - 16);
	}

	HM_tooltip_height = content_obj.height() + 37;

	// устанавливаем ширину подсказки
	tooltip.width ( HM_tooltip_width );

	// выбираем тип шаблона подсказки в зависимости от её расположения
	var template_shell_name = HM_ToolTip_SelectShell (p, tooltip, $(p).attr('HM_force_position') );
	var template_shell = $("[" + template_shell_name + "]");

	// подключаем оболочку
	var shell = $(template_shell);
	var content = content_obj.html();
	shell.find('[HM_content]').html(content);
	tooltip.html(shell.html());

	// Поправка для туллтипов выше, чем задумано
	if(template_shell_name.indexOf('HM_template_shell_up') == 0) tooltip.css('top', $(p).offset().top - tooltip.height() - 20);

	HM_ToolTip_Display($(p).attr('HM_show_delay'));

	var HM_onload = $(p).attr('HM_onload');
	if(HM_onload) eval(HM_onload);
}


function HM_ToolTip_SelectShell (p, tooltip, force_position)
{

	// расстояние от границы подсказки до середины указателя
	var dist_for_pointer = 47;

	// Высота/ширина указателя
	var pointer_size = 15;

	// паддиг подсказки относительно объекта
	var tooltip_padding = 10;


	// паддинг для границ
	var DocWidth = $(window).width();
	var DocHeight = $(window).height();


	// значения координат относительно скролла
	var rel_top = $(p).offset().top - $(document).scrollTop();
	var rel_left = $(p).offset().left - $(document).scrollLeft();


	// проверка (используется только для типов шаблонов "сверху" и "снизу")
	// проверяет расстояние от границы подсказки до указателя, если оно влезает справа или слева на странице
	// в зависимости от шаблона
	var pointer_place = rel_left + $(p).width()/2 < ( DocWidth - dist_for_pointer ) &&
					  ( rel_left + $(p).width()/2 > dist_for_pointer);


	var top = (rel_top - tooltip_padding) > (HM_tooltip_height + tooltip_padding) && pointer_place;

	// специальная проверка шаблонов "сверху" и "снизу" для вида отображения справа - то же самое что и pointer_place,
	// только бОльшое расстояние до указателя
	var vert_right = ( rel_left + $(p).width()/2 ) < ( DocWidth - HM_tooltip_width + dist_for_pointer );


	// проверка для шаблона "справа"
	var right = (rel_left + $(p).width() - tooltip_padding) < ( DocWidth - HM_tooltip_width - tooltip_padding );

	// проверка будет ли влезать сверху подсказка до указателя - нужно как дополнительная проверка для right
	var half_height = (rel_top + $(p).height()/2) > dist_for_pointer + tooltip_padding;

	// проверка для шаблона снизу
	var down = (rel_top + $(p).height() + tooltip_padding) < (DocHeight - HM_tooltip_height - tooltip_padding - pointer_size ) && pointer_place;

	// для шаблона "слева" проверка не нужна т.к. приоритет самый низкий

	var position = force_position ? force_position : false;

	// Проверяем можно ли вывести в заданном положении
	if(position)
	{
		switch(position)
		{
			case 'up_right': if(!(top && vert_right)) position = false; break;
			case 'up_left': if(!top) position = false; break;
			case 'right': if(!(right && half_height)) position = false; break;
			case 'down_right': if(!(down && vert_right)) position = false; break;
			case 'down_left': if(!down) position = 0; break;
		}
	}

	// Выбираем положение по приоритетам
	if(!position)
	{
		if(top) position = vert_right ? 'up_right' : 'up_left';
		else if(right && half_height) position = 'right';
		else if(down) position = vert_right ? 'down_right' : 'down_left';
		else position = 'left';
	}

	var dx, dy;

	switch(position)
	{
		case 'up_right':
		dy = - HM_tooltip_height - tooltip_padding - pointer_size;
		dx = $(p).width()/2 - dist_for_pointer;
		break;

		case 'up_left':
		dy = - HM_tooltip_height - tooltip_padding - pointer_size;
		dx = $(p).width()/2 - HM_tooltip_width + dist_for_pointer;
		break;

		case 'right':
		dy = $(p).height()/2 - dist_for_pointer;
		dx = $(p).width() + tooltip_padding + pointer_size;
		break;

		case 'down_right':
		dy = $(p).height() + tooltip_padding + pointer_size;
		dx = $(p).width()/2 - dist_for_pointer;
		break;

		case 'down_left':
		dy = $(p).height() + tooltip_padding + pointer_size;
		dx = $(p).width()/2 - HM_tooltip_width + dist_for_pointer;
		break;

		default:
		dy = $(p).height()/2 - dist_for_pointer;
		dx = - HM_tooltip_width - tooltip_padding - pointer_size;
		break;
	}

	// устанавливаем позицию подсказки с учетом смещения
	tooltip.css("left", $(p).offset().left + dx);
	tooltip.css("top", $(p).offset().top + dy);

	// возвращаем название шаблона отображения
	return "HM_template_shell_" + position;

}

function HM_ToolTip_Hide ()
{
	var tooltip = $("div[HM_tooltip]:first");
	tooltip.hide().ToggleBCH(false);//.fadeOut("fast");

	HM_ToolTip_AbortShowTimer();
}

function HM_ToolTip_AbortShowTimer ()
{
	var tooltip = $("div[HM_tooltip]:first");
	if (tooltip.data('HM_tooltip_show_timer'))
	{
		clearTimeout(tooltip.data('HM_tooltip_show_timer'));
		tooltip.data('HM_tooltip_show_timer', false)
	}
}

function HM_ToolTip_Display (show_delay)
{
	var tooltip = $("div[HM_tooltip]:first").ToggleBCH(true);
	if (tooltip.is(":visible"))
		return;

	if (!show_delay)
	{
		tooltip.fadeIn('fast');
		return;
	}

	HM_ToolTip_AbortShowTimer();

	tooltip.data('HM_tooltip_show_timer', setTimeout(function(){ tooltip.fadeIn('fast'); }, GetInt(show_delay)))
	//HM_show_delay
}
//#endregion
//############### ToolTip - END ################################################################


//=================================================
// #region массовая рассылка писем предприятиям
function BulkMailing(formName)
{
	var me = this;
	$(document).ready(function()
	{
		$(formName).find(":checkbox[ides]").click(onSelectChanged);
	});
	function onSelectChanged()
	{
		var count = 0;
		$(formName).find(":checkbox[ides]").each(function() { if (this.checked) count++; });
		if (count > 0)
		{
			$(formName).switchTo('check_state', 'send').find('[comp_count]').html(count);
			window.onbeforeunload = me.onWindowUnload;
		}
		else
		{
			$(formName).switchTo('check_state', 'none');
			window.onbeforeunload = null;
		}
	}
	this.onSend = function (form)
	{
		SendMess(form, false);
		return false;
	}
	this.Reset = function()
	{
		var form = $(formName).get(0);
		form.subject.value = '';
		form.text.value = '';
		$(formName).switchTo('main_form', 'initial');
	}
	function SendMess(form, abort)
	{
		var card = $(form);
		
		// список id
		var ides = "";
		card.find(":checkbox[ides]").each(function() { if (this.checked) ides+= "," + $(this).attr('ides'); });
		
		if (ides)
			AjaxDlg.ShowPopup('/mail/ajax/write_feedback_dlg?to_ids=' + ides)
	}
	this.UnSelectAll = function()
	{
		$(formName).find(":checkbox[ides]").uncheck();
		onSelectChanged();
	}


	this.onWindowUnload = function(e)
	{
		if (!e)
			e = event;

		var form = $("#sel_send_messes");
		var checks = form.find("input:checked");
		changed = checks.length > 0;

		if (changed)
			e.returnValue = Msg.bulk_not_send;

		return;
	}
}
//#endregion

//#region мигалка
function JQ_Fading(element)
{
	var tag = element;
	var is_stop = false;



	this.Start = function ()
	{

		is_stop = false;
		Fading (true);
	}

	this.Stop = function ()
	{
		is_stop = true;
	}

	function Fading (state)
	{
		return;
		var lTag = $(tag);
		if (!tag || lTag.css('visibility') == 'hidden')
			return;

		if (!is_stop)
		{
			if (state)
				lTag.fadeTo("slow", 0.3, function () { Fading (false); });
			else
				lTag.fadeTo("slow", 1, function () { Fading (true); });

		}
		else
			lTag.fadeTo("fast", 1, function () { });

	}



}
//#endregion



//#region ShowByHoverTimer - Класс для отображения элемента по таймеру
function ShowByHoverTimer(toggle_el, options)
{
	this.timer = null;
	this.toggle_el = $(toggle_el);
	this.options = options || { };
	var _this = this;
	this.options.hidder_options = this.options.hidder_options || { delay : 300, bind_to_hover : true };

	this.onHover = function(p)
	{
		clearTimeout(this.timer);
		this.timer = setTimeout(function() { _this.Show(p) }, this.options.delay || 100);
	}

	this.onLeave = function()
	{
		clearTimeout(this.timer);
	}

	this.Show = function(p)
	{
		if(this.options.pos_func)
			this.options.pos_func(p, this.toggle_el);
		$(toggle_el).show();
		iHidderInit(this.toggle_el, p, this.options.hide_callback, this.options.hidder_options);
	}
}
//#endregion
 
//#region Tooltip
function ClubTooltipShow(p, layer)
{
	var position = $(p).offset();
	layer.css("top", position.top - layer.height() - 2);
	layer.css("left", position.left + 8);
}

//#region LiveTooltip
var live_tooltip_timer = null;
function LiveTooltipShow(p, show, layer_id, options)
{
	LiveTooltipClearTmr();
	p = $(p);
	var layer = $(layer_id);
	layer.switchTo('state', 'start');

	options = options ? options : { };
	var position = p.offset();

	// Позиционирование
	var left = position.left + 10;
	if(left + layer.width() > $(window).width())
		left = position.left + p.width() - layer.width() - 10;

	var top = position.top - layer.height() - 2;
	if(top < $(document).scrollTop() + $('#dock_menu').height())
		top =  position.top + p.height() + 2;

	layer.css("top", top + (options.top ? options.top : 0));
	layer.css("left", left + (options.left ? options.left : 0));

	var url = p.attr('SH_write_url');
	var pLink = $("#live_write_link");

	if (url)
	{
		pLink.get(0).href = url;
		pLink.show();
	}
	else
	{
		pLink.hide();
	}
	///
	$('#live_write_id').attr('SH_write_id', p.attr('SH_write_id'));
	/*var jabber =
	$chat = $('#live_open_chat');
	if (jabber)
		$chat.show().attr('SH_jabber', jabber);
	else
		$chat.hide();*/
	///

	$("#live_write_id").attr('SH_url_back', p.attr('SH_url_back'));

	layer.show();
	iHidderInit(layer, p, false, { 'delay': 1000, 'bind_to_hover': true });
}

function LiveTooltipClearTmr()
{
	clearTimeout(live_tooltip_timer);
	live_tooltip_timer = null;
}

function LiveTooltipShowTmr(p, show, layer_id, options)
{
	live_tooltip_timer = setTimeout(function() { LiveTooltipShow(p, show, layer_id, options) }, 300);
}

function LiveTooltipShowUsers(p)
{
	var layer = $('#live_tooltip');
	layer.switchTo('state', 'load');

	var $cont = $('#live_write_id');
	var cont = $cont.get(0);
	if (cont.ajax) {
		cont.ajax.abort();
	}

	cont.ajax = $.ajax({
		type: 'POST',
		url: '/live/ajax/users' + "?i=" + Math.floor(Math.random() * 1000000000),
		data: { "id" : $cont.attr('SH_write_id') },
		complete: function(data, status)
		{
			cont.ajax = null;

			if (status == "success")
			{
				$('#live_data_users').html(data.responseText);
				layer.switchTo('state', 'data');
			}
			else
			{

			}
		}
	});

}
//#endregion

// Туллтип для международных закупок
function TenderIntTooltipShow(p, layer)
{
	layer.find('[country_id]').html($(p).attr('country_id'));
	var position = $(p).offset();
	layer.css("top", position.top - layer.height() - 2);
	layer.css("left", position.left + 8);
}
//#endregion


// ---------------- ЗАПРОС ИНФОРМАЦИИ О ЦЕНЕ  -------------------------
//#region ЗАПРОС ИНФОРМАЦИИ О ЦЕНЕ
function SH_product_send_request (p)
{

	var root = $(p).closest("[SH_price_root]");

	root.switchTo("state", "preloader");

	$.ajax({

		type: "POST",
		url: "/product/ajax/prod-request",
		data: { "id" : root.attr("product_id") },

		complete: function(data, status) {

			if (status == 'success') {
				root.switchTo("state", "end");
			}
			else {
				root.switchTo("state", "begin");
				SH_AlertAjaxError();
			}

		}

	});


}

function SH_doc_write(str)
{
	document.write(str);
}


function SH_SetMailCount(count, delta)
{
	var layer = $('#pm_icon')
	var conteiner = layer.find("[pm_c_icon]");
	var digit = layer.find('[pm_count]');

	var p = layer.get(0);
	if (!p)
		return;

	if (delta && !count)
		count = GetInt(digit.html()) + delta;

	if (count > 0)
	{

		digit.html(count);
		conteiner.show();

		//var fader = new JQ_Fading("div#MM2_new_messages");
		//fader.Start();

	}
	else
	{
		digit.html(count);
		conteiner.hide();
	}

}
//#endregion


///////////////// USER INFO BLOCK //////////////////
//#region USER INFO BLOCK
// "Всплывающее" меню в блоке компании
function UIB_SwitchEntBlock(p, force_close)
{
	var root = $(p).closest('.ent_info_block');
	var ib_table = $(p).closest('.info_block');
	var state = root.find('[block_state]:visible').attr('block_state');
	if(state == 'links' && !force_close)
	{
		ib_table.attr('hoveradd', '').addClass('info_block_open').removeClass('info_block_h');
		root.switchTo('block_state', 'profile');
		iHidderInit(root.find('.links_block'), ib_table, function() { UIB_SwitchEntBlock(p, true) });
	}
	else
	{
		ib_table.attr('hoveradd', 'info_block_h').removeClass('info_block_open');
		if(!force_close) ib_table.addClass('info_block_h');
		root.switchTo('block_state', 'links');
	}
}

// Переключение состояния всего блока(свернуть/развернуть)
function UIB_SwitchState(p, state)
{
	var root = $(p).closest('#uib_root');
	var close_icon = root.find('[close_icon]');
	if(state == 'mini') close_icon.hide();
	else close_icon.show();
	root.switchTo('pib_state', state);
	setCookie("rccs", state == 'mini' ? 1 : 0, 1000);
}
//#endregion
////////////////////////////////////////////////////


/////////////SWITCH DISABLED FIELDS/////////////////
//#region SWITCH DISABLED FIELDS
function iSwitchDisableByType (_types, _root)
{
	var types = _types;
	var _this = this;
	var root = _root;

	if (!root)
		root = $(document);

	this.Switch = function (type)
	{

		for (i in types)
		{
			var switcher = $(root).find("[name=type][value="+ type +"]");
			var fields = types[i];

			if (i == type)
			{
				$(switcher).attr("checked", true);
				for(j in fields)
					$(root).find("[name=" + fields[j] +"]").attr('disabled', false);
			}
			else
			{
				for(j in fields)
					$(root).find("[name=" + fields[j] +"]").attr('disabled', true);
			}
		}

	}

}
//#endregion
////////////////////////////////////////////////////


//#region HoverTmr - для всплывающих окон, с задержкой скрытия при onUnhover
function HoverTmr_onHover(p, tnode)
{
	var node = $(p);
	var timer = node.attr('hover_timer');
	if(timer)
	{
		clearTimeout(timer);
		timer = null;
		node.attr('hover_timer', 0);
	}
	tnode.show();
}

function HoverTmr_onUnhover(p, tnode, timeout)
{
	var node = $(p);
	var timer = setTimeout(function () { tnode.hide(); node.attr('hover_timer', 0); }, timeout);
	node.attr('hover_timer', timer);
}

// Плагин для всплывающих окон, с задержкой скрытия при onUnhover
// toggled - селектор всплывающего окна, timeout - пауза до скрытия в миллисекундах
jQuery.fn.HoverTmr = function(toggled, timeout)
{
	var node = $(toggled);
	this.hover(
		function () {
			HoverTmr_onHover(this, node);
	  	},
	  	function () {
			HoverTmr_onUnhover(this, node, timeout);
	  	}
	);
}
//#endregion


//#region DD_List - Класс выпадных списков для /feedback/dropdown_list
function DD_List(root, options)
{
	this.root = $(root);
	this.hlink = this.root.find('.hlink');
	this.current = this.hlink.find('div');
	this.droplist = this.root.find('.droplist');
	this.input = this.root.find('input:hidden');
	this.timer = null;
	this.timeout = options.timeout || 500;
	this.def_text = this.current.html();
	this.is_click = options.hover_show ? false : true;
	this.onChanged = options.onChanged;
	this.onToggle = options.onToggle;
	this.old_state = false;
	this.options = options;
	var _this = this;
	
	ConsoleLog(options);
	if(typeof(options.current) != 'undefined') this.selectByID(options.current, 'init');
	else if (options.def_value) this.input.val(options.def_value);
	

	// Для доступа через инпут
	this.input.data('DD_list', this).data('IValue', this);
	
	this.root.data('IValue', this);
	
	this.root.click(
	  function (event) {
	  		Event_LockChild(event, this, function(){ _this.onClick(); }, {'filter': _this.droplist});
	  }
	);
	this.root.hover(
	  function () {
		_this.onHover();
	  },
	  function () {
		_this.onUnhover();
	  }
	);
	this.root.closest('form').bind("reset", function(){
		_this.selectByID("", 'reset');
	});
}

DD_List.onClickLink_st = function(p) {
	var obj = $(p).closest('[_field_type=DD_List]').data('JsControl');
	obj.onClickLink(p);
}

DD_List.prototype = {

	setHoverShow: function() {
		this.is_click = false;
	},

	onClick: function() {
		if(!this.onToggleHandler()) return false;
		
		if(this.hlink.hasClass('hlink')) this.hlink.replaceClass('hlink', 'hlink_h');
		else this.hlink.replaceClass('hlink_h', 'hlink');
		this.droplist.toggle();
	},

	onHover: function() {
		if (this.timer)
		{
			clearTimeout(this.timer);
			this.timer = null;
		}
		if(!this.is_click)
		{
			if(!this.onToggleHandler()) return false;
			this.hlink.removeClass('hlink').addClass('hlink_h');
			this.droplist.show();
		}
	},

	onUnhover: function() {
		var _this_dd = this;
		this.timer = setTimeout(function () { _this_dd.TimerCB() }, this.timeout);
	},

	TimerCB: function() {
		this.hlink.removeClass('hlink_h').addClass('hlink');
		this.droplist.hide();
		this.onToggleHandler();
	},

	onClickLink: function(p) {
		if (this.timer)
		{
			clearTimeout(this.timer);
			this.timer = null;
		}
		this.TimerCB();
		if($(p).attr('href') == 'javascript:')
		{
			this.selectByID($(p).attr('node_id'), 'click');
		}
	},

	selectByID: function(id, reason) {
		this.droplist.find('[node_id]').removeClass('curr_node');
		var obj = this.droplist.find('[node_id="' + id + '"]');
		if(obj.length && id != '')
		{
			obj.addClass('curr_node');
			this.current.html(obj.html());
			this.input.val_old(obj.attr('node_id'));
			this.hlink.addClass("hlink_on");
		}
		else
		{
			this.current.html(this.def_text);
			this.input.val_old('');
			this.hlink.removeClass("hlink_on");
		}
		if (this.onChanged) this.onChanged(this, reason);
	},
	
	onToggleHandler: function() {
		var state = this.droplist.is(':visible');
		if(state != this.state && this.onToggle)
		{
			if(!this.onToggle(this, state)) return false;
		}
		
		this.state = state;
		
		return true;
	},

	SetValue: function(id) {
		this.selectByID(id, 'set');
	}
}
//#endregion

//////////////////////////////////// GEOFILTER BY UNION ////////////////////////////////////////////
//#region GEOFILTER BY UNION
function SetGeofilterByUnion (id)
{
	$.ajax({

		type: "POST",
		url: "/map/ajax/by_union",
		data: { "id" : id },

		complete: function(data, status){

			if ( status == 'success' )
				GeoFilterSaveData (data.responseText, ''); // countries
			else
				SH_AlertAjaxError();
		}

	});

}
//#endregion
////////////////////////////////////////////////////////////////////////////////////////////////////

// Всплывающий элемент content(jQuery-объект) по центру экрана, с затемнением фона
//#region OverlayLayer
function OverlayLayerShow(content)
{
	var root = $("body");
	var layer = $('<div id="overlay_layer"><table content_block="1" class="content"><tr><td content="1" valign="middle" align="center"></td></tr></table></div>').appendTo("body");
	layer.css( { height : $(document).height(), width : $(document).width() } ).click(function() { OverlayLayerClose() });
	layer.find('[content_block]').css( { height : $(window).height(), width : $(window).width(), top : $('body').scrollTop() } );
	content.clone().appendTo(layer.find('[content]')).click(function(e) { CancelBubble(e) }).filter(':hidden').fadeIn('fast');
}

function OverlayLayerClose()
{
	$("#overlay_layer").fadeOut('fast').remove();
}
//#endregion

//=====================================================

//#region Dock
function DockPanel(root)
{
	var _this = this;
	var old_counts = {};
	this.root = root || '#dock_menu';
	
	this.SetNotReadCount = function (count, type)
	{
		var $p = $(this.root).find('[icon_root='+type+']');
		var $counter = $p.find('[pm_count]');
		
		$counter.html(count > 99 ? '99+' : count);
		$p.find('[pm_c_icon]').toggleClass('hidden_v', count < 1);
		
		$p.find('div.dock_icon:first').toggleClass('dock_icon_nr', count > 0);
		
		if (old_counts[type] != count)
		{
			$('#dock_popups [popup_id=notifications]').removeAttr('is_loaded');			
			old_counts[type] = count;
		}
	}
	this.UpdateUnreadCount = function()
	{
		$(this.root).reAjax($.ajax({
			type: "get",
			url: "/mail/ajax/unread_count",
			dataType: "json",
			cache: false,
			data: { },
			success : function(data)
			{
				if (!data) return;
				//_this.SetNotReadCount(data.notice, 'notifications');
				_this.SetNotReadCount(GetInt(data.mail) + GetInt(data.notice), 'mail');				
			}
		}));
	}
	function BeginLoadNotifications()
	{
		var $pp = $('#dock_popups [popup_id=notifications]');
		
		$pp.reAjax($.ajax({
			type: "get",
			url: "/notification/ajax/dock_list",
			dataType: "json",
			cache: false,
			data: { read: $pp.is(":hidden")? '0' : '1' },
			success : function(data)
			{
				if (!data) return;
	
	
				if (data.count == 0)
					$pp.switchTo('state', 'none');
				else
				{
					$pp.switchTo('state', 'data').find('[items_root]').empty();//очищаем список
	
					_this.SetNotReadCount(data.not_read_count, 'notifications');
					$.each(data.cards, function (k, v) {
						AddNotification(v.text, v.url, v.date, v.read=='0');
					});
				}
				$pp.attr('is_loaded', '1')//ставим статус - загружен
			}
		}));
	}
	function BeginLoadMails()
	{
		var $pp = $('#dock_popups [popup_id=mail]');
		
		$pp.reAjax($.ajax({
			type: "get",
			url: "/mail/ajax/dock_list",
			dataType: "json",
			cache: false,
			data: { },
			error: function(xhr, status){ ConsoleLog(xhr); },
			success : function(data)
			{
				if (!data) return;
	
				if (data.count == 0)
					$pp.switchTo('state', 'none');
				else
				{
					$pp.switchTo('state', 'data').find('[items_root]').empty();//очищаем список
	
					_this.SetNotReadCount(data.not_read_count, 'mail');
	
					$.each(data.cards, function (k, v) {
						//AddMail(v.subject, v.url, v.date, v.read=='0', v.files_count);
						AddMail(v);
					});
				}
				$pp.attr('is_loaded', '1')//ставим статус - загружен
			}
		}));
	}
	this.IconClick = function(p)
	{
		var icon = $(p).closest('div.icon_root');
		var is_toggle = icon.hasClass('icon_root_on');
		var id = $(p).attr('icon_root');
		ClosePopups();
		
		if(!is_toggle)
		{
			$('#dock_menu table[icons_root]').BCH(function(){ ClosePopups(); }).ToggleBCH(true);
			icon.addClass('icon_root_on');
			var $pp = $('#dock_popups').find('[popup_id=' + id + ']').show();
	
			if (id == 'notifications' && !$pp.attr('is_loaded'))
				BeginLoadNotifications();
			else if (id == 'mail' && !$pp.attr('is_loaded'))
				BeginLoadMails();
		}
	}
	
	this.IconHover = function(p, is_hover)
	{
		var root = $(p).closest('[icons_root]');
		root.find('.dock_icon').removeClass('dock_icon_h');
		if(is_hover) $(p).find('.dock_icon').addClass('dock_icon_h');
	}
	
	// Добавление пунктов в попап уведомлений
	function AddNotification(name, url, date, is_new)
	{
		var tpl = $('#jab_templates [mail_tpl]').clone();
		var dest = $('#dock_popups [popup_id=notifications] [items_root]');
		tpl.find('[link]').attr('href', url).html(name).addClass(is_new ? 'bold' : 'a_nu');
		tpl.find('[date]').html(date);
		tpl.appendTo(dest).click(function() { Go(url) }).hover(
	  		function () {
				$(this).addClass('hover_node');
	  		},
	  		function () {
				$(this).removeClass('hover_node');
		 	}
			);
	}
	
	// Добавление пунктов в попап почты
	function AddMail(/*name, url, date, is_new, file*/card)
	{
		var tpl = $('#jab_templates [mail_tpl]').clone();
		var dest = $('#dock_popups [popup_id=mail] [items_root]');
		var tt=tpl.find('[link]');
		tt.attr('href', card.url);
		tt.html(card.subject);
		tt.addClass(card.read == '0' ? 'bold' : 'a_nu');
		tpl.find('[date]').html(card.date);
		if(card.files_count) tpl.find('[file_icon]').removeClass('hidden');
		if(card.type) tpl.find('[mail_type]').removeClass('hidden').html(card.type);
		if(card.from_user_name)
		{
			var info_root = tpl.find('td[from_info]').removeClass('hidden');
			info_root.find('a[user_link]:first').attr('href', card.from_user_url).html(card.from_user_name);
			info_root.find('a[ent_link]:first').attr('href', card.from_ent_url).html(card.from_ent_name);
			info_root.find('span[ent_line]:first').showHide(card.from_ent_name ? true : false);
		}
		dest.closest('[popup_id]').switchTo('state', 'data');
		tpl.appendTo(dest).click(function(event) { Go_LockChild(event, card.url, 'a'); }).hover(
	  		function () {
				$(this).addClass('hover_node');
	  		},
	  		function () {
				$(this).removeClass('hover_node');
		 	}
		);
	}
}

function ClosePopups()
{
	$('#dock_menu [icons_root]').ToggleBCH(false).find('div.icon_root').removeClass('icon_root_on');
	$('#dock_popups').find('[popup_id]').hide();
}
//#endregion

// Новый оверлей, с позиционированием самого объекта
//#region RelativeOverlay
function sbWidth()
{
	if(window._sb_width === undefined)
	{
		var t = $("#sb-layer");
		if(!t.length)
		{
			t = $('<div><div style="height: 75px;">1<br>1</div></div>')
				.css({
				 	overflowY: 'scroll',
				 	position: 'absolute',
				 	width: '50px',
				 	height: '50px'
				}).appendTo("body");
		}
		var t_el = t.get(0);
		window._sb_width = t_el.offsetWidth - t_el.firstChild.offsetWidth - 1;
		t.remove();
	}
  	return window._sb_width;
}

// Задает ширину контенту, независимо от наличия скролла
function onBodyResize(force) 
{
	var w = window, de = document.documentElement;
	var pageNode = $("div.scroll_fix:first");
	var bodyNode = $("body");
	var overlayNode = $(w._overlay);
	var overlayWrap = overlayNode.find("table.wrap:first");
	var overlayBG = $("#overlay_bg");
	var dock = $("#dock_menu");
	var wwidth = GetInt($(w).width());
	var wheight = GetInt($(w).height());
	var dwidth = Math.max(GetInt(w.innerWidth), GetInt(de.clientWidth), bodyNode.width());
	var dheight = Math.max(wheight, GetInt(de.clientHeight), $(pageNode).height());
	var sbw = sbWidth();
	
	// Есть ли скролл у страницы
	var scroll_fix = 0;
	if(($.browser.msie ? dheight : $(document).height()) > wheight) scroll_fix = sbw + 1;
	
	//ConsoleLog(scroll_fix);
	
	// Магическое ослиное число)
	if($.browser.msie) dwidth -= 4;
  
	if (w.lastWindowWidth != wwidth || force === true)
	{
		w.lastWindowWidth = wwidth;
	
		// Если оверлей шире документа
		if (wwidth < overlayWrap.find("td:first").children(":first").width() + sbw + 1)
			dwidth = overlayNode.width() + sbw + 1;
		
		if (dwidth) 
		{
			pageNode.width(dwidth - scroll_fix);
			overlayNode.width(dwidth);
			overlayBG.width(dwidth);
			dock.width(dwidth - scroll_fix);
			overlayWrap.width(dwidth - sbw - 1);
		}
		
		// Закрашиваем "дырку" в доке)
		if(w._overlay)
		{
			if(scroll_fix > 0 && dock.length && dock.css('position') == 'fixed')
				overlayBG.addClass("dock-fix").css("background-position", dwidth - sbw - 1 + 'px top');
			else
				overlayBG.removeClass("dock-fix");
		}
	}
	if (w.lastWindowHeight != wheight || force === true)
	{
		w.lastWindowHeight = wheight;
		overlayBG.height($(document).height());
		overlayNode.height(wheight);
		overlayWrap.height(wheight);
	}
}
/** 
@param mix $content - 
@param mix $options - 
@static
*/
function RelativeOverlayShow(content, options)
{
	var w = window;
	var options = options || { };
	var content_block = $(content);
	w._overlay_options = options;
	// Если уже что-то есть - закрываем
	if(w._overlay) RelativeOverlayClose();
	
	// Создаем слой с бекграундом
	var overlay_bg = $("#overlay_bg");
	if(!overlay_bg.length)
		overlay_bg = $('<div id="overlay_bg"><img src="/@/main/_img_/0.gif"></div>').appendTo("body");
		
	// Задаем класс для пелены
	if(options.bg_class === false)
		overlay_bg.setClass("bg_none");
	else
		overlay_bg.setClass(options.bg_class || "overlay_bg_gray");

	// Если еще нет оверлея
	var overlay = content_block.parents("div:first");
	if(!overlay.hasClass("overlay_layer"))
	{
		content_block.wrap('<div class="overlay_layer"><table class="wrap"><tr><td class="overlay_pad" align="center"></td></tr></table></div>');
		overlay = content_block.parents("div.overlay_layer:first");
		content_block.show();
	}
	
	

	// Позиционируем absolute в ИЕ
	if($.browser.msie) overlay.css("top", $(document).scrollTop());
	
	w._overlay = overlay;
	
	onBodyResize(true);

	

	
	// Ограничиваем экран, сохраняем дефолтный overflow
	if(!w._def_overflow)
	{
		w._def_overflow = { };
		var overflow_y = $("body").css("overflow-y");
		if($.browser.msie && overflow_y == "scroll") overflow_y = "auto";
		w._def_overflow["overflow-x"] = $("body").css("overflow-x");
		w._def_overflow["overflow-y"] = overflow_y;
	}
	$('body').css({ "overflow-x" : "hidden", "overflow-y" : "hidden" });

	// Отображаем
	$("#overlay_bg").fadeInUni('fast');
	overlay.fadeInUni('fast', function(){
		// Не закрывать оверлей при клике по контенту
		content_block.BCH(function() { RelativeOverlayClose(); });
		// Закрывать по клику вне блока, если не no_bch
		content_block.ToggleBCH(!options.no_bch);
	});
}

function Overlay_onClose()
{
	$('body').css(window._def_overflow);
	if(window._overlay) window._overlay.unbind("click");
	$("td.overlay_pad:first", _overlay).children(':first').ToggleBCH(false);
	window._overlay = false;
	onBodyResize(true);
}
/** @static */
function RelativeOverlayClose()
{
	if(!window._overlay) return false;
	//событие закрытия Overlay
	if (window._overlay_options.onClose)
		if (window._overlay_options.onClose() === false) return;
		
	if($.browser.msie)
	{
		$("#overlay_bg").hide();
		window._overlay.hide();
		Overlay_onClose();
	}
	else
	{
		$("#overlay_bg").hide();
		window._overlay.fadeOut('fast', function() {
			Overlay_onClose();
		});
	}
}
//#endregion


//#region jQuery.val - Заменяет стандартный jQuery.val() (Перемещает в val_old)
jQuery.fn.val_old = jQuery.fn.val;
jQuery.fn.val_typed = function (value)
{
	var p = $(this[0]);

	// Типизированные значения
	if (p.attr("_value_type") == "int")
	{
		return GetInt(value);
	}

	return value;
}
jQuery.fn.val = function(value)
{
	var p = $(this[0]);
	
	if (!this[0] || !p.length)
		return $(this).val_old.apply(jQuery, arguments);

	// Типизированные значения
	if (p.attr("_value_type") == "int" && value != undefined)
	{
		value = GetInt(value);
	}

	// !! Пока что jQuery некорректно возвращает значение галочки
	if (p.is(":checkbox"))
	{
		if (value == undefined)
			return p.val_typed(p.is(":checked") ? p.val_old() : "");
		else
		{
			p.setCheck(value);
			return this;
		}		
	}

	// Если поле - это DD_list, ListBox, Check3Box, ...?
	if (value != undefined && p.data('IValue'))
	{
		p.data('IValue').SetValue(value, p);
	}
	
	// Если "стилизированый" checkbox, то меняем checked, вместо value
	if (value != undefined && p.attr("_check_new"))
	{
		p.get(0).checked = value != false;
		CheckNew_Click(p);
		return this;
	}
	
	if (!p.attr("_sign"))
	{
		if (value == undefined)
			return p.val_typed(this.val_old());
		else
			return this.val_old(value);
	}

	// Получаем или устанавливаем значение?
	if (value == undefined)
	{
		// Значение поля
		return p.val_typed(p.attr("_sign") == p.val_old() ? "" : p.val_old());
	}
	else
	{
		// Новое значение
		p.val_old(value || p.data("_in_focus") ? value : p.attr("_sign"));

		// Визуализация
		SignedFieldSetState(p);

		return this;
	}

}
//#endregion


//#region Signed Fields (поле с вывеской)
/** Визуализация */
function SignedFieldSetState(p)
{
	// Меняем css-класс
	if (p.attr("_sign_class"))
	{
		var const_css = p.attr("_sign_const_class")

		if (p.attr("_sign") == p.val_old())
			p.setClass(p.attr("_sign_class"));
		else
			p.setClass(p.attr("_sign_normal_css"));
	}
}

function SignedFieldOnFocus(p)
{
	var el = $(p);
	el.data("_in_focus", true);

	if (el.attr("_sign") == el.val_old())
		el.val("");
	else
		SignedFieldSetState(el);


}

function SignedFieldOnBlur(p)
{
	var el = $(p);
	if (!el.val())
		el.val(el.attr("_sign"));

	el.data("_in_focus", false);
}
/** @static */
function ClearSignedFields(form, names)
{
	form = $(form);
	form.find("input[_sign],textarea[_sign]").each(function()
	{
		if (names && !in_array(this.name, names)) return;
		var el = $(this);
		if (el.attr("_sign") == el.val_old())
			el.val_old("");
	});
}

//#endregion

// Отображает окошко с вопросом text, и кнопками Да/Нет/Отмена
//#region Confirm
function ConfirmClass(text, callback)
{
	var block = $('#shell_confirm_popup');
	block.find('[text_block]').html(text);
	block.data('obj', this);
	RelativeOverlayShow(block, { no_bch : true });

	this.onClick = function(p)
	{
		var ans = $(p).attr('answer');
		callback(ans);
		RelativeOverlayClose();
	}
}

function ConfirmButtonClick(p)
{
	$(p).closest('#shell_confirm_popup').data('obj').onClick(p);
}
//#endregion


//#region SH_Register
// Функции для блоки дополнительных контактов
function SH_RegisterShowCntAdder(p)
{
	var popup = $(p).closest('td').find('.adder_block').show();
	iHidderInit(popup, p, false, { delay : 500 });
}

function SH_RegisterToggleContact(p, show)
{
	var root = $(p).closest('#contacts_block');
	var adder_link = root.find('[adder_link]');
	if(show)
	{
		var type = $(p).attr('contact');
		var field = root.find('[contacts=' + type +']').show();
		$(p).hide();
		root.find('.adder_block').hide();
		if(!root.find('[contacts]:hidden').length) adder_link.hide();
	}
	else
	{
		var field = $(p).closest('[contacts]').hide();
		var type = field.attr('contacts');
		root.find('.adder_block a[contact=' + type + ']').show();
		adder_link.show();
	}
	field.find('input').get(0).disabled = !show;
}
//#endregion


//#region Разное

// Переключалка с hover`ом
function ItemsSwitcher(root_id)
{
	this.root = $(root_id);
	var items = this.root.find('.item');
	var _this = this;
	items.hover(function() { _this.onHover(this, true) }, function() { _this.onHover(this, false) });
	items.click(function() { _this.onClick(this) });

	this.onHover = function(p, is_hover)
	{
		if($(p).hasClass('item_curr') || $(p).hasClass('item_disabled')) return false;
		if(is_hover) $(p).replaceClass('item_common', 'item_hover');
		else $(p).replaceClass('item_hover', 'item_common');
	}

	this.onClick = function(p)
	{
		if($(p).hasClass('item_curr') || $(p).hasClass('item_disabled')) return false;
		this.root.find('.item').replaceClass('item_curr', 'item_common');
		$(p).addClass('item_curr').removeClass('item_common item_hover');
	}
}
// callback для выпадных списков, меняющий класс оного, в зависимости от значения
function SignedDD_onChange(obj)
{
	if(obj.input.val()) obj.root.replaceClass('signed_dd_off', 'signed_dd_on');
	else obj.root.replaceClass('signed_dd_on', 'signed_dd_off');
}


function SH_SubmitAndGo(form, url)
{
	form = $(form).closest("form");
	if (form.length == 0)
		return;
	$(form[0].url_back).val(url);

	form.submit();
}
/** Очищает все поля ввода внутри элемента root
@param JQuery root - корневой элемент
@param bool free_hidden - Очищать ли скрытые поля ввода
@param array names - список названий полей, которые нужно очистить
@static
*/
function ClearForm(root, free_hidden, names)
{
	var root = $(root);
	var $fields = root.find('input,textarea,select');
	$fields = $fields.filter(':not(:checkbox):not(:radio)' + (free_hidden ? '' : ':not([type=hidden])'));
	if (names)
	{
		$fields.each(function(){
			if (in_array(this.name, names))
				$(this).val('');
		});
	}
	else $fields.val('');
	
	if (names)
	{
		root.find(':checkbox').each(function() {
			if (in_array(this.name, names))
			this.checked = false;
		});
	}
	else root.find(':checkbox').uncheck();
	
	//ClearSignedFields(root, names);
}
//#endregion


//#region Механизмы JS-контролов
var JsControlInitQueue = [];

jQuery.fn.InitJsControl = function ()
{
	var p = this;

	// Документ еще не загружен, ставим в очередь
	if (!is_document_ready)
	{
		JsControlInitQueue.push(p);
		return true;
	}


	var root = $(p).closest("[_field_type]");
	if (root.length == 0) return false;

	// Проверка на повторную инициализацию
	if (root.data("JsControl")) return false;
	
	// Нужно сначала инициализировать вложенные?
	//if (root.attr('[_field]'))

	try
	{
		// options
		var js = root.find("textarea[_options="+ root.attr("_field_type") +"]").val();
		var options = {};
		if (js && js != "")
		{
			// Убираем случайную запятую в конце
			js = "options = {"+ js.replace(/[,\s]+$/g, "") + "};";
			eval(js);
		}

		// Создаем объект
		eval("var obj = new "+ root.attr("_field_type") + "(root, options);")

		// Привязываем к ДОМу
		root.data("JsControl", obj)

		// callback
		var _this = obj;
		eval(root.attrEval("oninit"));
	}
	catch(ex)
	{
		ConsoleDir(ex);
		return false;
	}

	return true;
}

/** Находит ближайший родительский JsControl элемент */
jQuery.fn.getJsControl = function (type)
{
	var _this = $(this).closest("[_field_type" + (type ? "=" + type : "") + "]");
	if (_this.length == 0)
		return null;

	return _this.data("JsControl");
}

/** Находит корневой элемент JsControl с заданным именем */
jQuery.fn.findJsControlRoot = function (name, any)
{
	var p = $(this);
	var list = false;

	if(any)
		return p.find("table[_field_name=" + name + "]:first,div[_field_name=" + name + "]:first,span[_field_name=" + name + "]:first").filter(':first');

	list = p.find("table[_field_name=" + name + "]:first");
	if (list.length > 0) return list;

	list = p.find("div[_field_name=" + name + "]:first");
	if (list.length > 0) return list;

	list = p.find("span[_field_name=" + name + "]:first");
	if (list.length > 0) return list;

	return list;
}
/** Находит JsControl с заданным именем */
jQuery.fn.findJsControl = function (name)
{
	var root = this.findJsControlRoot(name);
	if (root && root.length > 0) return root.data("JsControl");
	return null;
}

// Флаг загруженности страницы
var is_document_ready = false;
$(document).ready(function()
{
	// Устанавливаем флаг
	is_document_ready = true;

	// Инитим все js-контролы
	$(JsControlInitQueue).each(function()
	{
		$(this).InitJsControl();
	});

});

//#endregion


//#region Позиционирование
/** возвращает координаты для отображения элемента по центру экрана
если direction не задан, возвращается массив: {"left" : .., "top": }
если задан - то соответсвенно само значение (left, top)
Учитывает высоту Док и смещает соотвественно
если width или height незаданы то берутся значения this.width() или this.height() соответственно
*/
jQuery.fn.getCenter = function(direction, width, height)
{
	var body = $("body");

	var dock = $("#dock_menu");
	var pos = {
		"left"	: body.scrollLeft() + ($(window).width() - (width ? width : this.width())) / 2,
		"top"	: body.scrollTop() + ($(window).height() - dock.height() - (height ? height : this.height())) / 2 + dock.height()
	};

	if (direction)
		return pos[direction];

	return pos;

};
//#endregion

// AJAX-контрол для настройки вывода карточек на главную
function ES_ajax_on_main(p, on_main)
{
	var root = $(p).closest("[ES_ajax_on_main]");
	var id = root.attr("ES_ajax_on_main");
	var module = root.attr("module");

	root.switchTo("on_main", "preloader");

	$.ajax({

		type: "POST",
		url: "/entsite/blocks/ajax/on_main/" + module + ".html",
		data: { "id" : id, "on_main" : on_main },

		complete: function(data, status) {
			if (status == 'success') root.switchTo("on_main", on_main ? "on" : "off");
			else root.switchTo("on_main", on_main ? "off" : "on");
		}

	});
}

// Обработчик события, с блокировкой дочерних элементов по фильтру
function Event_LockChild(event, p, callback, options)
{
	var options = options || { };
	var filter = options.filter || '.noclick';
	var target = event.target || event.srcElement;
	if (callback && !$(target).is(filter) && !$(target).closest(filter).length) callback(p);
}
// -- // -- с переходом по адресу
function Go_LockChild(event, url, filter)
{
	 Event_LockChild(event, false, function() { Go(url) }, { filter : filter })
}



//#region iHoverShow - интерфейс для всплывалок при наведении с таймером
function iHoverShow()
{
	var _this = this;
	this.unique_elements = { };

	this.Add = function(p, event, options)
	{
		var el = $(p);
		if(!el.data('_hs_options'))
		{
			var _hs_options = object_merge(options || { });
			el.bind('mouseout',
				function() { _this.ClearTimer(this) }
			);

			if(options.popup_root)
				_hs_options.popup_el = el.closest(options.popup_root).find(options.popup_filter).get(0);
			else
				_hs_options.popup_el = $('body').find(options.popup_filter).get(0);

			if(_hs_options.unique)
			{
				if(!this.unique_elements[_hs_options.unique])
					this.unique_elements[_hs_options.unique] = [];

				this.unique_elements[_hs_options.unique].push(p);
			}
			
			_hs_options.hidder = iHidderInit(_hs_options.popup_el, p, function() { _this.Hide(p, event); }, { delay : _hs_options.hide_delay, bind_to_hover : _hs_options.bind_to_hover });
			if (_hs_options.bind_to_hover)
				_hs_options.hidder.ClearTimer();
				
			el.data('_hs_options', _hs_options);
		}

		this.onHover(p, event);
	}

	this.ClearTimer = function(p)
	{
		var timer = $(p).data("_hs_timer");
		if(timer)
		{
			clearTimeout(timer);
			$(p).data("_hs_timer", false);
		}
	}

	this.onHover = function(p, event)
	{
		var timer = $(p).data("_hs_timer");
		var options = $(p).data("_hs_options");
		if(!timer && !options.disabled)
		{
			timer = setTimeout(function() { _this.Show(p, event); }, options.show_delay || 30);
			$(p).data("_hs_timer", timer);
		}
	}

	this.Show = function(p, event)
	{
		var options = $(p).data("_hs_options");
		if (!options) return;
		if(!options.disabled)
		{
			if(options.unique)
			{
				var unique_els = this.unique_elements[options.unique];
				for(var el in unique_els)
					if(unique_els[el] != p) this.Hide(unique_els[el], event);
			}
		
			if(options.show_func) options.show_func(p, event, options.popup_el);
			else $(options.popup_el).show();
	
		}
	}

	this.Hide = function(p, event)
	{
		var options = $(p).data("_hs_options");
		if (!options) return;
		if (options.hide_func) options.hide_func(p, event, options.popup_el);
		else $(options.popup_el).hide();
	}
	
	this.GetHidder = function(p)
	{
		var options = $(p).data("_hs_options");
		if (!options) return undefined;
		return options.hidder;
	}
}
$$.iHoverShow = new iHoverShow();
//#endregion

//#region InfoBar
var EIB_options = {
	show_delay : 70,
	hide_delay : 300,
	popup_root : '.ent_info_bar',
	popup_filter : '.eib_popup',
	unique : 'ent_info_bar',
	show_func : function(p) {
		EIB_toggle(p);
	},
	hide_func : function(p) {
		EIB_toggle(p, true);
	}
};

function EIB_toggle(p, hide)
{
	var root = $(p);
	var popup = root.find("div.eib_popup");
	var top_cut = popup.find('.top_cut');
	var btm_cut = popup.find('.btm_cut');
	var cut = top_cut;
	if(hide)
	{
		if($.browser.msie) popup.hide();
		else popup.fadeOut("fast");
		root.removeClass('eib_hover');
	}
	else if(popup.is(':hidden'))
	{
		var pos = root.offset();
		var popup_h = popup.height();
		
		// Проверяем, на родителя AjaxDlg
		var is_dlg = root.data('_is_dlg');
		if(is_dlg == undefined)
		{
			is_dlg = root.closest('#AjaxDlgLayer').length > 0;
			root.data('_is_dlg', is_dlg);
		}
		
		var dlg_scrool = is_dlg ? root.closest('div.overlay_layer').scrollTop() : 0;
		var body_scroll = $('body').scrollTop();
		
		root.addClass('eib_hover');
		var top = pos.top + root.height() + dlg_scrool - (is_dlg ? body_scroll : 0);
		var left = pos.left;
		var cut_left = Math.min(root.width() / 2, popup.width() / 2);
		
		if(left + popup.width() > $(window).width())
		{
			var r_fix = root.width() - popup.width();
			left += r_fix;
			cut_left -= r_fix
		}
		
		if(top + popup_h + 2 > (is_dlg ? dlg_scrool : body_scroll) + $(window).height())
		{
			top -= popup_h + root.height();
			top_cut.hide();
			cut = btm_cut.show();
		}
		else
		{
			top_cut.show();
			btm_cut.hide();
		}
		
		cut.css('left', cut_left - GetInt(cut.css('width')) / 2);
			
		popup.css({ 'left' : left, 'top' : top });

		if($.browser.msie) popup.show();
		else popup.fadeIn("fast");
		//iHidderInit(popup, root, function() { EIB_toggle(p, true); }, { delay : 300 });
	}
}

function UserLink_onClick(p)
{
	var link = $(p);
	var links_root = link.closest('.user_buttons');
	var curr_state = links_root.find('[state_block]:visible').length;

	if(!curr_state && !link.is('[hr_line]'))
	{
		links_root.addClass('buttons_active');
		var new_state = link.attr('state_icon');
		var cb = links_root.find('td[state_block=' + new_state +']');
		var cb_content = cb.find('div:first');
		var close_link = links_root.find('[close_button]');
		links_root.find('td:not([state_icon=' + new_state + '])').hide();
		cb_content.width(1);
		cb.show();
		cb_content.animate({ width : '+125' }, 'fast', false, function() { close_link.show(); });
	}
	else
	{
		if(link.is('[close_button]'))
		{
			links_root.find('td').hide();
			links_root.find('td[state_icon],td[hr_line]').show();
			links_root.removeClass('buttons_active');
		}
		else
		{
			var js_code = links_root.find('td[state_block]:visible').attr('click_code');
			if(js_code) eval(js_code);
		}
	}
}
//#endregion

//#region jQuery.fn.setHover - inline-аналог initHover()
function hoverClass(p, options)
{
	var _this = this;
	this.on = true;
	this.options = options || { };
	this.el = $(p);
	this.el.bind('mouseleave', function() { _this.onUnhover(); });
	if(this.options.bind_hover) this.el.bind('mouseover', function() { _this.onHover(); });

	this.onHover = function()
	{
		if(this.on)
		{
			if(this.options.set_class)
				this.el.setClass(this.options.set_class);
			else if(this.options.add_class)
				this.el.addClass(this.options.add_class);
		}
	}

	this.onUnhover = function()
	{
		if(this.options.set_class)
			this.el.restoreClass();
		else if(this.options.add_class)
			this.el.removeClass(this.options.add_class);
	}

	this.Disable = function() { this.on = false; this.onUnhover(); }
	this.Enable = function() { this.on = true; }
}

jQuery.fn.setHover = function(options)
{
 	return this.each(function()
   	{
		var obj = $(this).data('_hoverClass');
		if(obj) obj.onHover();
		else
		{
			obj = new hoverClass(this, options);
			if(!options.bind_hover) obj.onHover();
			$(this).data('_hoverClass', obj);
		}
	});
};

function IEHover(p, add_class)
{
 	$(p).each(function() {
		if($.browser.msie && $.browser.version < 9) $(this).setHover({ 'add_class': add_class });
	});
};

//#endregion

//#region fadeInV / Out

jQuery.fn.fadeInV = function(duration, callback)
{
	this.css("opacity", 0);
	this.css("visibility", "visible");
	this.animate({"opacity": 1}, duration, callback);
};

jQuery.fn.fadeOutV = function(duration, callback)
{
	this.animate({"opacity": 0}, duration, function(){ this.css("visibility", "hidden"); if (callback) callback() });
};

jQuery.fn.fadeInOutV = function(show, duration, callback)
{
	if (show)
		this.fadeInV(duration, callback);
	else
		this.fadeOutV(duration, callback);
};
//#endregion

//#region showV / hide

jQuery.fn.showV = function()
{
	return this.css("visibility", "visible");
};

jQuery.fn.hideV = function()
{
	return this.css("visibility", "hidden");
};

jQuery.fn.showHideV = function(show)
{
	if (show)
		return this.showV();
	else
		return this.hideV();
};

//#endregion


jQuery.fn.showHide = function(show)
{
	/* Что это было вообще? O_o */
	return this.toggle(show != 0);
};

function DisableEnterKey(e)
{
	if (!e && window.event)
		e = event;

	if (!e)
		return;

	if (e.keyCode == 13)
		return PreventDefault(e);

	return true;
}

//#region Текстовый туллтип
function _TextTooltips()
{
	this.tooltip = $('#text_tooltip');
	this.cb = this.tooltip.find(".tt_content");
	this.arr_top = this.tooltip.find(".top_cut");
	this.arr_btm = this.tooltip.find(".bottom_cut");
	this.tt_height = 31; // jQuery.height() не работает на скрытом слое :(
	this.def_overflow = $('body').css('overflow-x');
	var _this = this;
	
	this.tooltip.BCH(function(){ _this.Hide(); }, true);
	
	this.SwitchArrow = function(arr_id)
	{
		if(arr_id == "top")
		{
			this.arr_btm.addClass("hidden");
			this.arr_top.removeClass("hidden");
		}
		else
		{
			this.arr_top.addClass("hidden");
			this.arr_btm.removeClass("hidden");
		}
	}
	
	this.Reposition = function(p)
	{
		var root_pos = $(p).offset();
		var tt_width = this.tooltip.outerWidth();
		var root_width = $(p).outerWidth();
		
		var left = root_pos.left + root_width / 2 - tt_width / 2;
		var top = root_pos.top - this.tt_height;
		this.cb.css("left", 0);
		
		if(top - 2 < $(document).scrollTop())
		{
			top = root_pos.top + $(p).outerHeight();
			this.SwitchArrow("top");
		}
		else
			this.SwitchArrow("btm");
			
		if(left < 0)
			this.cb.css("left", Math.abs(left) + 2);
		else if(left + tt_width + 2 > $(window).width())
		{
			this.cb.css("left", $(window).width() - (left + tt_width + 2));
			$("body").css("overflow-x", "hidden");
		}
			
		this.tooltip.css({ "top" : top, "left" : left });
	}
	
	this.Show = function(p)
	{
		var text = $(p).attr("_tt_text");
		if(!text || $(p).is(':hidden')) return false;
		
		this.cb.html(text);
		this.Reposition(p);
		this.tooltip.show().ToggleBCH(true);
	}
	
	this.Hide = function(p)
	{
		this.tooltip.hide().ToggleBCH(false);
		$("body").css("overflow-x", this.def_overflow);
	}
	
	this.ReplaceText = function(p, text)
	{
		var el = $(p);
		if(text && el.attr("_tt_text")) el.attr("_tt_text", text);
	}
}
//#endregion

//#region Замочек с выбором уровня доступа
function AccessControl(root, options)
{
	this.root = $(root);
	var _this = this;
	this.options = options || { };
	this.button = this.root.find(".button");
	this.list = this.root.find(".modes-list");
	this.input = this.root.find("input");
	
	this.button.click(function() { _this.onClick(); });
	
	this.onClick = function()
	{
		this.button.toggleClass("button_on");
		this.list.removeClass("list-right");
		this.list.toggle();
		if(this.list.offset().left < 2) this.list.addClass("list-right");
		
		var hider_opt = this.root.data('_hs_options');
		hider_opt.disabled = this.list.is(":visible");
		this.root.data('_hs_options', hider_opt);
		
		TextTooltips.Hide();
		iHidderInit(this.list, this.root, function() { _this.CloseList(); }, { "delay" : 150 });
	}
	
	this.CloseList = function()
	{
		this.button.removeClass("button_on");
		this.list.hide();
		
		var hider_opt = this.root.data('_hs_options');
		hider_opt.disabled = false;
		this.root.data('_hs_options', hider_opt);
	}
	
	this.selectByID = function(id)
	{
		if(this.input.val() == id) return false;
		
		var current = this.list.find("a[node_id="+ id +"]");
		this.list.find("a").removeClass("current");
		current.addClass("current");
		this.input.val(id);
		TextTooltips.ReplaceText(this.root, current.text());
		if(this.options.onchange)
			this.options.onchange(this);
	}
	
	this.onClickLink = function(p)
	{
		this.selectByID($(p).attr("node_id"));
		this.CloseList();
	}
}

AccessControl.onClickLink_st = function(p) 
{
	var obj = $(p).closest('[_field_type=AccessControl]').data('JsControl');
	obj.onClickLink(p);
};
//#endregion

//#region frame
jQuery.fn.frameDocument = function()
{
	var doc;
	if (this.length == 0)
		return null;
		
	if (this[0].contentDocument)
		doc = this[0].contentDocument;
		
	else if (this[0].contentWindow)
		doc = this[0].contentWindow.document;
	
	if (!doc || !doc.body)
		return null;
		
	return $(doc);
};

jQuery.fn.frameWindow = function()
{
	var win;
	if (this.length == 0)
		return null;
		
	if (this[0].contentWindow)
		win = this[0].contentWindow;
	
	if (!win)
		return null;
		
	return $(win);
};

//#endregion

//#region AnchorHandler
var AnchorClass;
function _AnchorHandler()
{
	this.queue = [];
	
	this.AddEvent = function(func)
	{
		this.queue.push(func);
		if(location.hash) func(location.hash);
	}
	
	this.onChange = function(a)
	{
		if(a == location.hash) return false;
		
		for(var i in this.queue)
		{
			this.queue[i](a);
		}
	}
	
	this.CutAnchor = function(u)
	{
		var url = u || location.href;
		var a_pos = url.indexOf('#');
		if(a_pos == 0) return false;
		else if(a_pos < 0) return url;
		url = url.substring(0, a_pos);
		return url;
	}
}

// Обработчик перехода. Принимает стоку вида '#anchor', либо указатель на ссылку
function Anch(p)
{
	if(!AnchorClass || !p) return false;
	var a = false;
	var is_link = false;
	
	if(typeof(p) == 'string') a = p;
	else if($(p).is('a'))
	{
		a = $(p).attr('href');
		is_link = true;
	}
	else return false;
		
	if(a)
	{
		var anchor = a;
		var a_pos = a.indexOf('#');
		if(a_pos > 0) anchor = a.substring(a.indexOf('#'));
		if(a_pos != -1)
		{
			var url = AnchorClass.CutAnchor(a);
			// ссылка только с якорем
			if(!url) AnchorClass.onChange(anchor);
			else
			{
				// Сравниваем вырезанный url с текущим
				var curr_url = AnchorClass.CutAnchor().toString();
				curr_url = curr_url.substring(curr_url.length - url.length);
				if(url == curr_url) AnchorClass.onChange(anchor);
			}
		}
		if(!is_link) Go(a);
 	}
}

// Добавляет обработчик изменения location.hash в очередь
function AddAnchorEvent(func)
{
	if(func)
	{
		if(!AnchorClass) AnchorClass = new _AnchorHandler();
		AnchorClass.AddEvent(func);
	}
}
//#endregion

//#region FeedList
function FeedList(){}
FeedList.LoadNext = function(uid)
{
	var $root = $('#feed_items_'+ uid);
	var ajax = $root.data('feed_items_ajax');
	if (!ajax)
	{
		ajax = new AjaxMaster({
			'switchRoot'		: $root,
			'switchStates'	: 'main,loading,main',
			'success'		: function(r)
				{
					$root.html(r.result.html);
				}
		});
		
		$root.data('feed_items_ajax', ajax);
	}
	
	ajax.Send($root.attr('_load_url'), { 'from': $root.attr('_load_from') });
}

//#endregion

//#region fadeIn/fadeOut для всех, кроме IE
jQuery.fn.fadeInUni = function(speed, callback)
{
	if($.browser.msie && GetInt($.browser.version) < 9)
	{
		$(this).show();
		if(callback) callback();
	}
	else $(this).fadeIn(speed, callback);
}

jQuery.fn.fadeOutUni = function(speed, callback)
{
	if($.browser.msie && GetInt($.browser.version) < 9)
	{
		$(this).hide();
		if(callback) callback();
	}
	else $(this).fadeOut(speed, callback);
}
//#endregion

//#region "стильный" checkbox
function CheckNew_Click(p)
{
	var el = $(p);
	var el_dom = el.get(0);
	if(el.disabled) return false;
	el.closest('label.check_new').toggleClass('check_new_on', el_dom.checked);
}

function CheckNew_Toggle(parent, state)
{
	var check = $(parent).find("input[_check_new]:first");
	if(check.get(0).disabled) return false;
	if(state != undefined) check.setCheck(state);
	else check.toggleCheck();
	CheckNew_Click(check);
}
//#endregion

//#region Получение параметров элемента в скрытом блоке. Аргумент - имя JQuery-функции.
jQuery.fn.GetHiddenParam = function(param)
{
	var el = $(this[0]);
	if(el.is(':visible')) return el[param]();
	
	var h_parent = el.parents(':hidden:last');
	var style = h_parent.attr('style');
	style = style == undefined ? '' : style;
	h_parent.css({'display': 'block', 'position': 'absolute', 'left': -10000});
	var ret = el[param]();
	h_parent.attr('style', style);
	return ret;
};
//#endregion

//#region BCH - Обработчик клика вне элемента
function _BCH()
{
	this.queue = [];
	this.el_queue = [];
	var _this = this;
	
	this.Handler = function()
	{
		for(var i in this.queue)
		{
			if(!this.queue[i].disabled && !in_array(i, this.el_queue))
				this.queue[i].func.call(this.queue[i].elem);
		}
		this.el_queue = [];
	}
	
	this.Add = function(p, cb, disabled)
	{
		var el = $(p);
		if(!el.length || !jQuery.isFunction(cb) || el.attr('_bch_id')) return false;
		
		var params = {'disabled': (disabled != undefined ? disabled : false), 'func': cb, 'elem': el};
		var bch_id = this.queue.push(params) - 1;
		
		el.attr('_bch_id', bch_id).click(function(){ _this.el_queue.push($(this).attr('_bch_id')); });
	}
	
	this.Toggle = function(p, is_on)
	{
		var bch_id = $(p).attr('_bch_id');
		if(bch_id != undefined) this.queue[bch_id].disabled = !is_on;
	}
	
	$(function(){ $('body').click(function(){ _this.Handler(); }); });
}
var BCH = new _BCH();

jQuery.fn.BCH = function(func, disabled)
{
	BCH.Add(this, func, disabled);
	return this;
}

jQuery.fn.ToggleBCH = function(is_on)
{
	BCH.Toggle(this, is_on);
	return this;
}
//#endregion

function CheckedBlock(list_root, check_all)
{
	var inputs = list_root.find('input[_check_new]');
	var allCB = null;
	function MarkBlock(check)
	{
		var check = $(check);
		check.closest('div.list-item').toggleClass('list-item-on', check.get(0).checked);
	}
	
	inputs.each(function(){
		var el = $(this);
		el.click(function(event){
			CheckNew_Click(this);
			MarkBlock(el);
			CancelBubble(event);
		});
		
		el.closest('div.list-item').click(function(){
			CheckNew_Toggle(this);
			MarkBlock(el);
		}).mouseover(function(){
			$(this).setHover({ add_class: 'list-item-h' });
		}).disableTextSelect();
	});
	
	if (check_all)
	{
		allCB = new AllCheckbox(list_root,{
			onCheck: function(p, root){
				root.find(':checkbox[_check_new]').each(function(){
					CheckNew_Click(this);
					MarkBlock(this);
				});
			}
		});
	}
	this.SetCheckAll = function (checked)
	{
		if (allCB) allCB.SetCheckAll(checked);
	}
}

function ShellBlockLoad (layer, url)
{
	var ajax = new AjaxMaster({
		'success'					: function(r){ $(layer).html(r.result.html) },
		'conectionErrorOff'		: true
	});
	
	ajax.Send(url);
}

function MailWriteFeedback(ent_id)
{
	AjaxDlg.ShowPopup('/mail/ajax/write_feedback_dlg?to_ids=' + ent_id);
	return false;
}

function MailWrite(user_id)
{
	AjaxDlg.ShowPopup('/mail/ajax/write_dlg?to_ids=' + user_id);
	return false;
}

function InitFlashObject(url, id, width, height, options)
{
	options = options || { };
	
	var so = new SWFObject(url, 'flash_'+ id, width, height, "7", "#FFF");
	so.addParam("wmode", options.wmode || "opaque");
	
	var params = options.params || [];
	for(var i in params)
	{
		so.addParam(i, params[i]);
	}
	
	so.write(id);
	return so;
}

//#region $.valHtml
jQuery.fn.valHtml = function()
{
	if (this.length == 0 || !this[0] || !this.is('textarea')) return null;
	
	
	var text = this.val();
	text = text.replace(/˂textarea/g, '<textarea').replace(/˂\/textarea/g, '</textarea');
	return text;
}

//#endregion

;(function ($) {

	var settings = {
		protocol: 'http://jabber.org/protocol/httpbind',
		xmlns: 'urn:ietf:params:xml:ns:xmpp',
		resource: 'jquery-bosh',
		port: 80,
		debug: false // FIXME: Change back to false on release
	};
	 
	var errors = {
		not_authorized: 'Invalid login'
	};

	var generateRid = function () {
		return Math.round(100000.5 + (((900000.49999) - (100000.5)) * Math.random()));
	};

	//fadix 
	settings.resource += generateRid();
	
	var startTag = function (name, attrs) {
		var buf = '<' + name;
		if (attrs) {
			$.each(attrs, function (k, v) {
				// IE barfs on properties named 'class' so prefix with 'css_'
				if (k == 'css_class') k = 'class';

				k = k.replace(/_/, ':');
				buf += ' ' + k + '=\'' + v + '\'';
			});
		}
		return buf;
	};

	var buildTag = function (name, attrs, contents) {
		if (attrs && attrs.constructor == String) {
			contents = attrs;
			attrs = {};
		}

		var buf = startTag(name, attrs);

		if (contents) {
			buf += '>';
			if (contents instanceof Array) {
				for (var i = 0; i < contents.length; ++i) {
					buf += buildTag.apply(null, contents[i]);
				}
			} else {
				buf += contents;
			}
			buf += '</' + name + '>';
		} else {
			buf += '/>';
		}
		return buf;
	};

	var toText = function (xmlResponse) {
		if (xmlResponse == null) return false;
		if (typeof xmlResponse.xml != 'undefined') return xmlResponse.xml;
		if (typeof XMLSerializer == 'function') return (new XMLSerializer()).serializeToString(xmlResponse);
		return false;
	};

	var log = function (data, header) {
		if (!settings.debug) return true
		if (typeof console == 'undefined') return true
		try {
			if (header) console.log(header);
			if (typeof data.documentElement == 'undefined') console.log(data);
			else console.log(toText(data));
		} catch (exception) {
			console.log(exception);
		}
	};

	var SessionError = function (type, message) {
		this.type = type;
		this.message = message;
	};

	var Sender = function (packet) {
		this.jid = null;
		this.domain = null;
		this.name = null;
		this.client = null;
		this.nick = null;

		var sender = packet.getAttribute('from') || packet.getAttribute('jid');

		if (sender) {
			if (sender.split("@").length > 1) {
				var from = sender.split("/")[0];
				this.jid = from;
				this.name = from.split('@')[0];
				this.domain = from.split('@')[1];
				//fadix
				this.nick = packet.getAttribute('name');
				if (!this.nick || this.nick == '')
				{
					var $nick = $('nick', packet);
					if($nick.length > 0)
						this.nick = $nick.text();
					else	
						this.nick = this.name;					
				}
			}
			if (sender.split("/").length > 1) this.client = sender.split("/")[1];
		}
	};

	var Message = function (packet, self) {
		this.from = null;
		this.message = null;
		this.timestamp = null;
		this.raw = packet;

		this.from = new Sender(packet);		
		//this.from.nick = self.roster.getNick(this.from);//fdix
		if ($('body', packet).length > 0) this.message = $.trim($('body', packet).text());

		if ($('x[stamp]', packet).length > 0) {
			ts = $('x[stamp]', packet).attr('stamp');
			this.timestamp = new Date();
			this.timestamp.setUTCFullYear(Number(ts.substr(0, 4)));
			this.timestamp.setUTCMonth(Number(ts.substr(4, 2)) - 1); // Javscript months are 0-11
			this.timestamp.setUTCDate(Number(ts.substr(6, 2)));
			this.timestamp.setUTCHours(Number(ts.substr(9, 2)));
			this.timestamp.setUTCMinutes(Number(ts.substr(12, 2)));
			this.timestamp.setUTCSeconds(Number(ts.substr(15, 2)));
		}
	};

	var Presence = function (packet) {
		this.from = new Sender(packet);
		this.available = packet.getAttribute('type') == 'unavailable' ? false : true;
	};

	var Roster = function () {
		this.items = [];

		this.find = function (presence) {
			var result = null;
			$(this.items).each(function (k, v) {
				if (presence.from.jid == v.from.jid) result = k;
			});
			return result;
		};

		this.push = function (presence) {
			found = this.find(presence);
			if (found == null) this.items.push(presence);
			else {				
				presence.from.nick = this.items[found].from.nick;//fadix
				this.items[found] = presence;
			}	
		};

		this.clear = function () {
			this.items = [];
		};
		//fadix
		this.getNick = function (sender) {	
			var found = null;
			$(this.items).each(function (k, v) {
				if (sender.jid == v.from.jid) found = v.from;
			});
			return found? found.nick : sender.nick;
		};
	};

	var Private = function (session, url, username, password, domain, nick) {
		this.session = session;
		this.url = url.match(/^https?:\/\//) == null ? 'http://' + url : url;
		this.username = username;
		this.password = password;
		this.domain = domain;
		this.nick = nick;
		this.route = 'xmpp:' + domain + ':' + settings.port;
		this.jid = username + '@' + domain;
		this.rid = generateRid();
		this.connected = false;
		this.error = null;
		this.roster = new Roster();

		this.callbacks = {
			login: {
				success: null,
				failure: null
			},
			message: {
				received: null,
				sent: null
			},
			subscription: {
				request: null,
				confirmation: null
			},
			roster: {
				updated: null
			},
			listen: {
				failure: null
			}
		};

		this.queues = {
			messages: [],
			subscription: {
				requests: [],
				confirmations: []
			}
		};
	};

	Private.prototype = {
		
		reopen: function () {
			var self = this;
			self.connected = false;
			self.open();
		},
		
		open: function () {
			var self = this;
			if (self.connected) return true;

			var attributes = {
				hold: 1,
				wait: 30,
				secure: false,
				ver: '1.6',
				xmlns_xmpp: 'urn:xmpp:xbosh',
				xmlns_xmpp: '1.0'/*,
				requests: '3'
				content: 'text/xml; charset=utf-8',				
				cache: 'on'*/
			};

			$.extend(attributes, {
				to: self.domain,
				route: self.route,
				rid: self.rid,
				xmlns: settings.protocol
			});

			var login = function (response) {
				$.each(['sid', 'wait', 'ver', 'inactivity', 'requests'], function (k, v) {
					self[v] = response.documentElement.getAttribute(v);
				});
				//fadix
				var auth = self.password;
				//var auth = $.base64Encode(self.username + '@' + self.domain + String.fromCharCode(0) + self.username + String.fromCharCode(0) + self.password);				
				var xmlns = settings.xmlns + "-sasl";
				var data = buildTag.apply(null, ['auth', {
					xmlns: xmlns,
					mechanism: 'PLAIN'
				},
				auth]);
				var packet = self.body({}, data);
				self.send(packet, restart);
			};
			//fadix
			//<body sid='705c916e' rid='159249' to='jabber.test' xmpp:restart='true' xmlns='http://jabber.org/protocol/httpbind' xmlns:xmpp='urn:xmpp:xbosh'/>
			var restart = function (response) {
				var packet = self.body({
					xmpp_restart: 'true',
					to: self.domain,
					xmlns_xmpp: 'urn:xmpp:xbosh'
				}, '');
				self.send(packet, bindToStream);
			};
			var bindToStream = function (response) {
				var data = buildTag.apply(null, ['iq', {
					xmlns: 'jabber:client',
					to: self.domain,
					type: 'set',
					id: 'bind_1'
				},
				[
					['bind', {
						xmlns: settings.xmlns + "-bind"
					},
					[
						['resource', settings.resource]
					]]
				]]);
				var packet = self.body({
					/*xmpp_restart: 'true'*/
				}, data);
				self.send(packet, startSession);
			};

			var startSession = function (response) {
				var data = buildTag.apply(null, ['iq', {
					xmlns: 'jabber:client',
					to: self.domain,
					type: 'set',
					id: 'sess_1'
				},
				[
					['session', {
						xmlns: settings.xmlns + "-session"
					}]
				]]);
				var packet = self.body({}, data);
				self.send(packet, completeLogin);
			};
			//fadix - эту часть кода перенес в fillRoster, т.к послать статус presence
			//нужно после получения списка Roster
			/*var setPresence = function (response) {
				var data = buildTag.apply(null, ['presence', {
					xmlns: 'jabber:client'
				}]);
				var packet = self.body({}, data);
				self.send(packet, completeLogin);
			};*/

			var completeLogin = function (response) {
				self.connected = true;
				self.ingestPresences(response, self);
				self.ingestMessages(response, self);
				self.fillRoster(self);
			};

			self.send(buildTag.apply(null, ['body', attributes]), login);
		},

		close: function () {
			var self = this;
			var data = buildTag.apply(null, ['presence', {
				type: 'unavailable',
				xmlns: 'jabber:client'
			}]);
			var packet = this.body({
				type: 'terminate'
			}, data);

			var completeLogout = function (response) {
				self.sid = null;
				self.rid = generateRid();
				self.connected = false;
			};

			self.send(packet, completeLogout);
		},

		ingestMessages: function (data, self) {
			self.queues.messages = [];
			$('message[type=chat]', data).each(function (k, v) {
				self.queues.messages.push(new Message(v, self));
			});

			if (self.callbacks.message.received && self.queues.messages.length > 0) self.callbacks.message.received();
		},

		ingestSubscriptionRequests: function (data, self) {
			self.queues.subscription.requests = [];
			$('presence[type="subscribe"]', data).each(function (k, v) {
				self.queues.subscription.requests.push(new Presence(v));
			});

			if (self.callbacks.subscription.request && self.queues.subscription.requests.length > 0) self.callbacks.subscription.request();
		},

		ingestSubscriptionConfirmations: function (data, self) {
			self.queues.subscription.confirmations = [];
			$('presence[type="subscribed"]', data).each(function (k, v) {
				self.queues.subscription.confirmations.push(new Presence(v));
			});

			if (self.callbacks.subscription.confirmation && self.queues.subscription.confirmations.length > 0) self.callbacks.subscription.confirmation();
		},

		ingestPresences: function (data, self) {
			$('presence', data).each(function (k, v) {
				var username = v.getAttribute('from').split('@')[0]
				if (username != self.username) self.roster.push(new Presence(v));
			});

			if (self.callbacks.roster.updated) self.callbacks.roster.updated();
		},

		listen: function () {
			this.send(this.body({}), this.ingestPacket, this.listenFailure);
		},

		ingestPacket: function (response, self) {
			self.ingestMessages(response, self);

			if ($('presence', response).length > 0) {
				self.ingestSubscriptionRequests(response, self);
				self.ingestSubscriptionConfirmations(response, self);
				self.ingestPresences(response, self);
			}
			var ack = $('body', response).attr('ack');
			if (!ack)
				self.listen();
		},
		
		listenFailure: function (received, self) {
			log(received, '+Error+');
			if (self.callbacks.listen.failure) self.callbacks.listen.failure();
		},
		
		checkForFailure: function (received, self) {
			if ($('failure', received).length > 0) {
				error = $('failure', received)[0].firstChild.tagName.replace("-", "_");
				$(errors).each(function (k, v) {
					if (v[error]) self.error = new SessionError(error, v[error])
				});

				// Error received did not match any in errors hash
				if (!self.error) self.error = new SessionError('unknown', error)

				// Login has not been compeleted and a failure callback exists 
				if (!self.connected && self.callbacks.login.failure) self.callbacks.login.failure();

				return false;
			}

			return true;
		},

		requestSubscription: function (recipient) {
			if (!this.connected) return false;

			var recipientJid = this.parseJid(recipient);
			var data = buildTag.apply(null, ['presence', {
				xmlns: 'jabber:client',
				to: recipientJid,
				type: 'subscribe'
			}])
			var packet = this.body({}, data);
			this.send(packet);
		},

		approveSubscription: function (recipient) {
			if (!this.connected) return false;

			var recipientJid = this.parseJid(recipient);
			var data = buildTag.apply(null, ['presence', {
				xmlns: 'jabber:client',
				to: recipientJid,
				type: 'subscribed'
			}])
			var packet = this.body({}, data);
			this.send(packet);
		},

		sendMessage: function (recipient, msg, onSuccess, onFailure) {
			
			if (!this.connected) return false;

			var recipientJid = this.parseJid(recipient);
			var fromJid = this.username + '@' + this.domain;
			//fadix add -> type='chat', nick
			var data = buildTag.apply(null, ['message', {
				xmlns: 'jabber:client',
				type: 'chat',
				to: recipientJid,
				from: fromJid
			}, this.nick ? [
					['body', msg],
					['nick', {xmlns: 'http://jabber.org/protocol/nick'}, this.nick]
				]
				:[
					['body', msg]
				]
			]);

			var packet = this.body({}, data);
			this.send(packet, function (data, self)
			{
				self.ingestPacket(data, self);
				if (onSuccess) onSuccess(data, self);
			}
			, onFailure);
		},

		fillRoster: function (self) {
			if (!self.connected) return false;

			var from = this.username + '@' + this.domain;
			var data = buildTag.apply(null, ['iq', {
				/*xmlns: 'jabber:client', from: from,*/
				type: 'get',
				id: 'roster_1'
				/*id: 'get_roster_0'*/
			},
			[
				['query', {
					xmlns: 'jabber:iq:roster'
				}]
			]]);
			var packet = this.body({}, data);

			self.send(packet, function (data, self) {
				$('query > item[subscription!="none"]', data).each(function (k, v) {
					var presence = new Presence(v);
					presence.available = false;
					if (presence.from.jid != self.jid)//fadix
						if (self.roster.find(presence) == null) self.roster.push(presence);
				});
					
				// Login has succeeded and a success callback exists
				if (self.callbacks.login.success) self.callbacks.login.success();
						
				var data = buildTag.apply(null, ['presence', {
					xmlns: 'jabber:client'
				}]);
				var packet = self.body({}, data);
				self.send(packet, function(data) {
					self.listen();
				});	
			});
		},

		parseJid: function (recipient) {
			return (recipient.split('@').length > 1) ? recipient : recipient + '@' + this.domain;
		},

		incrementRid: function () {
			this.rid += 1;
			return this.rid;
		},

		body: function (attrs, data) {
			$.extend(attrs, {
				rid: this.incrementRid(),
				sid: this.sid,
				xmlns: settings.protocol
			});
			return buildTag.apply(null, ['body', attrs, data]);
		},

		send: function (payload, onSuccess, onFailure) {			
			var self = this;
			log(payload, '-Sent-');
			//fadix
			//payload = "<body content=\"text/xml; charset=utf-8\" to=\"jabber.test\" wait=\"60\" hold=\"5\" xml:lang=\"ru-RU\" rid=\"1864020665\" xmlns=\"http://jabber.org/protocol/httpbind\" />";
			$.ajax({
				type: "POST",
				url: self.url,
				data: payload,
				dataType: "xml",
				contentType: "text/xml",
				success: function (recvd, status) {
					log(recvd, '+Recvd+');
					if (!self.checkForFailure(recvd, self)) return false;
					if (onSuccess) onSuccess(recvd, self);
				},
				error: function (recvd, status) {
					if (!onFailure) log(recvd, '+Error+');
					else onFailure(recvd, self);
				}
			});
		}
	};

	window.tagBuilder = function (name, attrs, contents) {
		if (attrs) {
			if (attrs.constructor == String || attrs.constructor == Array) {
				contents = attrs;
				attrs = {};
			}
		} else {
			attrs = {};
			contents = null;
		}

		var tagArgs = [name, attrs, contents];
		return buildTag.apply(null, tagArgs)
	};

	window.Session = function (url, username, password, domain, nick) {
		var domain = domain || 'localhost';
		var session = new Private(this, url, username, password, domain, nick);

		this.username = function () {
			return username;
		};
		this.settings = function () {
			return settings
		};
		this.url = function () {
			return session.url
		};
		this.rid = function () {
			return session.rid
		};
		this.jid = function () {
			return session.jid
		};
		this.domain = function () {
			return session.domain
		};
		this.error = function () {
			return session.error
		};
		this.roster = function () {
			return session.roster.items
		};
		this.connected = function () {
			return session.connected
		};
		this.queues = function () {
			return session.queues
		};
		this.callbacks = function () {
			return session.callbacks
		};		
		this.reopen = function () {
			session.reopen()
		};
		this.open = function () {
			session.open()
		};
		this.close = function () {
			session.close()
		};
		this.sendMessage = function (recipient, message, onSuccess, onFailure) {
			session.sendMessage(recipient, message, onSuccess, onFailure)
		};
		this.requestSubscription = function (recipient) {
			session.requestSubscription(recipient)
		};
		this.approveSubscription = function (recipient) {
			session.approveSubscription(recipient)
		};

		this.setup = function (newSettings) {
			$.extend(settings, newSettings)
		};
	};
})(jQuery);
var jab_popups = null; 
var jab_client;
var max_last_list = 5;

function date2str(date)
{
	var hours=date.getHours() 
	var minutes=date.getMinutes() 
	return "" + hours + ((minutes < 10) ? ":0" : ":") + minutes;		
}
function cutText(text, n)
{
	if (!text) return ' ';
	if (text.length > n)
		return text.substr(0, n - 3) + '...';
	return text;	
}
jQuery.fn.incIcon = function(value, name)
{		
	this.each(function() 
	{ 
		var old = parseInt(this.innerHTML);
		if (!old) old = 0;
		if (old == 0 && value > 0)
			$(this).closest(name).showV();
		else if (old + value == 0)
			$(this).closest(name).hideV();
		$(this).closest('div.dock_icon').toggleClass('dock_icon_nr', old + value > 0);
		$(this).html(old + value);
	});
	return this;
}
function Sounds(pathes)
{
	this.enabled = true;
	this.Play = function (action)
	{
		if (!this.enabled) return;
		
		var $cont = $("#emb_sound");
		var html = "<embed src=\""+pathes[action]+"\" width=\"1\" height=\"1\" quality=\"high\" pluginspage=\"http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash\" type=\"application/x-shockwave-flash\">";
		$cont.html(html);  
	}		
}
var oSound = new Sounds({
	"chat_recv": StaticUrl +"/all/flash/chat_recv.swf"/*,
	"msg": StaticUrl +"/all/flash/msg.swf"*/
});
if (getCookie('jab_sound') == 'off')
	oSound.enabled = false;
function JabHistory()
{
	//Persist.remove('cookie');
	this.enabled = true;
	if (this.enabled) {
		Persist.remove('localstorage');
		Persist.remove('gears');
		var store = new Persist.Store('jab_history', {
		  swf_path: StaticUrl +'/all/persist/persist.swf'
		});
	}
	function toName(jid){
		return jid.replace('@', '_');
	}
	
	this.Add = function (jid, text, is_my, date)
	{		
		if (!this.enabled) return;
		jid = toName(jid);
		this.IfNeed(is_my, jid, text, function (){
			//store.set(jid, "test"+String.fromCharCode(2)+'dfsdf');
			//return;
			//store.set(jid, '');	//test	
			store.get(jid, function(ok, data) {
				if (!ok || !data) data = "";
				else data += String.fromCharCode(1);
				data += text + String.fromCharCode(2) + (is_my? '1' : '') + String.fromCharCode(2) + date;
				store.set(jid, data);
			});
		});		
	}	
	this.Clear = function (jid, fn)
	{
		if (!this.enabled) return;
		jid = toName(jid);
		store.remove(jid, fn);
	}
	this.Restore = function (jid, fn)
	{
		if (!this.enabled) return;
		jid = toName(jid);
		store.get(jid, function(ok, data) {
			if (!ok || !data) return null;
			data += '';
			var m = data.split(String.fromCharCode(1));
			fn(m);
		});	
	}
	
	this.IfNeed = function(is_my, jid, text, fn)
	{
		if (is_my) fn();
		else {
			store.get(jid, function(ok, data) {
				if (!data) return fn();
				data += '';
				data = data.split(String.fromCharCode(1));	
				data = data[data.length - 1];
				data = data.split(String.fromCharCode(2));
				if (data[0] != text) fn();
				//console.log(data + ", my:"+this.id+(data[data.length - 1] == this.id? "-мой":''));				
			});
		}
	}
}
function jab_sound_off(event, p)
{
	CancelBubble(event);
	$(p).replaceClass('a_sounds_off', 'a_sounds_on');
	oSound.enabled = false;
	setCookie('jab_sound', 'off');
}
function jab_sound_on(event, p)
{
	CancelBubble(event);
	$(p).replaceClass('a_sounds_on', 'a_sounds_off');
	oSound.enabled = true;
	delCookie('jab_sound');
}
function jab_sound_toggle(p)
{
	if(oSound.enabled)
	{
		$(p).addClass('a_sounds_off');
		oSound.enabled = false;
		setCookie('jab_sound', 'off');
	}
	else
	{
		$(p).removeClass('a_sounds_off');
		oSound.enabled = true;
		delCookie('jab_sound');
	}
}
function JAB_popups(columns, width, height)
{
	this.oHistory = new JabHistory();
	this.root = $('#jabber_popups').BCH(function(){ jab_toggle_msg(this, 'hide'); });
	this.template = $('#jab_templates').find('[jab_popup]');
	this.tpl_user = this.template.find('[username]');
	this.tpl_ent = this.template.find('[ent_name]');
	this.node_width = width;
	this.node_height = height;
	this.elements = new Array();
	this.rosters = new Array();
	this.columns = columns;
	this.curr_jid = null;
	
	this.msg_tpl = $('#jab_templates').find('[jab_msg]');
	this.msg_user = this.msg_tpl.find('[jab_msg_user]');
	this.msg_text = this.msg_tpl.find('[jab_msg_text]');
	this.msg_time = this.msg_tpl.find('[jab_msg_time]');	
	return this;
}

JAB_popups.prototype.Reposition = function ()
{
	var pos_x = 0;
	var pos_y = 0;
	var spl  = 0;
	for (var i in this.elements)
	{
		if(!(spl % this.columns) && spl)
		{
			pos_y += this.node_height;
			pos_x = 0;
		}
		this.elements[i].css('left', pos_x);
		this.elements[i].css('top', pos_y);
		pos_x += this.node_width;
		spl++;
	}
}
// добавить toolbar для истории
JAB_popups.prototype.AddTBHistory = function (jid, username, ent_name, count)
{
	var pp = this.elements[jid];
	var msg_list = pp.find('.message_list');	
	var self = this;	
	//показать остальную историю
	pp.find('[jab_show_hist]').click(function (event) {
		var $tb = $(this).closest('[jab_history_tb]');
		$tb.find('[jab_show_hist]').hide();		
		self.oHistory.Restore(jid, function (hm) {
			hm = hm.slice(0, count);
			$.each(hm, function (k, s) {
				var v = s.split(String.fromCharCode(2));
				if (v[1])
					self.AddMsg(jid, this.user_name, this.ent_name, v[0], true, v[2], true, $tb);
				else
					self.AddMsg(jid, username, ent_name, v[0], false, v[2], true, $tb);
			});
			//перемещаем в начало
			$tb.remove().insertBefore(msg_list.children(':first-child'));
		});
	}).show();	
}
JAB_popups.prototype.Status = function (jid, is_online)
{
	var pp = this.elements[jid];
	if (!pp) return;
	if (is_online) pp.removeClass('jab_offline').addClass('jab_online');
	else pp.removeClass('jab_online').addClass('jab_offline');
}	
// Добавить попап для жида
// Первый атрибут - id юзера, остальные думаю ясно
JAB_popups.prototype.Add = function (jid, username, ent_name, is_offline)
{
	if(this.elements[jid]) return this.elements[jid];
	this.tpl_user.text(cutText(username, 20));
	this.tpl_ent.text(cutText(ent_name, 20));
	this.template.attr('jab_popup', jid);
	var pp = this.template.clone().appendTo(this.root);
	this.elements[jid] = pp;
	if (is_offline) pp.addClass('jab_offline');
	else pp.addClass('jab_online');
	// Attach events to send messages
	pp.find('input').keydown(jab_sendMessage);
	pp.find('[btn_send]').click(jab_sendMessage);
	
	this.Reposition();
	
	Cookie2AddToList('jab_open', jid.split('@')[0], null);
	//если его нет в списке то добавляем
	if (!this.rosters[jid])
		Add2Roster(jid, username, ent_name, true);
	//открытие истории переписки
	var self = this;
	this.oHistory.Restore(jid, function (hm) {
		pp.find('[jab_history_tb]').show();
		if (hm.length > 10){
			self.AddTBHistory(jid, username, ent_name, hm.length - 10);
			hm = hm.slice(-10);
		}
		$.each(hm, function (k, s) {
			var v = s.split(String.fromCharCode(2));
			if (v[1])
				self.AddMsg(jid, this.user_name, this.ent_name, v[0], true, v[2], true);
			else
				self.AddMsg(jid, username, ent_name, v[0], false, v[2], true);
		});
	});
		
	return pp;
}

// Закрыть попап по клику на дочернем элементе
JAB_popups.prototype.Remove = function (p)
{
	if (!p) return;
	var node = $(p).closest('[jab_popup]');
	var jid = node.attr('jab_popup');
	delete(this.elements[jid]);
	node.remove();
	this.Reposition();
	this.curr_jid = null;
	Cookie2RemoveFromList('jab_open', jid.split('@')[0], null);
}
var rgName = /([^(]+)\(([^)]+)\)/;
// Добавить сообщение для попапа данного жида, если попапа еще нет - создать
// Первый параметр - id, is_my == true, если это мое сообщение(подсветится зеленым)
JAB_popups.prototype.AddMsg = function (jid, username, ent_name, text, is_my, time, is_hist, $before)
{
	if (!ent_name && !is_my) {
		//разбор имени по шаблону:
		//username (ent_name);
		var m = rgName.exec(username);
		if (m)	{
			username = m[1];
			ent_name = m[2];
		}
	}
	if (!(this.elements[jid])) {
		var $pp = jab_popups.Add(jid, username, ent_name);
		if (!this.curr_jid) jab_toggle_msg($pp, 'show');
	}	
	if (!is_my && !is_hist) {
		var $counter = this.elements[jid].find('[pm_count]').incIcon(1, '[pm_c_icon]');		
		var $r_counter = $('#jabber_icon [pm_count]').incIcon(1, '[pm_c_icon]');
		if (this.curr_jid == jid) {
			setTimeout(function () {
				$counter.incIcon(-1, '[pm_c_icon]');	
				$r_counter.incIcon(-1, '[pm_c_icon]');
			}, 2000);
		}
	}
	//counter.text((counter.text() * 1) + 1);
	this.msg_user.text(is_my ? this.sIm : username).setClass(is_my ? 'c_green' : 'c_blue').addClass('smaller');
	this.msg_text.text(text);
	this.msg_time.text(time);	
	$msg_list = this.elements[jid].find('.message_list');
	if (is_hist) {
		if ($before)
			$msg = this.msg_tpl.clone().insertBefore($before);
		else
			$msg = this.msg_tpl.clone().appendTo($msg_list.find('[jab_hist_list]'));
	}		
	else {	
		$msg = this.msg_tpl.clone().appendTo($msg_list);
		$msg_list.find('[jab_history_tb]').show();	
	}	
	//прокручиваем вниз
	if (!$before)
		$msg_list.attr('scrollTop', $msg_list.attr('scrollHeight'));
		
	if (!is_hist){
		this.oHistory.Add(jid, text, is_my, time);
	}
}

// Скрыть/показать окошко с сообщениями, предварительно закрыв остальные
// Возможно стоит доработать, чтобы могло скрывать попап по повторному клику

function jab_toggle_msg(p, state)
{
	if (!jab_popups)
		return;
		
	jab_popups.curr_jid = null;
	jab_popups.root.ToggleBCH(false);
	jab_popups.root.find('.message_popup').hide();
	jab_popups.root.find('.jab_info_block').addClass('jab_info_block_close');
	if(state != 'hide')
	{
		jab_popups.root.ToggleBCH(true);
		var popup = $(p).closest('[jab_popup]');
		popup.find('.jab_info_block').removeClass('jab_info_block_close');
		popup.find('.message_popup').show();
		jab_popups.curr_jid = popup.attr('jab_popup');	
		
		//уменьшаем счетчики новыйх сообщений
		//setTimeout(function () {
		var $counter = popup.find('[pm_count]');		
		var i = parseInt($counter.text());
		if (i)
		{
			$counter.text('0').closest('[pm_c_icon]').hide();
			$('#jabber_icon [pm_count]').incIcon(-i, '[pm_c_icon]');
		}			
		popup.find('input').focus();
		var $msg_list = popup.find('.message_list');
		//прокручиваем вниз
		$msg_list.attr('scrollTop', $msg_list.attr('scrollHeight'));		
		//}, 2000);			
	}
}
//чистить историю
JAB_popups.prototype.ClearHistory = function (p)
{
	var popup = $(p).closest('[jab_popup]');
	jid = popup.attr('jab_popup');
	var msg_list = popup.find('.message_list');
	msg_list.find('[jab_history_tb]').hide();
	msg_list.find('[jab_show_hist]').hide();
	
	this.oHistory.Clear(jid, function (ok, val) {
		msg_list.find('[jab_msg]').remove();
	});	
}
JAB_popups.prototype.UpdateRosters = function (data)
{
	var roster = $('#jab_roster .roster_body');
	roster.find('[user_jid]').remove();
	roster.find('.roster_free').show();
	$('#jabber_icon [users_count]').text('0');
	$.each(data, function (k, v) {
		var jid = v.id + "@" + jab_client.domain;
		Add2Roster(jid, v.user_name, v.ent_name, v.online || v.online_live);
		jab_popups.Status(jid, v.online || v.online_live);
	});		
}

// Добавить контакт в "ростер"
// Параметры как и в предыдущих, последний == true, если юзер пишет с Promdex.Live
function Add2Roster(jid, username, ent_name, is_online)
{
	var tpl = $('#jab_templates').find('[user_jid]');
	tpl.find('[username]').text(username);
	tpl.find('[ent_name]').text(ent_name);
	tpl.attr('user_jid', jid);
	var status_path = StaticUrl +'/img/shell/header/dock/jabber/';
	
	var dest = $('#jab_roster .roster_body');
	dest.find('.roster_free').hide();
	var clone = tpl.clone().appendTo(dest);
	if(!is_online) clone.addClass('jab_offline');
	
	clone.click(function () { 
		ClosePopups();
		jab_toggle_msg(jab_popups.Add(jid, username, ent_name, !is_online), 'show');		
	});
	//обработчик удаления roster
	clone.find('[jab_remove]').click(function(event){
		dest.find('[user_jid='+jid+']').remove();
		Cookie2RemoveFromList('jab_last', jid.split('@')[0], null);
		jab_popups.Remove(jab_popups.elements[jid]);
		delete(jab_popups.elements[jid]);
		$('#jabber_icon [users_count]').increment(-1);
		CancelBubble(event);
	});
	jab_popups.rosters[jid] = clone;
	clone.hover(
  		function () {
    		$(this).addClass('hover_node');
  		}, 
  		function () {
    		$(this).removeClass('hover_node');
  		}
	);
	$('#jabber_icon [users_count]').increment(1);	
	
	Cookie2AddToList('jab_last', jid.split('@')[0], max_last_list);
}

// Удалить контакт из "ростера"
function RemoveFromRoster(jid)
{
	var root = $('#jab_roster .roster_body');
	root.find('[user_jid="' + jid +'"]').remove();
	$('#jabber_icon [users_count]').increment(-1);	
	delete(jab_popups.rosters[jid]);
	if(!root.find('[user_jid]').is(':visible')) root.find('.roster_free').show();
}
//=======================================
function JAB_client(host, user, auth, domain, nick, onLogin)
{
	var session = null;
	var me = this;
	this.nick = nick;
	this.domain = domain;
	this.onLogin = onLogin;
	this.login = function ()
	{
		session = new Session(host, user, auth, domain, nick);
		session.callbacks().login.success = loginSucceeded;
		session.callbacks().login.failure = loginFailed;
		session.callbacks().subscription.request = subscriptionRequest;
		session.callbacks().subscription.confirmation = subscriptionConfirmation;
		session.callbacks().roster.updated = updateRoster;
		session.callbacks().message.received = messageReceived;
		session.callbacks().listen.failure = listenFailure;
		session.open();
		return false; // So form doesn't submit
	}
			
	function listenFailure(){
		session.reopen();
	}
			
	function loginSucceeded() {
		if (onLogin) onLogin();
		onLogin = null;	   
	}
	
	function loginFailed() {
	    alert('Login failed: ' + session.error().message);
	    //clearLoginForm();
	    //$('#login input:first').focus();
	}
	
	function subscriptionRequest(requests) {
	    $(session.queues().subscription.requests).each(function (k, v) {
    		//без запроса тодтвердаем 
    		session.approveSubscription(v.from.jid)
          //session.requestSubscription(v.from.jid)		        
	    });
	}
	
	function subscriptionConfirmation() {		    
		
	}
	function updateRoster() {
		if (!session.connected()) return;
	}
	this.sendMessage = function (jid, message)
	{			
		var recipient = jid.split('@')[0];
		session.sendMessage(recipient, message/*, null, function (){
			alert("Последнее сообщение не удалось отправить");
			listenFailure();		
		}*/);
	}
			
	function messageReceived() {
	    $(session.queues().messages).each(function (k, v) {
			oSound.Play('chat_recv');
	    	if(!v.timestamp) v.timestamp = new Date();
	    	jab_popups.AddMsg(v.from.jid, v.from.nick, null, v.message, false, date2str(v.timestamp), false);	       
	    });
	}
	this.logout = function () {
	    session.close();	
	}
	
	function clearLoginForm() {
	    /*$('#login input[type!="submit"]').each(function (k, v) {
	        v.value = ''
	    });*/
	}
	
	//инициализация класса
	this.login();	
	/*window.onunload = function ()
	{
		jab_client.logout();
	}*/
}

function jab_sendMessage(event) 
{
	if (event.which != 0 && event.which != 1 && event.which != 13) return;
	CancelBubble(event);
	var $node = $(this).closest('[jab_popup]');
	var jid = $node.attr('jab_popup');
	var $input = $node.find('input:first');		
	var message = $input.val();
	$input[0].value = "";
	if (message == "") return false;
	
	jab_client.sendMessage(jid, message);
	jab_popups.AddMsg(jid, jab_popups.user_name, jab_popups.ent_name, message, true, date2str(new Date()), false);
}
function LiveTooltipOpenChat(p)
{
	var data = $('#live_open_chat').attr('SH_jabber');
	data = $.parseJSON(data);
	jab_openChat(data[0], data[1], data[2])
}
function jab_openChat(event, id, user_name, ent_name)
{
	var pp = jab_popups.Add(id + "@" + jab_client.domain, user_name, ent_name);
	jab_toggle_msg(pp, 'show');
				
	CancelBubble(event);
}

function afilter(list)
{
	var res = [];
	for (var i = 0; i < list.length; i++) {
		if (list[i])
			res.push(list[i]);			
	}
	return res;
}
function Cookie2AddToList(name, value, maxCount)
{
	var list = getCookie(name);
	if (list) list = afilter(list.split(';'));
	else {
		setCookie(name, ';' + value + ';');
		return;
	}
	
	var f = false;
	for (var i = 0; i < list.length; i++) {
		if (list[i] == value){
			f = true;
			break;
		}
	}
	if (!f) {
		list.push(value);
		var i = maxCount > 0 && list.length > maxCount ? list.length - maxCount : 0;
		var res = ";";
		for(i; i < list.length; i++) {
			res += list[i] + ";";
		}
		setCookie(name, res);
	}	
}
function RestoreCookie(name, value)
{
	if (!value) return;
	if (!getCookie(name)) setCookie(name, value);
}
function Cookie2RemoveFromList(name, value)
{
	var list = getCookie(name);
	if (!list) return;
	list = afilter(list.split(';'));
	var res = ";";
	for(var i=0; i < list.length; i++) {
		if (list[i] != value)
			res += list[i] + ";";
	}
	if (res == ";")	delCookie(name)
	else setCookie(name, res);			
}	
function UpdateRosterOnline()
{
	var list = getCookie('jab_last');
	if (!list) return;		
	$.ajax({
		type: "GET",
		dataType: "json",
		url: "/jabber/ajax/online" + "?i=" + Math.floor(Math.random() * 1000000000),
		data: {
			list : list
		},
		success : function(data) {
			jab_popups.UpdateRosters(data);
		}		
	});		
}
/*!
 * 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 Widget 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/Widget
 */
(function(b,j){if(b.cleanData){var k=b.cleanData;b.cleanData=function(a){for(var c=0,d;(d=a[c])!=null;c++)b(d).triggerHandler("remove");k(a)}}else{var l=b.fn.remove;b.fn.remove=function(a,c){return this.each(function(){if(!c)if(!a||b.filter(a,[this]).length)b("*",this).add([this]).each(function(){b(this).triggerHandler("remove")});return l.call(b(this),a,c)})}}b.widget=function(a,c,d){var e=a.split(".")[0],f;a=a.split(".")[1];f=e+"-"+a;if(!d){d=c;c=b.Widget}b.expr[":"][f]=function(h){return!!b.data(h,
a)};b[e]=b[e]||{};b[e][a]=function(h,g){arguments.length&&this._createWidget(h,g)};c=new c;c.options=b.extend(true,{},c.options);b[e][a].prototype=b.extend(true,c,{namespace:e,widgetName:a,widgetEventPrefix:b[e][a].prototype.widgetEventPrefix||a,widgetBaseClass:f},d);b.widget.bridge(a,b[e][a])};b.widget.bridge=function(a,c){b.fn[a]=function(d){var e=typeof d==="string",f=Array.prototype.slice.call(arguments,1),h=this;d=!e&&f.length?b.extend.apply(null,[true,d].concat(f)):d;if(e&&d.charAt(0)==="_")return h;
e?this.each(function(){var g=b.data(this,a),i=g&&b.isFunction(g[d])?g[d].apply(g,f):g;if(i!==g&&i!==j){h=i;return false}}):this.each(function(){var g=b.data(this,a);g?g.option(d||{})._init():b.data(this,a,new c(d,this))});return h}};b.Widget=function(a,c){arguments.length&&this._createWidget(a,c)};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(a,c){b.data(c,this.widgetName,this);this.element=b(c);this.options=b.extend(true,{},this.options,
this._getCreateOptions(),a);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},
widget:function(){return this.element},option:function(a,c){var d=a;if(arguments.length===0)return b.extend({},this.options);if(typeof a==="string"){if(c===j)return this.options[a];d={};d[a]=c}this._setOptions(d);return this},_setOptions:function(a){var c=this;b.each(a,function(d,e){c._setOption(d,e)});return this},_setOption:function(a,c){this.options[a]=c;if(a==="disabled")this.widget()[c?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",c);return this},
enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(a,c,d){var e=this.options[a];c=b.Event(c);c.type=(a===this.widgetEventPrefix?a:this.widgetEventPrefix+a).toLowerCase();d=d||{};if(c.originalEvent){a=b.event.props.length;for(var f;a;){f=b.event.props[--a];c[f]=c.originalEvent[f]}}this.element.trigger(c,d);return!(b.isFunction(e)&&e.call(this.element[0],c,d)===false||c.isDefaultPrevented())}}})(jQuery);
;/*!
 * jQuery UI Mouse 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/Mouse
 *
 * Depends:
 *	jquery.ui.widget.js
 */
(function(b){b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var a=this;this.element.bind("mousedown."+this.widgetName,function(c){return a._mouseDown(c)}).bind("click."+this.widgetName,function(c){if(true===b.data(c.target,a.widgetName+".preventClickEvent")){b.removeData(c.target,a.widgetName+".preventClickEvent");c.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(a){a.originalEvent=
a.originalEvent||{};if(!a.originalEvent.mouseHandled){this._mouseStarted&&this._mouseUp(a);this._mouseDownEvent=a;var c=this,e=a.which==1,f=typeof this.options.cancel=="string"?b(a.target).parents().add(a.target).filter(this.options.cancel).length:false;if(!e||f||!this._mouseCapture(a))return true;this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet)this._mouseDelayTimer=setTimeout(function(){c.mouseDelayMet=true},this.options.delay);if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a)){this._mouseStarted=
this._mouseStart(a)!==false;if(!this._mouseStarted){a.preventDefault();return true}}true===b.data(a.target,this.widgetName+".preventClickEvent")&&b.removeData(a.target,this.widgetName+".preventClickEvent");this._mouseMoveDelegate=function(d){return c._mouseMove(d)};this._mouseUpDelegate=function(d){return c._mouseUp(d)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);a.preventDefault();return a.originalEvent.mouseHandled=
true}},_mouseMove:function(a){if(b.browser.msie&&!(document.documentMode>=9)&&!a.button)return this._mouseUp(a);if(this._mouseStarted){this._mouseDrag(a);return a.preventDefault()}if(this._mouseDistanceMet(a)&&this._mouseDelayMet(a))(this._mouseStarted=this._mouseStart(this._mouseDownEvent,a)!==false)?this._mouseDrag(a):this._mouseUp(a);return!this._mouseStarted},_mouseUp:function(a){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);
if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);this._mouseStop(a)}return false},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return true}})})(jQuery);
;/*
 * jQuery UI Position 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/Position
 */
(function(c){c.ui=c.ui||{};var n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY,
left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+=
k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-=
m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left=
d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+=
a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b),
g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery);
;/*
 * jQuery UI Slider 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/Slider
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 */
(function(d){d.widget("ui.slider",d.ui.mouse,{widgetEventPrefix:"slide",options:{animate:false,distance:0,max:100,min:0,orientation:"horizontal",range:false,step:1,value:0,values:null},_create:function(){var b=this,a=this.options;this._mouseSliding=this._keySliding=false;this._animateOff=true;this._handleIndex=null;this._detectOrientation();this._mouseInit();this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget ui-widget-content ui-corner-all");a.disabled&&this.element.addClass("ui-slider-disabled ui-disabled");
this.range=d([]);if(a.range){if(a.range===true){this.range=d("<div></div>");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("<div></div>");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");
if(a.values&&a.values.length)for(;d(".ui-slider-handle",this.element).length<a.values.length;)d("<a href='#'></a>").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.disabled)d(this).blur();
else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!b.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e=
false;if(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h===
b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider");
this._mouseDestroy();return this},_mouseCapture:function(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b,
g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true},
_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a;
if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=
this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c<e))c=e;if(c!==this.values(a)){e=this.values();e[a]=c;b=this._trigger("slide",b,{handle:this.handles[a],value:c,values:e});this.values(a?0:1);b!==false&&this.values(a,c,true)}}else if(c!==this.value()){b=this._trigger("slide",b,{handle:this.handles[a],
value:c});b!==false&&this.value(c)}},_stop:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("stop",b,c)},_change:function(b,a){if(!this._keySliding&&!this._mouseSliding){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(a);c.values=this.values()}this._trigger("change",b,c)}},value:function(b){if(arguments.length){this.options.value=
this._trimAlignValue(b);this._refreshValue();this._change(null,0)}return this._value()},values:function(b,a){var c,e,f;if(arguments.length>1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f<c.length;f+=1){c[f]=this._trimAlignValue(e[f]);this._change(null,f)}this._refreshValue()}else return this.options.values&&this.options.values.length?this._values(b):this.value();
else return this._values()},_setOption:function(b,a){var c,e=0;if(d.isArray(this.options.values))e=this.options.values.length;d.Widget.prototype._setOption.apply(this,arguments);switch(b){case "disabled":if(a){this.handles.filter(".ui-state-focus").blur();this.handles.removeClass("ui-state-hover");this.handles.attr("disabled","disabled");this.element.addClass("ui-disabled")}else{this.handles.removeAttr("disabled");this.element.removeClass("ui-disabled")}break;case "orientation":this._detectOrientation();
this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation);this._refreshValue();break;case "value":this._animateOff=true;this._refreshValue();this._change(null,0);this._animateOff=false;break;case "values":this._animateOff=true;this._refreshValue();for(c=0;c<e;c+=1)this._change(null,c);this._animateOff=false;break}},_value:function(){var b=this.options.value;return b=this._trimAlignValue(b)},_values:function(b){var a,c;if(arguments.length){a=this.options.values[b];
return a=this._trimAlignValue(a)}else{a=this.options.values.slice();for(c=0;c<a.length;c+=1)a[c]=this._trimAlignValue(a[c]);return a}},_trimAlignValue:function(b){if(b<=this._valueMin())return this._valueMin();if(b>=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},
_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate);
if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1,
1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.11"})})(jQuery);
;
	function dateDiff(interval, date1, date2) {
		var divisor = 1;

		switch (interval) {
			case "day":
				divisor *= 24;
			case "hour":
				divisor *= 60;
			case "minute":
				divisor *= 60;
			case "second":
				divisor *= 1000;
				break;
			default:
				return;
		}

		var ms1 = getMilliseconds(date1)
		var ms2 = getMilliseconds(date2)

		var ret = (ms2 - ms1) / divisor;

		return (isNaN(ret) ? 0 : ret);
	}
	
	function calc_date(days, date_from)
	{
		if(!date_from) date_from = new Date();
		var period = days ? days * 86400000 : 0;
		var new_date = new Date(date_from.getTime() + period);
		return new_date;
	}

	// Requires a four digit year "YYYY" other than that you can use pretty much any format you like.
	function getMilliseconds(date) {
		var ms = 0;

		var year = date.getFullYear();
		var month = date.getMonth() + 1;
		var day = date.getDate();
		var hour = date.getHours();
		var minute = date.getMinutes();
		var second = date.getSeconds();
		var millisecond = date.getMilliseconds();
		var isLeap = isLeapYear(year)

		// Add years.
		for (i=1;i<year;i++) {
			if (isLeapYear(i)==true) {
				ms+=31622400000;
			}
			else {
				ms+=31536000000;
			}
		}

		// Add months.
		for (x=1;x<month;x++) {
			switch (x) {
				case 4: case 6: case 9: case 11:
					ms+=2592000000;
					break;
				case 2:
					if (isLeap == true) {
						//ms+=104400000;
						ms += 2505600000;
					}
					else {
						//ms += 100800000;
						ms += 2419200000;
					}
					break;
				default: //1,3,5,7,8,10,12
					ms+=2678400000;
			}
		}

		ms+=(86400000*(day-1)); // Add days.
		ms+=(3600000*hour);	 // Add hours.
		ms+=(60000*minute);	 // Add minutes.
		ms+=(1000*second);	  // Add seconds.
		ms+=millisecond;		// Add milliseconds.

		return ms;
	}

	function isLeapYear(year) {
		var retVal=false;
		if ((year % 4)==0) {
			if ((year % 100)==0) {
				if ((year % 400)==0) {
					retVal=true;
				}
			}
			else {
				retVal=true;
			}
		}
		return retVal
	}

var EntTB = new function()
{
	var _this = this;
	
	this.onHover = function(p)
	{
		this.m_block.stop().animate({ 'marginLeft': '-129px' });
	}
	
	this.onUnhover = function(p)
	{
		this.m_block.stop().animate({ 'marginLeft': 0 });
	}
	
	this.onInviteSend = function(data)
	{
		var root = $('#ent_tb_block');
		root.find('table.ent_tb_root:first').addClass('partner_ok');
		root.switchTo('p_state', 'success');
	}
	
	this.onChangeFav = function(root, data)
	{
		$(root).find('table.ent_tb_root:first').toggleClass('fav_in', data.status == 1);
	}
	
	this.ToggleFavEx = function()
	{
		this.root.find('td.right-block:visible:first').click();
	}
	
	this.Init = function()
	{
		this.root = $('#ent_tb_block');
		this.r_block = this.root.find('td.right-block');
		this.m_block = this.root.find('table.center-block:first');
		this.r_link = this.root.find('div.right-icon:first img').hover(function(){
			$$.iHoverShow.Add(this, false, {
				'popup_filter': _this.r_block,
				'show_func': function(p){ _this.onHover(p); },
				'hide_func': function(p){ _this.onUnhover(p); }
			});
		});
	}
	
	$(function(){ _this.Init(); })

	return this;
};

function Rating() { }

Rating.VoteSuccess = function($root, data, r)
{
	$root = $($root).closest('span.vote_block');
	
	if (r.result.html)
		$root.html(r.result.html);
		
	
}
/////////////////////////////////////////////////////////////////////////
var iMap_Scroll_drag = 0;
var iMap_Scroll_x = 0;
var iMap_Scroll_x_px = 0;
var iMap_Scroll_x_dx = 0;
var iMap_maxlength = 0;
var iMap_minlength = 0;

function iMap_Scroll_BeginDrag(evn)
{
	$(document).mousemove(function(e){ iMap_Scroll_displayCoords(e);});
	var e = evn;
	if (!e)
		e = event;

	var result = $("#iMap_Scroll_pointer").offset();
	iMap_Scroll_x_dx = Math.abs(result.left - iMap_Scroll_x_px);

	iMap_Scroll_drag=true;  
	
	if (e && e.preventDefault)
		e.preventDefault();
	
	return true;
} 
function iMap_Scroll_EndDrag()
{
	iMap_Scroll_drag=false;
	 
}    
function iMap_Scroll_displayCoords(e)
{
	iMap_Scroll_x_px = e.pageX; 
	iMap_Scroll_setImage(e.pageX,e.pageY);
}	 
  
function iMap_Scroll_setImage(x,y)
{  
	$(document).mouseup(function(e){ iMap_Scroll_EndDrag(); });
	var root_container = $("#iMap_RootContainer");
	if (!root_container || !root_container.length)
		return;
		
	x = x - root_container.position().left;
	var pointer = document.getElementById("iMap_Scroll_pointer");
	
	if (pointer != null)
	{ 
		var const_left = pointer.offsetWidth/2 + iMap_Scroll_x_dx-5;
		var const_left_max = pointer.offsetWidth/2 + iMap_Scroll_x_dx-5 + $("#iMap_Scroll_LeftInfo").width();
	
		if(iMap_Scroll_drag && x>const_left_max && x<(const_left_max+document.getElementById("iMap_Scroll_line").offsetWidth)-40)
		{	
			pointer.style.left = x - const_left_max; 
			iMap_Scroll_x = x;
	
			iMap_selected_length = (x - const_left_max)*( (iMap_maxlength - iMap_minlength) / (document.getElementById("iMap_Scroll_line").offsetWidth - const_left*2));
		
			// Scroll в километрах /////////////
			MapObj.thisDist = (x - const_left_max-0.5)/(dist1);
			//						/////////////
			var showMaxDist=0;
			for (var i in MapObj.indexDist)
			{
				if (MapObj.indexDist[i] > MapObj.thisDist){ MapObj.MarkerClear(i); }
				else { MapObj.MarkerShow(i); }
			} 
		}
	}
}
function iMap_InitCarret()
{
	var carret = $("#iMap_Scroll_pointer");
	var left_info = $("#iMap_Scroll_LeftInfo");	
	var line = $("#search_result_map_root");

	carret.css("top", "-11px");
	carret.css("left",  line.width() - carret.width() - left_info.width() - 2); 
}

function iMap_Toggle ()
{
	var root = $("#iMap_RootContainer");
	var show = root.css("visibility") == "hidden";

	if (show)
	{
		root.css("left", ($(window).width() - root.width()) / 2)
		root.css("top", ($(window).height() - root.height()) / 2)	
		root.css("visibility", "visible");
		iMap_InitCarret();
	}
	else
		root.css("visibility", "hidden");
};
	
function iMap_ChangeUrlLength()
{
	var latlng = MapObj.iMapSendDist();
	if (!latlng || latlng < 0)
		return false;

	//var latOf = MapObj.indexOffice.latlng.lat().toFixed(7);
	//var lngOf = MapObj.indexOffice.latlng.lng().toFixed(7);
	//var dx = Math.abs(latlng.lat*1 - latOf*1);
	//var dy = Math.abs(latlng.lng*1 - lngOf*1)+0.35;
	var dx = latlng.lat*1;
	var dy = latlng.lng*1;
	
		dx = dx.toFixed(7);
		dy = dy.toFixed(7);
	if (dx*1 == 0 && dy*1 == 0)
	{
		dx = 0.0001;
		dy = 0.0001;
	}
//	return false;
	$("#iMap_RootContainer").css("visibility", "hidden");
	var location = "/product/ajax/search" + "?qs=" + SCloud_query_data.qs + "&ew=" + SCloud_query_data.ew;	
		location += "&dx="+dy+"&dy="+dx;	// это не опичатка кординаты x <-> y перепутаны
		
	PSSearch_UrlGo( decodeURI(location) );	
	
	$("#iMap_CancelFilter").show();
}
	
function iMap_CancelFilter ()
{
	$("#iMap_RootContainer").css("visibility", "hidden");
	$("#iMap_CancelFilter").hide();
	
	var location = "/product/ajax/search" + "?qs=" + SCloud_query_data.qs + "&ew=" + SCloud_query_data.ew;
	
	PSSearch_UrlGo( decodeURI(location) );	
}
/**
@class
@param jquery $root - 
@param obj $options - 
*/
function AjaxTable($root, options)
{
	//#region Constructor
	this.AjaxTable = true;
	$root = $($root).closest('[AjaxTable]');
	
	this.$root = $root;
	_this = this;
	$root.data('AjaxTable', this);
	
	this.options = object_merge({}, options);
	
	this.$content = $content = $root.find('[AjaxTableContent]:first');
	this.$checked_count = $root.find('[AjaxTableCheckedCount]:first');
	this.$all_count = $root.find('[AjaxTableAllCount]:first');
	
	//#endregion
	
	//#region GetCheckboxList
	this.GetCheckboxList = function($container)
	{
		if (!$container) $container = $root;
		
		var $list = $container.find('input:checkbox[AjaxTableCheck]');
		return $list;
	}
	//#endregion
	
	//#region GetChecked
	this.GetChecked = function (attr)
	{
		var $list = this.GetCheckboxList();
		var rreturn = [];
		$list.each(function()
		{
			if ($(this).prop('checked')) 
			{
				if (attr) rreturn.push($(this).attr(attr));
				else rreturn.push($(this).val());
			}
		});
		
		return rreturn;
	}
	//#endregion
	
	//#region onChackboxChanged
	this.onCheckboxChanged = function($p)
	{
		var $checked = this.GetChecked();
		this.$checked_count.html($checked.length);
		
		var all_count = this.GetCheckboxList().length;
		this.$all_count.html(all_count);
		
		if (this.options.onCheckChanged)
		{
			this.options.onCheckChanged(this, $checked, all_count);
		}
		
	}
	//#endregion
	
	
	//#region CheckRow
	this.CheckById = function(id, cmd)
	{
		var $row = this.FindRow(id);
		var $checkbox = this.GetCheckboxList($row);
		this.Check($checkbox, cmd);
		this.onCheckboxChanged(null);
	}
	
	//#endregion
	
	
	//#region CheckAll
	this.CheckAll = function(cmd)
	{
		this.GetCheckboxList().each(function()
		{
			_this.Check(this, cmd);
		});
		
		this.onCheckboxChanged(null);
	}
	//#endregion
	
	
	//#region Check
	this.Check = function($checkbox, cmd)
	{
		$checkbox = $($checkbox);
		var new_state = true;
		
		if (cmd == 'set')
			new_state = true;
		else if (cmd == 'unset')
			new_state = false;
		else if (cmd == 'inverse')
			new_state = $checkbox.prop('checked') ? false : true;
			
		$checkbox.prop('checked', new_state);
	}
	//#endregion
	
	
	//#region FindRow
	this.FindRow = function(id)
	{
		return $content.find('[AjaxTableRow='+ id +']');
	}
	//#endregion
	
	//#region FindRows
	this.FindRows = function(ids)
	{
		var $rreturn = $(null);
		
		$(ids).each(function(){
			$rreturn = $rreturn.add(_this.FindRow(this));
		})
		
		return $rreturn;
	}
	//#endregion
	
	
	
	
	
	this.GetResult = function(r, status)
	{
		var rreturn = {};
		
		$.each(r.result.rows, function(key){
			if (this.status == status) rreturn[key] = this;
		});
		
		return rreturn;
	}
	
	this.GetResultIds = function(result)
	{
		var ids = [];
		$.each(result, function(key)
		{
			ids.push(key);
		});
		
		return ids;
	}
	
	
	this.SuccessSwitch = function(r, name, new_state, state_attr)
	{
		var result = this.GetResult(r, 'ok');
		
		var ids = this.GetResultIds(result);
		if (ids.length > 0)
		{
			var $rows = this.FindRows(ids);
			
			state_attr = state_attr || 'state';
			if (name)
				$rows.find('[AjaxTableSwitcher=' + name + ']').switchTo(state_attr, new_state);
			else
				$rows.switchTo(state_attr, new_state);
			
			$rows.each(function()
			{
				var $p = $(this);
				$p.find('[AjaxTableErrorMessage]').hide()
			});
		}
	}
	
	this.SuccessReplace = function (r)
	{
		var result = this.GetResult(r, 'ok');
		
		var ids = this.GetResultIds(result);
		if (ids.length > 0)
		{
			//var $rows = this.FindRows(ids);
			
			$.each(result, function(id)
			{
				var $_html = $(this.html);
				var $html = $(null);
				
				$_html.each(function(){
					if (this.nodeType == 1) $html = $html.add(this);
				});
				
				var $rows = _this.FindRow(id);
				
				$rows.each(function(i)
				{
					$(this).replaceWith($html[i]);
				});
			});
			
		}
	}
	
	this.SuccessUser = function (r, onDo, onDoItem)
	{
		var result = this.GetResult(r, 'ok');
		
		var ids = this.GetResultIds(result);
		
		if (onDo) onDo.call(this, r, ids);
		
		if (ids.length > 0 && onDoItem)
		{
			$.each(result, function(id)
			{				
				var $rows = _this.FindRow(id);
				
				$rows.each(function(i)
				{
					onDoItem.call(this, $(this));			
				});
			});			
		}
	}
	
	this.ErrorMessage = function(r)
	{
		var result = this.GetResult(r, 'error');
		
		var ids = this.GetResultIds(result);
		if (ids.length > 0)
		{
			var $rows = this.FindRows(ids);
			
			$rows.each(function()
			{
				var $p = $(this);
				var errors = result[$p.attr('AjaxTableRow')].errors;
				var text = errors[0] ? errors[0].text : errors.text;
				
				$p.find('[AjaxTableErrorMessage]').html(text).show();
			});
			
		}	
	}
	
	
	
	this.GetCheckboxList().change(function(e){
		_this.onCheckboxChanged(this);
	});
	
	this.onCheckboxChanged(null);
}
/** @static */
AjaxTable.FindRoot = function($p)
{
	return $($p).closest('[AjaxTable]');
}
/** @static */
AjaxTable.GetObject = function($p)
{
	if ($p && $p.AjaxTable) return $p;
	
	return AjaxTable.FindRoot($p).data('AjaxTable');
}
/** @static */
AjaxTable.CheckById = function($p, id, cmd)
{
	var obj = AjaxTable.GetObject($p);
	obj.CheckById(id, cmd);
}
/** @static */
AjaxTable.CheckAll = function($p, cmd)
{
	$p = $($p);
	var obj = AjaxTable.GetObject($p);
	if (cmd == 'auto')
	{
		cmd = $p.prop('checked') ? 'set' : 'unset';
	}
	obj.CheckAll(cmd);
}
/** @static */
AjaxTable.GetChecked = function($p, attr)
{
	var obj = AjaxTable.GetObject($p);
	return obj.GetChecked(attr);
}


//#region Обработчики
/** @static */
AjaxTable.SuccessSwitch = function($p, r, name, new_state, state_attr)
{
	var obj = AjaxTable.GetObject($p);
	return obj.SuccessSwitch(r, name, new_state, state_attr);
}
/** @static */
AjaxTable.SuccessReplace = function($p, r)
{
	var obj = AjaxTable.GetObject($p);
	return obj.SuccessReplace(r);
}
/** @static */
AjaxTable.SuccessUser = function($p, r, onDo, onDoItem)
{
	var obj = AjaxTable.GetObject($p);
	return obj.SuccessUser(r, onDo, onDoItem);
}
/** @static */
AjaxTable.ErrorMessage = function($p, r)
{
	var obj = AjaxTable.GetObject($p);
	return obj.ErrorMessage(r);
}


//#endregion
function GroupFinder(root, options)
{
	this.root = $(root);
	this.options = options || { };
	var _this = this;
	this.timer = null;
	this.options.list_height = this.options.list_height || 250;
	this.idle_block = this.root.find("div[gf_state=idle]");
	this.list_st_block = this.root.find("div[gf_state=list]");
	this.input = this.idle_block.find("input:first");
	this.list_block = this.root.find("div.list_root");
	this.list_cb = this.list_block.find("div.list_wrap");
	this.gf_input = this.list_block.find("input.gf_qs")
		.bind('keyup', function(event) { if(event.keyCode != 13) _this.FindGroups_tmr(); })
		.bind('keydown', function(event) { if(event.keyCode == 13) { _this.FindGroups(); return false; } });
	
	this.dd_list = null;
	this.dd_tpl = this.root.find('div[dd_tpl]:first').children(':first');
	this.def_size = {
		"width" : this.root.css('width'),
		"height" : this.root.css('height')
	};
	
	this.list_size = {
		"width" : '100%',//this.root.parent().width(),
		"height" : this.options.list_height + (this.options.list_multi ? 28 : 0)
	};
	
	// Задаем высоту прокручиваемых блоков внутри
	this.list_cb.height(this.options.list_height - 45);
	this.list_block.find('div.sel_wrap:first').height(this.options.list_height - 45);
	
	if(this.options.list_multi)
	{
		this.button = this.idle_block.find('table.multi_btn:first').click(function(){ _this.LoadList(); });
		this.counter = this.button.find('span.sel_cnt:first');
		this.selected = this.options.value || [ ];
		this.cb_counter = this.list_block.find("span.list_sel_cnt");
		this.list_block.find('button[apply_btn]').click(function(){ _this.ApplyMultiSelect(); });
		this.list_block.find('a[cancel_btn]').click(function(){ _this.CloseList(); return false; });
		this.tabs = this.list_block.find('[tab]').click(function(){ _this.SwitchTab(this); });
		this.tabs_cb = this.list_block.find('table[tabs_cb]');
		this.sel_list = this.tabs_cb.find('div.sel_list');
		this.input.val(array_implode(';', this.selected));
	}
	else
	{
		// Заточки под "усмиренный" DD_List
		this.button = this.idle_block.click(function(){ _this.LoadList(); });
	}
	
	this.list_url = this.options.list_url;
	
	this.AjaxLoader = new AjaxMaster({
		beforeSend: function (data){
			if(_this.list_cb.is(":parent"))
			{
				_this.OpenList();
				return false;
			}
			return true;
		},
		success: function (r, data, request_data){
			_this.onListReady(r.result.html);
		},
		error: function(status, r, data, request_data){
			_this.root.switchTo("gf_state", "idle");
		}
	});
	
	// Callback для аякса загружающего список групп
	this.onListReady = function(html)
	{
		this.root.find("img.icon_close").click(function(){ _this.CloseList(); });
		this.list_cb.html(html);
		this.groups = this.list_cb.find("div[group_root]");
		this.names = this.list_cb.find("span.name");
		this.names.each(function(i){
			$(this).data("_orig_name", $(this).html());
		});
		this.subgroups = this.list_cb.find('a.a_subgroup').bind('click', function() { _this.SelectGroup(this); });
		this.OpenList();
		if(this.options.list_multi) this.ApplyMultiSelect(true);
	}
	
	this.GetDD_List = function()
	{
		if(!this.dd_list) this.dd_list = this.idle_block.find("table[_field_type=DD_List]").data("JsControl");
		return this.dd_list;
	}
	
	// Загрузить, если не загружен, и развернуть список групп
	this.LoadList = function()
	{
		this.root.switchTo("gf_state", "loading");
		this.AjaxLoader.Send(this.list_url);
	}
	
	// Развернуть список("снаружи" юзать LoadList!)
	this.OpenList = function()
	{
		this.root.switchTo("gf_state", "list").addClass("gf_opened");
		var cb = this.list_st_block.hide();
		this.root.animate(this.list_size, "fast", false, function(){ _this.gf_input.val(''); _this.list_st_block.show(); });
		if(this.options.list_multi)
		{
			for(var i in this.selected)
				this.SelectGroupMulti(this.list_cb.find('div[subgroup='+ this.selected[i] +']').find('a:first'), true);
			this.SwitchTab(this.tabs.filter('[tab=list]'));
		}
	}
	
	// Свернуть список. Сохранять изменения нужно ДО ее вызова!
	this.CloseList = function()
	{
		this.list_st_block.hide();
		this.root.animate(this.def_size, "fast", false, function(){
			_this.root.removeClass("gf_opened").switchTo("gf_state", "idle");
			if(_this.options.list_multi)
			{
				_this.list_cb.find('a.a_selected').removeClass('a_selected');
				_this.sel_list.empty();
				_this.input.val(array_implode(';', _this.selected));
				if(_this.options.onChange) _this.options.onChange(_this.selected);
			}
			else
			{
				var dd_list = _this.GetDD_List();
				if(dd_list.input.val() == -1) dd_list.SetValue('');
			}
			
			setTimeout(function(){ _this.gf_input.val(''); _this.FindGroups();}, 100);
		});
	}
	
	// Поиск по группам
	this.FindGroups = function()
	{
		var qs = this.gf_input.val();
		
		if(this.options.list_multi) this.SwitchTab(this.tabs.filter('[tab=list]'));
		
		// Свернем все РАЗВЕРНУТЫЕ группы
		this.groups.filter(".group_opened").removeClass("group_opened").find("div[subs]").hide();
		
		// Очистим подсветку предыдущего поиска
		this.names.filter(":has(span)").each(function(i){
			var el = $(this);
			el.html(el.data("_orig_name"));
		});
		
		var result = { matched : [], unmatched : [] };
		
		// Не начинаем поиск, если ввели меньше трех символов
		if(qs.length < 3)
		{
			// Выводим все группы свернутыми
			this.groups.show().find("div[subs]").hide();
			this.subgroups.closest('[subgroup]').show();
			return false;
		}
		
		this.names.each(function(i){
			var el = $(this);
			var orig_name = el.data("_orig_name");
			
			if(orig_name.search(RegExp(qs, 'i')) != -1)
			{
				el.html(orig_name.replace(RegExp(qs, 'ig'), '<span class="gf-hl">$&</span>'));
				var sub_root = el.closest("div[subgroup]");
				// Совпало в подразделе
				if(sub_root.length)
				{
					sub_root.show().closest("div[subs]").show();
					// Сохраняем его корневой раздел в массив
					result.matched.push(sub_root.closest('[group_root]').attr("group_root"));
				}
				// Совпало в корневом разделе
				else
				{
					el.closest('div[group_root]').show();
				}
			}
			else
			{	
				var sub_root = el.closest("div[subgroup]");
				if(sub_root.length)
				{
					// Подразделы без совпадений просто скрываем
					sub_root.hide();
				}
				else
				{
					// Корневые разделы без совпадений сохранем в массив
					result.unmatched.push(el.closest('div[group_root]').attr("group_root"));
				}
			}
		});
		
		for(var i in result.unmatched)
		{
			// Если элемент массива "без совпадений" есть в массиве "совпавших от подразделов" - отображаем, иначе скрываем
			this.groups.filter("[group_root="+ result.unmatched[i] +"]").toggle(in_array(result.unmatched[i], result.matched));
		}
	}
	
	// Обработчик keyup в поле поиска(задерка после ввода символа)
	this.FindGroups_tmr = function()
	{
		if(this.timer) clearTimeout(this.timer);
		this.timer = setTimeout(function(){ _this.FindGroups(); }, 300);
	}
	
	// Применить мультивыбор, и закрыть список
	this.ApplyMultiSelect = function(no_close)
	{
		var sel = this.subgroups.filter('.a_selected');
		var count = sel.length;
		this.selected = [ ];
		
		// Собираем новый массив выделенных групп, сохранение в CloseList
		sel.each(function(){
			var el = $(this);
			var id = el.closest('div[subgroup]').attr('subgroup');
			_this.selected.push(id);
		});
		
		this.counter.html(count);
		this.cb_counter.html(count);
		this.button.toggleClass("btn_active", count > 0);
		if(!no_close) this.CloseList();
	}
	
	this.RecalcSelected = function(no_animate)
	{
		var sel = this.subgroups.filter('.a_selected');
		var cnt = sel.length;
		var value = '';
		var vals = [];
		
		// Пишем значения в input, на всякий случай...
		sel.each(function(){
			var el = $(this);
			var id = el.closest('div[subgroup]').attr('subgroup');
			if(value) value += ';';
			value += id;
			vals.push(id);
		});
		this.input.val(value);
		
		// Меняем значение счетчика
		if(no_animate) this.cb_counter.html(cnt);
		else
		{
			this.cb_counter.fadeOut("fast", function(){
				_this.cb_counter.html(cnt);
				_this.cb_counter.fadeIn("fast");
			});
			// no_animate = true только при открытии списка, значения тогда не меняются
			if(_this.options.onChange) _this.options.onChange(vals);
		}
		// Если ничего не выбрано, то в список переключаем на заглушку
		if(cnt > 0) this.tabs_cb.switchTo("sel_mode", "list");
		else this.tabs_cb.switchTo("sel_mode", "ph");
	}
	
	// Выбор группы при list_multi=true
	this.SelectGroupMulti = function(p, no_animate)
	{
		var el = $(p);
		var id = el.closest('[subgroup]').attr('subgroup');
		el.toggleClass("a_selected");
		if(el.hasClass("a_selected"))
		{
			var item = this.dd_tpl.clone().attr('sel_item', id).appendTo(this.sel_list);
			var name = el.find('span.name:first').text();
			//if(el.attr("sub_is_similar"))
				name = name.concat(' &mdash; ', el.closest("div[group_root]").find('a.group_root span.name:first').text());
				
			item.find('span').html(name);
			item.find('img').click(function(){ _this.UnselectGroupMulti(id); });
		}
		else
			this.sel_list.find('[sel_item='+ id +']').remove();
			
		this.RecalcSelected(no_animate);
	}
	
	// Снять выбор с группы
	this.UnselectGroupMulti = function(id)
	{
		this.sel_list.find('[sel_item='+ id +']').remove();
		this.list_cb.find('div[subgroup='+ id +']').find('a:first').removeClass('a_selected');
		this.RecalcSelected();
	}
	
	// Выбор группы в "одиночном" режиме
	this.SelectGroup = function(p)
	{
		if(this.options.list_multi)
		{
			this.SelectGroupMulti(p);
			return false;
		}
		
		var el = $(p);
		var id = el.closest('div[subgroup]').attr('subgroup');
		var dd_list = _this.GetDD_List();
		
		// Если еще нет элемента с таким id
		if(!dd_list.droplist.find('a[node_id='+ id +']').length)
		{
			var tpl = this.dd_tpl.clone();
			var name = el.find('span.name:first').text();
			
			//if(el.attr("sub_is_similar"))
				name = name.concat(' &mdash; ', el.closest("div[group_root]").find('a.group_root span.name:first').text());
			
			tpl.find('a:first').html(name).attr('node_id', id);
			tpl.insertBefore(dd_list.droplist.find('a.link_other:first'));
		}
		
		dd_list.SetValue(id);
		this.CloseList();
	}
	
	// Переключение вкладок в списке мультивыбора(принимает кнопку вкладки)
	this.SwitchTab = function(p)
	{
		var el = $(p);
		var id = el.attr('tab');
		this.tabs.removeClass('curr-tab curr-tab-blue');
		el.addClass(id == 'selected' ? 'curr-tab-blue' : 'curr-tab');
		this.tabs_cb.toggleClass('bg_blue', id == 'selected').switchTo('curr_tab', id);
	}
}

function GF_DD_onChange(obj)
{
	var value = obj.input.val();
	obj.root.closest("div[gf_state=idle]").toggleClass("group_ok", value != '');
	var gf = obj.root.getJsControl("GroupFinder");
	if(gf && gf.options.onChange && value != -1) gf.options.onChange([value]);
}

function GF_DD_onToggle(obj, state)
{
	// Заточки под "усмиренный" DD_List
	//obj.root.closest("div[_field_type=GroupFinder]").toggleClass("gf_dd_fix", state);
	if(state) return false;
}

function GF_LoadList(p)
{
	($(p).getJsControl("GroupFinder")).LoadList();
}

function GF_ToggleSubgroups(p)
{
	var root = $(p).closest("div[group_root]");
	var subs = $(p).siblings("div[subs]");
	var subgroups = subs.find('div[subgroup]:hidden');
	if(subs.is(":hidden"))
	{
		subgroups.show();
		subs.show();
		root.addClass("group_opened");
	}
	else if(subgroups.length)
	{
		subgroups.show();
		root.addClass("group_opened");
	}
	else
	{
		root.removeClass("group_opened");
		subs.hide();
	}
}

// JavaScript Document  
//очищает поля кода
var demo = $(".text");
var text = "Здесь появится код настроенного информера";
demo.attr('ntext', text);
demo.attr('value', text);
					

$("td[code]").click(selInfCell);
var currInfCell = null;
var infError = null;
function getDemo(text)
{
	var caption = $("input[name=title]").attr("value");
	var title = encodeURI(caption);	
	if (!title)
	{
		//title = $("input[name=title]").attr("def");
		if (text.indexOf("<title>") > 0 || text.indexOf("<caption>") > 0)
			infError = "не указан <b>" + $("[title_name]").html() + "</b>";
		return text;
	}
	caption = caption.replace('"', '&quot;');
	return text.replace("<title>", title).replace("<caption>", caption);
}
function getCode(text)
{
	var url = encodeURI($("input[name=domain]").attr("value"));
	if (!url)
	{
		url = $("input[name=domain]").attr("def");
		if (text.indexOf("<url>") > 0)
			infError = "не указан <b>" + $("[domain_name]").html() + "</b>";
	}
	return getDemo(text.replace(/(^&nbsp;+)|(^\s+)|(&nbsp;){2,}|( {2,})|(&nbsp;+$)|(\s+$)/g, '')).replace("<url>", url);
}
function selInfCell(e)
{
	if (currInfCell)
	{
		if (currInfCell.get(0) == this) return;
		
		currInfCell.removeClass("inf_cell_sel");
		if ($(this).attr('code') != currInfCell.attr('code'))
		{
			$("#" + currInfCell.attr('code') + "_error").css("visibility", "hidden");		
			var demo = $("#" + currInfCell.attr('code'));
			demo.attr('value', demo.attr('ntext'));
			demo.addClass("none");
		}
	}
	
	currInfCell = $(this);
	showInfCode();
}
function showInfCode()
{
	currInfCell.addClass("inf_cell_sel");
	infError = null;
	var code = $(currInfCell);
	var text = getCode(code.find('textarea').attr("value"));
	if (infError)
	{
		$("#" + code.attr('code') + "_error").css("visibility", "visible").html(infError);
		var demo = $("#" + code.attr('code'));
		demo.attr('value', demo.attr('ntext'));
		demo.addClass("none");
	}
	else 
	{
		$("#" + code.attr('code') + "_error").css("visibility", "hidden");
		$("#" + code.attr('code')).attr('value', text).removeClass("none");		
	}
}
function updateDemoInf(e)
{
	var title = $("input[name=title]").attr("value");
	if (title) $("td[code] [t]").html(title);
	
	if (currInfCell) showInfCode();
}
function keyUpdateDenoInf(event)
{
	if(event.keyCode==13) updateDemoInf(event);
};

function CSlider(options)
{
	this.options = $.extend({
		rootName: '#slides_root',
		indicatorName: '#current_slide'
	}, options);
	
	var _this = this;
	this.root = $(this.options.rootName);
	this.indicator = $(this.options.indicatorName);
	this.current_slide = 1;
	this.slides_count = this.root.find('[slide]').length;
	this.timer = false;
	this.is_slideshow = false;


	this.SlideToNum = function (num)
	{
		//this.SlideshowResetInterval();
		var duration = num - this.current_slide;
		if(duration == 0 || num < 1 || num > this.slides_count) return false;
		
		if(duration > 0) var slide_param = "-=" + this.options.width * duration;
		else var slide_param = "+=" + this.options.width * Math.abs(duration);
		this.current_slide = num;
		
		var indicator = this.indicator;
		
		indicator.find('[slide]').replaceClass('slide_curr', 'slide_none').filter('[slide=' + num +']').replaceClass('slide_none', 'slide_curr');
		
		
		this.root.animate(
			{ marginLeft:slide_param },
			500,
			function (){
				_this.SlideshowResetInterval();
				_this.SlideCB();
			}
		);
		
		ConsoleLog("Num: %d, Curr: %d, Count: %d", num, this.current_slide, this.slides_count);
	}
	
	this.SlideCB = function()
	{
		if(this.options.callback)
			this.options.callback(this);
	}
	
	this.NextSlide = function (is_reverse)
	{
		if(is_reverse)
		{
			var num = this.current_slide - 1;
			if(num < 1)
			{
				num = this.slides_count;
				_this.root.fadeOut('slow', function(){
					_this.root.css( 'margin-left', -(_this.options.width * (num - 1)) );
					_this.root.fadeIn('slow');
					_this.current_slide = num;
				});
				ConsoleLog(num, _this.options.width * (num - 1));
				return false;
			}
		}
		else
		{
			var num = this.current_slide + 1;
			if(num > this.slides_count)
			{
				num = 1;
				
				_this.Reset();
				
			}
		}
		this.SlideToNum(num);
	}
	
	this.PrevSlide = function ()
	{
		this.NextSlide(true);
	}
	
	this.StopSlideshow = function(disable)
	{
		if (this.timer)
		{
			clearTimeout(this.timer);
			this.timer = false;
		}
		if(disable) this.is_slideshow = false;
	}
	
	this.StartSlideshow = function(delay, is_hover)
	{
		if(!this.is_slideshow && is_hover) return false;
		this.StopSlideshow();
		this.timer = setTimeout(function() { _this.NextSlide(); }, delay);
		if(!this.is_slideshow)
		{
			this.is_slideshow = true;
			this.root.hover(
				function() { _this.StopSlideshow(); },
				function() { _this.StartSlideshow(delay, true); }
			);
		}
	}
	
	this.SlideshowResetInterval = function()
	{
		if (!this.options.delay) return;
		
		if (this.timer)
		{
			clearInterval(this.timer);
			this.timer = false;
			
			this.timer = setTimeout(function() { _this.NextSlide(); }, _this.options.delay);
		}
		
	}
	
	this.Reset = function()
	{
		this.SlideshowResetInterval();
		this.root.hide();
		this.root.css('margin-left', 0);
		this.root.fadeIn('fast');
		this.indicator.find('[slide]').replaceClass('slide_curr', 'slide_none').filter('[slide=1]').replaceClass('slide_none', 'slide_curr');
		this.current_slide = 1;
		this.SlideCB();
	}
	
	if(options.delay) this.StartSlideshow(options.delay);
}
/** Управление панелькой редактирования настроек списка
@param JQuery $root - Корневой элемент
*/
function ListEditPanel(root)
{
	this.root = $(root);
	this.button = this.root.closest('[list_header]').find('[button_view]');
	this.cut = this.root.find('[cut]');
	this.listbox = this.root.find('[mode_selector] input').data('ListBox');
	this.form = this.root.find('form');
	this.submit_button = this.root.find('[submit_button]');
	var _this = this;
	this.root.find('[close_link]').click(function() { _this.Hide(); });

	this.Show = function()
	{
		this.ResetForm();
		this.root.show();
		this.button.addClass('button_on');
		this.cut.css('left', this.button.position().left + this.button.width() / 2);
	}

	this.Hide = function()
	{
		this.root.hide();
		this.button.removeClass('button_on');
	}

	this.Toggle = function()
	{
		if(this.root.is(':hidden')) this.Show();
		else this.Hide();
	}

	this.ResetForm = function()
	{
		if(this.listbox) this.listbox.Reset();
		this.form.get(0).reset();
		this.submit_button.addClass('op50');
	}
}

function EntBlocks_onBefore($root, data)
{
	return !$root.find('[submit_button]').hasClass('op50');							
}

/** Контрол для блоков на главной минисайтов
@param mix $root - Корневой блок
*/
function EntBlocks_onSuccess($root, r, data, request_data)
{
	var block = $root.closest('[block_id]');	
	block.find('[list_root]').html(r.result.html);
	$root.find('[submit_button]').addClass('op50');
	
	var _listbox = $root.find('[mode_selector] input').data('ListBox');
	if(_listbox)
		_listbox.options.initValue = _listbox.GetValue();
}
function EntBlocks(root)
{
	this.root = $(root);
	this.temp_block = this.root.find();
	this.blocks;
	this.adder = this.root.find('[adder_block]');
	this.preloader_tpl = this.root.find('[preloader_tpl] table');
	this.save_ajax = false;
	var _this = this;

	// [ре]инициализация блоков, также перестраивает массив блоков
	this.InitBlocks = function()
	{
		this.blocks = new Array();
		this.root.find('[block_id]:visible').each( function(index) {
			var block = $(this);
			_this.blocks[index] = block.attr('block_id');

			if(!block.data('_block_init'))
			{
				var buttons = block.find('[list_header] .edit_block');
				var edit_panel = block.find('[list_header] [edit_panel]');
				var block_id = block.attr('block_id');

				// Инициализируем панельку настроек
				if(edit_panel.length)
				{
					var edit_panel_obj = new ListEditPanel(edit_panel);
					buttons.find('[button_view]').click(function() { edit_panel_obj.Toggle(); });
					var _listbox = edit_panel.find('[mode_selector] input').data('ListBox');

					var edit_form = edit_panel.find('form:first');
					var submit_button = edit_panel.find('[submit_button]');
					edit_form.bind('change', function() { submit_button.removeClass('op50'); });

					// Аякс для панели настроек
					edit_panel.attr('_ajax_success', 'EntBlocks_onSuccess(root, r, data, request_data)');					
				}

				// Вешаем клики на кнопалки
				buttons.find('[button_up]').click(function() { _this.SlideUp(block_id); });
				buttons.find('[button_down]').click(function() { _this.SlideDown(block_id); });
				buttons.find('[button_hide]').click(function() { _this.Hide(block_id); });
				buttons.find('[button_delete]').click(function() { _this.Delete(block_id); });
				buttons.find('[button_edit_js]').click(function(e) {
					/*$$.PopupHtmlEditor.Show(true, block_id, block.find('[list_root]').html(),
						function(db_value, html_value) { _this.SetContent(block_id, db_value, html_value) }
					);
					*/	
					_this.TextBlockEditStart(block_id, block.find('[list_root]').html());
				});

				block.data('_block_init', true);
			}
		});
	}

	this.GetTopBlock = function()
	{
		return this.root.find('[block_id]:visible:first');
	}

	// Выше
	this.SlideUp = function(block_id)
	{
		if(this.blocks.length < 2) return false;

		for(id=0; id < this.blocks.length; id++)
		{
			if(this.blocks[id] == block_id)
			{
				if(id==0) return false;
				var prev = this.blocks[id-1];
				this.root.find('[block_id=' + block_id + ']').insertBefore(this.root.find('[block_id=' + prev + ']'));
				this.SaveSequence();
				return true;
			}
		}
	}

	// Ниже
	this.SlideDown = function(block_id)
	{
		if(this.blocks.length < 2) return false;

		for(id=0; id < this.blocks.length; id++)
		{
			if(this.blocks[id] == block_id)
			{
				if(id == this.blocks.length-1) return false;
				var next = this.blocks[id+1];
				this.root.find('[block_id=' + block_id + ']').insertAfter(this.root.find('[block_id=' + next + ']'));
				this.SaveSequence();
				return true;
			}
		}
	}

	

	// Удалить текстовый блок
	this.Delete = function(block_id, no_confirm)
	{
		var block = this.root.find('[block_id=' + block_id + ']');
		var page_id = block.attr('page_id');

		if(no_confirm || confirm("Внимание! После удаления блока все его содержимое невозможно будет восстановить. Вы действительно хотите удалить блок?"))
		{
			block.remove();
			this.SaveSequence();

			// Удаляем сам блок
			var del_ajax = $.ajax({ 'type': 'post', 'url': '/entsite/blocks/ajax/delete_page',
				"data": { 'id' : page_id },
				"complete": function(data, status){
					
					if (status == 'abort') return;

					if (status == "success")
					{
						var r = new AjaxResponse(data);
						// Проверка на ошибку
						if (r.isError())
						{
							// вывод сообщения об ошибке(ах)
							r.alertErrors();
						}
						
					}
				}
			});
		}
	}

	// Скрыть блок
	this.Hide = function(block_id)
	{
		this.root.find('[block_id=' + block_id + ']').hide();

		this.adder.addClass('adder_block_active');
		setTimeout(function(){ _this.adder.removeClass('adder_block_active'); }, 5000);
		this.SaveSequence();
	}

	// Добавить блок
	this.Add = function(block_id)
	{
		var block = this.root.find('[block_id=' + block_id + ']');

		// Если блок уже есть, но скрыт
		if(block.length)
		{
			if(block.is(':hidden'))
			{
				// Находим первый блок
				var top = this.GetTopBlock();
				// Если нашли, и это не он же - пихаем в начало
				if(top && top.attr('block_id') != block_id) block.insertBefore(top);
				block.show();
				this.SaveSequence();
			}
		}
		// Иначе грузим
		else
		{
			// Вставляем блок-прелоадер
			var preloader = this.preloader_tpl.clone();
			var top = this.GetTopBlock();
			if(top.length) preloader.insertBefore(top);
			else preloader.appendTo(this.root);

			// Если такой блок уже грузится - игнорим запрос
			var load_ajax = this.root.data('_ajax_load_' + block_id);
			if(load_ajax && block_id != "page") return false;

			load_ajax = $.ajax({ 'type': 'post', 'url': '/entsite/blocks/ajax/block',
				"data": { 'module' : block_id },
				"complete": function(data, status){
					
					if (status == 'abort') return;

					if (status == "success")
					{
						var r = new AjaxResponse(data);
						// Проверка на ошибку
						if (r.isError())
						{
							// вывод сообщения об ошибке(ах)
							r.alertErrors();
						}
						
						else
						{
							// Все хорошо
							var block = $(r.result.html).insertBefore(preloader);
							var block_id_new = block.attr('block_id');
							_this.SaveSequence();

							if (block_id_new.match(/^page_/))
							{
								/*$$.PopupHtmlEditor.Show(true, block_id_new, block.find('[list_root]').html(),
									function(db_value, html_value) { _this.SetContent(block_id_new, db_value, html_value); },
									function() { _this.Delete(block_id_new, true); }
								);*/
								
								_this.TextBlockEditStart(block_id_new, block.find('[list_root]').html(), true);
								
								
							}
						}

						preloader.remove();
					}
				}
			});

			// Сохраняем аякс данного блока, для проверки выше
			this.root.data('_ajax_load_' + block_id, load_ajax);
		}

	}
	
	this.TextBlockEditStart = function(block_id, old_value, delete_if_cancel)
	{
		var block = this.root.find('[block_id=' + block_id + ']');
		var page_id = block.attr('page_id');
		if (!page_id) return false;
		
		AjaxDlg.ShowPopup('/feedback/ajax/html_editor_dlg?width=700&height=400&entskin=1', false, { }, 
			{ 
				'text' 			: old_value, 
				'onOk' 			: 
					function($dlg, db_value, html_value, data) 
					{
						$dlg.find('form:first').AjaxSend({ 'id' : page_id, 'content' : db_value, 'text': '' }, '/entsite/blocks/ajax/save_page'); 
						
						block.find('[list_root]').html(html_value);
						return true; 
					},
					
				'onAfterSave'		:
					function($dlg)
					{
						AjaxDlg.Close($dlg);
					},
					
				'onCancel'		:
					function()
					{
						if (delete_if_cancel)
							_this.Delete(block_id, true);
					},
					
				'html_editor'		: { 'module' : 'entsite_page', 'card_id' : page_id }
			}
		);
	}

	this.SaveSequence = function()
	{
		// Пересчитываем порядок блоков
		this.InitBlocks();

		// Скрываем ссылки в списке "Скрытые блоки"
		var has_hidden = false;
		this.adder.find('.list_node').each(function() {
			var el = $(this);
			if( in_array(el.attr('node_id'), _this.blocks) ) el.addClass('hidden');
			else
			{
				el.removeClass('hidden');
				has_hidden = true;
			}
		});
		// Если нет скрытых - пишем "Нет скрытых блоков"
		if(has_hidden) this.adder.switchTo('adder_state', 'dd');
		else this.adder.switchTo('adder_state', 'none');

		// Лепим сроку
		var blocks_str = ';';
		for(i=0; i < this.blocks.length; i++) blocks_str += (this.blocks[i] + ';');

		// Отбиваем предыдущий запрос
		if(this.save_ajax) this.save_ajax.abort();

		// Отправляем...
		this.save_ajax = $.ajax({ 'type': 'post', 'url': '/entsite/blocks/ajax/set_sequence',
			"data": { "sequence" : blocks_str },
			"complete": function(data, status){
				
				if (status == 'abort') return;

				if (status == "success")
				{
					var r = new AjaxResponse(data);
					// Проверка на ошибку
					if (r.isError())
					{
						// вывод сообщения об ошибке(ах)
						r.alertErrors();
					}
					
					else
					{
						// Все хорошо
					}
				}
			}
		});
	}
}
function FileViewer()
{
}

FileViewer.Show = function($p)
{
	$p = $($p);
	var $list_root = $p.closest('[_file_viewer_s]');
	
	var ids = '', card_id = '', s = '', view_ids = '', module = '';
	if ($list_root.length > 0)
	{
		ids = $list_root.attr('_file_viewer_ids') || '';
		card_id = $list_root.attr('_file_viewer_card') || '';
		module = $list_root.attr('_file_viewer_module') || '';
		view_ids = $list_root.attr('_file_viewer_view_ids') || '';
		s = $list_root.attr('_file_viewer_s');
	}
	
	var id = $p.closest('[_file_item]').attr('_file_item');
	
	
	AjaxDlg.ShowPopup('/file/ajax/viewer_dlg?view_ids='+ view_ids +'&ids='+ids + (card_id ? '&card_id='+ card_id : '') + (module ? '&module='+ module : '') + '&s='+ s, false, false, 
		{
			'show_id'	: id
		}
	);
}

// Удаление файла из вьювера
FileViewer.DeleteFile = function($p, id, deleted)
{
	$p = $($p);
	
	deleted = GetInt(deleted);
	
	FileHelper.ToggleFileBlocks(id, deleted == 0);
	
	var $this_block = $p.closest('[_file_item_big]');
	if ($this_block.length)
	{
		$this_block.show();
		$this_block.attr('_file_viewer_item_deleted', deleted);
	}
}


function FileHelper(){}

FileHelper.ToggleFileBlocks = function(id, show)
{
	var $blocks = $('[_file_item='+ id +']');
	
	$blocks.showHide(show);
	
}

FileHelper.ToggleActivity = function($p, set)
{
	$p = $($p);
	$p.closest('[_file_item]').fadeTo('fast', set ? 1 : 0.5);	
}

FileHelper.ShowEditBlock = function(p)
{
	var block = $(p).find('div[file_edit_block]').stop().animate({'top': '1px'}, 'fast');
	iHidderInit(block, p, function(){
		block.stop().animate({'top': '-16px'}, "fast");
	});
}

FileHelper.ShowFile = function(p, type)
{
	if(type == 'video')
	{
		var el = $(p);
		var item = el.closest('div[_file_item]');
		var flash_tpl = item.find('div[flash_tpl]:first').children(':first');
		var big_block = el.closest('div[card_root]').find('div[FilesPlaceBlock]:first');
		var target = $('<div class="flash_item_big">').appendTo(big_block);
		var item_h = flash_tpl.GetHiddenParam("height");
		
		var single_block = item.closest('div.single_file_block');
		if(single_block.length) item = single_block;
		
		target.animate({ 'height': item_h }, "normal", false, function(){
			flash_tpl.clone().appendTo(target);
		});
		item.fadeOutUni("fast");
	}
	else FileViewer.Show(p);
}

// JavaScript Document

function CheckEvents (p, class_in, class_out,show)
{

	var offset = GetPos(p);
	
	var table = document.getElementById('div_' + p.name + '_table');
	if (table)
	{
		if (show)
		{
			table.style.display = 'block';
			TagToTip('div_' + p.name,offset.right + 5, offset.top - 16);
		}
		else
			table.style.display = 'none';
	}

	FdbChangeClass (p, class_in, class_out);
}

/** Элемент выбора Города
@param dom $root - корневой элемент
@param arr $options - параметы:
	onChange: function(li, extra) { }
@class
*/
function City(root, options)
{
	var $root = $(root);
	
	$root.find("input[_city_qs]").autocomplete("/feedback/ajax/city", {
		delay : 300,
		minChars : 2,
		matchSubset : 1,
		autoFill : true,
		matchContains : 0,
		cacheLength : 10,
		selectFirst : true,
		maxItemsToShow : 10,
		notClear : 1,
		resultsClass : "ac_results",
		formatItem : function (row, i, num) {
			var result = row[0];
			return result;
		},
		onItemSelect : function (li)
		{
			var extra = { };
			if (li.extra) extra = li.extra;
			if (options && options.onChange) options.onChange(li, extra);

			//if (li == null) var sValue = "";
			//else if (li.extra) var sValue = li.extra[0];
			//else var sValue = li.selectValue;
		},
		onAutoFill : function(data)
		{
			if (options && options.onChange) options.onChange(null, array_sub(data, 1));			
		}
	});
}

/** Элемент выбора Города или Области или Страны
@param dom $root - корневой элемент
@param arr $options - параметы:
	onChange: function(li, extra) { }
@class	
*/
function Location(root, options)
{
	var $root = $(root);
	
	$root.find("input[_input]").autocomplete("/feedback/ajax/location", {
		delay : 300,
		minChars : 2,
		matchSubset : 1,
		autoFill : true,
		matchContains : 0,
		cacheLength : 10,
		selectFirst : true,
		maxItemsToShow : 10,
		notClear : 1,
		resultsClass : "ac_results",
		formatItem : function (row, i, num) {
			var result = row[0];
			return result;
		},
		onItemSelect : function (li)
		{
			var extra = { };
			if (li.extra) extra = li.extra;
			if (options && options.onChange) options.onChange(li, extra);
		},
		onAutoFill : function(data)
		{
			if (options && options.onChange) options.onChange(null, array_sub(data, 1));	
		}
	});
}
/** Элемент выбора Города или Области или Страны
@param dom $root - корневой элемент
@param arr $options - параметы:
	onChange: function(li, extra) { }
@class	
*/
function Country(root, options)
{
	var $root = $(root);
	
	$root.find("input[_input]").autocomplete("/feedback/ajax/country", {
		delay : 300,
		minChars : 2,
		matchSubset : 1,
		autoFill : true,
		matchContains : 0,
		cacheLength : 10,
		selectFirst : true,
		maxItemsToShow : 10,
		notClear : 1,
		resultsClass : "ac_results",
		formatItem : function (row, i, num) {
			var result = row[0];
			return result;
		},
		onItemSelect : function (li)
		{
			var extra = { };
			if (li.extra) extra = li.extra;
			if (options && options.onChange) options.onChange(li, extra);
		},
		onAutoFill : function(data)
		{
			if (options && options.onChange) options.onChange(null, array_sub(data, 1));	
		}
	});
}
/** Элемент выбора Города с возможностью ввода собственного
@param dom $root - корневой элемент
@param arr $options - параметы:
	onChange: function(li, extra) { }
@class
*/
function CityEx(root, options)
{
	var me = this;
	this.options = $.extend({

	}, options);
	
	root.CityEx = this;
	this.$root = $(root);
	this.$input = this.$root.find("input[_city_qs]");
	this.$input2 = this.$root.find('input[_city_name]');
	this.$popup = this.$root.find('[cityex_popup]');

	//this.$input.data('ListBox', this).data('IValue', this);
	this.SwitchToExMode = function()
	{
		this.$root.replaceClass("cityex_simple", "cityex_ex");
		this.$root.switchTo('field_mode', 'ex');
		this.$root.switchTo('button_state', 'button');
		this.$input2.val(this.$input.val());
		this.$input.val("");
		this.$popup.hide();
	}
	
	this.SwitchToSimpleMode = function()
	{
		this.$root.replaceClass("cityex_ex", "cityex_simple");
		this.$root.switchTo('field_mode', 'simple');
		this.$input2.val('');
	}
	this.IsSimpleMode = function()
	{
		return this.$root.hasClass("cityex_simple"); 
	}
	//инициализация
	this.$input.autocomplete("/feedback/ajax/city", {
		delay : 300,
		minChars : 2,
		matchSubset : 1,
		autoFill : true,
		matchContains : 0,
		cacheLength : 10,
		selectFirst : true,
		maxItemsToShow : 10,
		notClear : 1,
		formatItem : function (row, i, num) {
			var result = row[0];
			return result;
		},
		onItemSelect : function (li)
		{
			var extra = { };
			if (li.extra) extra = li.extra;
			if (me.options && me.options.onChange) me.options.onChange(li, extra);
		},
		onAutoFill : function(data)
		{
			if (options && options.onChange) options.onChange(null, array_sub(data, 1));	
		},
		onHidePopup : function (reason)
		{
			if (me.IsSimpleMode() && reason == 'NotFound')
				me.$popup.show();
			else
				me.$popup.hide();
		}
	});
};

/** Поиск ближайшего родительского CityEx объекта
@param dom $p - элемент 
@return obj - CityEx объект
*/
function FindCityEx(p)
{
	return $(p).closest('[_field_type]').data('JsControl');
}

/** переключает CityEx в расширенный режим 
@param dom $p - элемент через который будет найден ближайший родительский CityEx
*/
function CityEx_ExMode(p)
{
	var item = FindCityEx(p);
	item.SwitchToExMode();
}

/** переключает CityEx в обычный режим 
@param dom $p - элемент через который будет найден ближайший родительский CityEx
*/
function CityEx_SimpleMode(p)
{
	var item = FindCityEx(p);
	item.SwitchToSimpleMode();
}

function CompanyId(root, options)
{
	var $root = $(root);
	
	$root.find('input').autocomplete("/feedback/ajax/company_id", {
		delay : 300,
		minChars : 2,
		matchSubset : false,
		autoFill : false,
		matchContains : 0,
		cacheLength : 10,
		selectFirst : false,
		maxItemsToShow : 10,
		notClear : 1,
		resultsClass : "ac_results",
		formatItem : function (row, i, num)
		{
			var result = row[1];
			return result;
		},
		onItemSelect : function (li)
		{
			var extra = { };
			if (li.extra) extra = li.extra;
			if (options && options.onChange) options.onChange(li, extra);
		},
		onAutoFill : function(data)
		{
			
		}			
	});
}

function FlashVideo(root, options)
{
	var me = this;
	me.$root = $(root);
	
	this.SetType = function(type)
	{
		me.$root.switchTo('_fv_type', type);
		me.$root.find('[_fv_tab]').removeClass('switch_on');
		me.$root.find('[_fv_tab='+type+']').addClass('switch_on');
		//me.$root.find('[_fv_input]').attr('disabled', '1');
		//me.$root.find('[_fv_input='+type+']').attr('disabled', '');
	}
}

FlashVideo.SetType = function (p, type)
{
	var obj = $(p).getJsControl();
	if (obj) obj.SetType(type);
}

FlashVideo.ToggleDesc = function (p, state)
{
	var root = $(p).closest('[desc_block]').switchTo('desc_st', state);
	var desc = root.find('[desc_cb]').hideV();
	desc[state == 'full' ? 'slideDown' : 'slideUp']('fast', function(){ desc.showV(); });
}

//########################################################################################
//GOOGLE MAP #############################################################################
//########################################################################################
function iMapClass(Container,_width,_height,timeInfoClose,mapCursor,dragCursor)
{
	var thisClass = this;
	var Map_width =  _width || 600;			// ширина карты
	var Map_height = _height || 400;		// высота карты
	mapCursor = mapCursor || null;
	dragCursor = dragCursor || null;
	timeInfoClose = timeInfoClose || 2000;	
	var pForm = $(Container).closest("form").get(0);
	
	var Map;								// объявление GMap2()
	var size_zoom = 2;						// единици удаленности карты
	var rand = 0;							// для одинаковых кординат делает смешение
	
	this.thisMap;							// внешний указатель на объект GMap2
	this.indexOffice = [];					// объект главного Офиса .latlng = хранит кардинаты .marker объект маркера .msg сообщение для офиса
	this.indexDist = {};					// хранит масив максимальной дистанции  key = id, value = km(float)
	this.thisDist = -1;						// текущая дстанция
	this.state_table = null;				// контейнер таблицы
	
	var index = {};							// хранит масив представительств key = id, value = LatLng
	var indexMarker = {};					// хранит масив маркеров key = id, value = marker
	var indexMsg = {};						// хранит масив сообщений key = id, value = msg
	
	var img_office = '';					// картинка маркера
	var LatLngCenter;						// указатель точки для центрирования карты
	var LatLng;								// текущий указатель точки
	var marker;								// текущий маркер
	var msg;								// текущее сообщение
	var TimeClear;

	var MarkerDragg = true;					// флаг перетаскивания маркера по умолчанию разрешино
	
	var	geocoder = new GClientGeocoder();
	var bound = new GLatLngBounds();
	var markerOPT = Object;
	
	var start_map_set_by_user = 0;
	
	GMapInit(Container);
	
	function GMapInit(Container)
	{
		GMapType(Container);
		LatLngCenter = new GLatLng('51.477222','0');
		Map.setCenter(LatLngCenter,size_zoom);
		thisClass.thisMap = Map;
	}
	function GMapType(Container)
	{
		Map = new GMap2(Container,{ size: new GSize(Map_width,Map_height),draggableCursor:mapCursor,draggingCursor:dragCursor } );
		var customUI = Map.getDefaultUI();
			customUI.maptypes.hybrid = true;
		Map.setUI(customUI);	
	}
	function GMapLatLng(map_x,map_y)
	{
		LatLng = new GLatLng(map_x, map_y);		
		return LatLng;
	}
	function GMapMarkerOptions() 
	{
		var tinyIcon = new GIcon();
		tinyIcon.image = img_office;
		tinyIcon.iconSize = new GSize(50, 50);
		tinyIcon.iconAnchor = new GPoint(18, 50);
		tinyIcon.infoWindowAnchor = new GPoint(19, 52);
		markerOPT.icon = tinyIcon;
		markerOPT.draggable = MarkerDragg;		
	}
	function GMapCreateMarker(latlng, msg)
	{
		GMapMarkerOptions();

		marker = new GMarker(latlng, markerOPT);
		if (msg)
		{
			GEvent.addListener(marker, "click", function() 
			{
				marker = this;
				this.openInfoWindowHtml(msg);
			});
		}
		GEvent.addListener(marker, "dragstart", function() 
		{
			marker = this;
			Map.closeInfoWindow();
		});
		GEvent.addListener(marker, "dragend", function(latlng) 
		{
			marker = this;
			geocoder.getLocations(latlng, function(response) { addAddressToMap(response, true) });	
			iMapTableState('changed');
			
		});
		Map.addOverlay(marker);
		bound.extend(latlng);
	}
	function addAddressToMap(response, by_user) 
	{
		if (!response || response.Status.code != 200) 
		{
			pForm.map_x.value = 0;
			pForm.map_y.value = 0;
			alert("Выбранное место не пригодно для жизни");
			return false;
		}
		else 
		{
			place = response.Placemark[0];
			msg = '<center><b>'+place.address+'</b></center>';			

			pForm.map_x.value = ""+place.Point.coordinates[0];
			pForm.map_y.value = ""+place.Point.coordinates[1];
			if (pForm.map_set_by_user)
				pForm.map_set_by_user.value = by_user ? "1" : "0";

			marker.openInfoWindowHtml(msg); 
			
			iMapTimer(timeInfoClose);
		}
	}
	function GMapDataOffice(msg,map_x,map_y,mainoffice)
	{
		LatLngCenter = GMapLatLng(map_x,map_y);
		if (mainoffice)
			GMapCreateMarker(LatLngCenter, msg);
		thisClass.indexOffice.latlng = LatLngCenter;
		thisClass.indexOffice.marker = marker;
		thisClass.indexOffice.msg = msg;
	}	
	function GMapDataAgsy(id,msg,map_x,map_y)
	{	
		GMapLatLng(map_x,map_y);

		for (var d in index)
		{ 
			if (index[d].lat()==LatLng.lat() && index[d].lng()==LatLng.lng())
			{ 
				rand = rand+0.001; 
				GMapLatLng(map_x*1+rand,map_y*1+rand); 
			} 
		}
		GMapCreateMarker(LatLng,msg);
		index[id] = LatLng;	
		indexMarker[id] = marker;
		indexMsg[id] = msg;	
	}
	
this.InitByForm = function()
{
	if (!pForm)
		return false;

	var result = {"x" : GetFloat(pForm.map_y.value), "y" : GetFloat(pForm.map_x.value), "by_user" : pForm.map_set_by_user.value ? 1 : 0};
	return result;
}

this.iMapData = function(data,dragg,mainoffice)
	{
		dragg = dragg | false;
		mainoffice = mainoffice | false;
		MarkerDragg = dragg;
		if (typeof(data) == 'object' | typeof(data) == 'array')
		{
			for (var d in data)
			{	
				var map_x = GetFloat(data[d]["map_y"]);
				var map_y = GetFloat(data[d]["map_x"]);
				
				if (map_x == 0 && map_y == 0 && d*1 == 0)
				{
					var form_info = thisClass.InitByForm(); 
					if (form_info)
					{
						data[d]["map_x"] = map_x = form_info.x;
						data[d]["map_y"] = map_y = form_info.y;
						start_map_set_by_user = form_info.by_user;
					}
				}
				
				if (data[d]["main_office"])
				{ 
					img_office = StaticUrl +"/img/interactive_map/icons/main_office.png"; 
					if (data[d]['image'])
						msg = "<center><img src='/data/ent/card_main/"+ data[d]['image']+"'/></center>";
					else
						msg = null;
					GMapDataOffice(msg,map_x,map_y,mainoffice);
					if (msg)
						marker.openInfoWindowHtml(msg);
				}
				else 
				{ 
					var id = data[d]['id'];
					img_office = StaticUrl +"/img/interactive_map/icons/agcy.png";
					if (data[d]["price"] && data[d]["cy"] && data[d]["units"])
					{
						var search_base_icon = '<center><b>'+data[d]["name"]+'</b><br><br>'+data[d]["price"]+data[d]["cy"]+'/'+data[d]["units"]+'<br><img src="'+data[d]["image"]+'"/></center>';
						msg = search_base_icon;
					}else
					{ 
						msg = data[d]['source_html']; 
					}
					GMapDataAgsy(id,msg,map_x,map_y);
				}
			}		
			LatLngCenter = bound.getCenter();
			if (LatLngCenter)
			{
				var zoom = Map.getBoundsZoomLevel(bound)-1;
				if (zoom > 11 ){ var zoom = 11};
				size_zoom = zoom;
				Map.setCenter(LatLngCenter,size_zoom);
				Map.savePosition();
			}			
		}
	}	
this.iMapDataAjax = function(id)
	{	 
		Map.clearOverlays();
		$.post("/interactive_map/ajax/get-coord-by-city",{'id':id},function(data)
		{
			iMap_OF_AjaxFinish(data);
		});	
	}
	function iMap_OF_AjaxFinish(data,time)
	{
		time = time || 2000;

		eval("var result = " + data);
		var _x = result['y'];
		var _y = result['x'];	
		GMapLatLng(_x,_y);

		GMapCreateMarker(LatLng, msg);
		Map.setCenter(LatLng,5);
		
		geocoder.getLocations(LatLng, function(response) { addAddressToMap(response, false); start_map_set_by_user = 0; });
		iMapTimer(time);
	}
	function iMapTimer(time)
	{
		window.clearTimeout(TimeClear);

		if (!window.iMap_data)
			window.iMap_data = [];		

		window.iMap_data.push(thisClass);
		var i = window.iMap_data.length - 1;
		
		TimeClear = window.setTimeout("iMapInfoClose("+ i +");", time);
	}

this.iMapClick = function()
	{	
		MarkerDragg = true;
		marker = [];
	
		GEvent.addListener(Map, "click", function(overlay,point) 
		{
			if (!overlay)
			{
				var prMarker = marker;
				iMapTableState('changed');

				Map.clearOverlays();
				GMapCreateMarker(point, msg);
				geocoder.getLocations(point,function(response) { addAddressToMap(response, true) });
			}
		});
	}
	function iMapTableState(state)
	{
		if (thisClass.state_table == null)
		{
			alert('state_table = null');
			return false;
		}
		if (state == 'start')
			SH_table_set_state(thisClass.state_table, "start");
		if (state == 'changing')
			SH_table_set_state(thisClass.state_table, "changing");
		if (state == 'changed')
			SH_table_set_state(thisClass.state_table, "changed");
	}
this.iMapClear = function()
	{
		Map.clearOverlays();

		img_office = StaticUrl +"/img/interactive_map/icons/main_office.png"; 
		Map.returnToSavedPosition();

		GMapCreateMarker(LatLng, msg);

		geocoder.getLocations(LatLng, function(response) { addAddressToMap(response, start_map_set_by_user) });
		iMapTableState('start');
		return false;
	}
//////////////////////////////////////////   ///////////////////////////////////////////////////////
this.iMapDistanceHW = function()
	{
		var LonLatMetric = [];
		var mapLonLat = Map.getBounds();
		var LNG = new GLatLng(mapLonLat.getSouthWest().lat(), mapLonLat.getNorthEast().lng());
		var LAT = new GLatLng(mapLonLat.getNorthEast().lat(), mapLonLat.getSouthWest().lng());

		LonLatMetric.lng = thisClass.iMapDistance(mapLonLat.getSouthWest(),LNG);
		LonLatMetric.lat = thisClass.iMapDistance(mapLonLat.getSouthWest(),LAT);

		return LonLatMetric;
	}
		/////   дистанция между двумя точками в формате LatLng /////
this.iMapDistance = function(point1, point2) 
	{
	  var R = 6371; // радиус земли в km
	  var lon1 = point1.lat()*1 * Math.PI / 180 ;
	  var lat1 = point1.lng()*1 * Math.PI / 180;
	  var lon2 = point2.lat()*1 * Math.PI / 180;
	  var lat2 = point2.lng()*1 * Math.PI / 180;
	
	  var deltaLat = (lat1*1 - lat2*1)/2 ;
	  var deltaLon = lon1*1 - lon2*1 ;
		
	  var step1 = Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(lat2) * Math.cos(lat1) * Math.pow(Math.sin(deltaLon / 2), 2);
	  var step2 = 2 * Math.atan2(Math.sqrt(step1), Math.sqrt(1 - step1));
	 // Metric();
	  var step3 = step2 * R *2;	
	  return step3.toFixed(3);
	}
this.iMapDist = function()
	{	
		var maxDist = [];
		maxDist.latlng;
		maxDist.dist = 0;
		
		for (var d in index) 
		{
			thisClass.indexDist[d] = thisClass.iMapDistance(thisClass.indexOffice.latlng,index[d]); 
			if ((maxDist.dist*100) < (thisClass.indexDist[d]*100)){ maxDist.dist = thisClass.indexDist[d]; maxDist.latlng = index[d];}
		}
		return maxDist;
	}
this.iMapSendDist = function()
	{
		var visibleMarker = {}; 
		$('#mytest').html('');
		for (var i in indexMarker)
		{
			if (!(indexMarker[i].isHidden()))
			{
				visibleMarker[i] = indexMarker[i];
			}
		}
		var val = [];
		val.lat =0;
		val.lng =0;
		for (var i in visibleMarker)
		{
			var _x = Math.abs(index[i].lat()*1 - thisClass.indexOffice.latlng.lat());
			var _y = Math.abs(index[i].lng()*1 - thisClass.indexOffice.latlng.lng());
			
			if ( Math.abs(_x*1) > val.lat*1)
						val.lat = _x;
			if ( Math.abs(_y*1) > val.lng*1)
						val.lng = _y;
		}
		return val;
	}
////////////////////////////////////////////////////////////////////////////////////
this.iMapCentred = function(i,type)
	{
		type = type || false;
		if (i < 0)
		{  
			var latlng = thisClass.indexOffice.latlng; 
			var ObjMarker = thisClass.indexOffice.marker;
			var messager = thisClass.indexOffice.msg;
			img_office = StaticUrl +"/img/interactive_map/icons/main_office.png";
		}
		else 
		{ 
			var latlng = index[i*1]; 
			var ObjMarker = indexMarker[i*1];
			var messager = indexMsg[i*1];
			img_office = StaticUrl +"/img/interactive_map/icons/agcy.png";
		}
		if (!type)
		{
			if (msg)
				ObjMarker.openInfoWindowHtml(messager,{pixelOffset:new GSize(100, 100)});
		}
		else
		{
			GMapMarkerOptions(); 
			ObjMarker.showMapBlowup({zoomLevel:10,mapType:G_NORMAL_MAP});
		}
		Map.setCenter(latlng,size_zoom);
		
		var EventInfo = GEvent.addListener(ObjMarker, "infowindowopen", function()
		{
			Map.panBy(new GSize(0, 150));
			GEvent.removeListener(EventInfo);
		});
	}
this.MarkerClear = function(i)
	{	 
		indexMarker[i].hide();	
	}
this.MarkerShow = function(i)
	{
		indexMarker[i].show();
	}
this.iMapOverlay = function()
	{
		for(var i in index)
		{
			var polyline = new GPolyline([index[i], thisClass.indexOffice.latlng], "#000", 2);
			Map.addOverlay(polyline);
		}
	}
	
var gdir = Object;

this.iMapDirections = function(fromAddress, toAddress, options)
	{
		gdir = new GDirections(Map);
		
		GEvent.addListener(gdir, "error", function(){
			if (options.onError) options.onError(gdir.getStatus().code);
		});
		
		gdir.load("from: " + fromAddress + " to: " + toAddress);

		GEvent.addListener(gdir, "addoverlay", function()
		{
			var result = Object;
			result.dist = gdir.getDistance();
			result.time = gdir.getDuration();
			var code = gdir.getStatus().code;
			if (code == 200)
				if (options.onSuccess) options.onSuccess(result);
			else 	
				if (options.onError) options.onError(code);	
		});
		
	}

	
function handleErrors()
{
  if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
    alert("Нет соответствующего географического расположения. \nError code: " + gdir.getStatus().code);
  else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
    alert("Геокодирование или запроса не может быть обработан. \n Error code: " + gdir.getStatus().code);
  else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
    alert("Параметр HTTP не было либо отсутствуют, либо является пустым. \n Error code: " + gdir.getStatus().code);
  else if (gdir.getStatus().code == G_GEO_BAD_KEY)
    alert("Неверный ключ Google Key. \n Error code: " + gdir.getStatus().code);
  else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
    alert("Направленный запрос невозможно обработан. \n Error code: " + gdir.getStatus().code);
  else alert("Неизвестная ошибка.");
}

/////////////////////////////////////////////////////////////////////////////////////////////////
	/////////////////////////   дистанция из km в LatLng ////////////////////////
	function destination(orig, hdng, dist) 
	{
	  var R = 6371; // радиус земли в km
	  var oX, oY;
	  var x, y;
	  var d = dist/R;  ////// d = угловое растояние от поверхности земли
	  hdng = hdng * Math.PI / 180; //// градусы в радианы
	  oX = orig.x * Math.PI / 180;
	  oY = orig.y * Math.PI / 180;
	
	  y = Math.asin( Math.sin(oY)*Math.cos(d) + Math.cos(oY)*Math.sin(d)*Math.cos(hdng) );
	  
	  x = oX + Math.atan2(Math.sin(hdng)*Math.sin(d)*Math.cos(oY), Math.cos(d)-Math.sin(oY)*Math.sin(y));
	
	  y = y * 180 / Math.PI;
	  x = x * 180 / Math.PI;
	  return new GLatLng(y, x);
	}

	function Metric(dist,miles)
	{
		miles = miles | false;
		if (miles) { dist = dist * 0.62137274; } 
		
		if (dist < 1000) 
		{
		  result = dist.toFixed(3);
		} else {
		  result = (dist / 1000).toFixed(3);
		}
		return result;  
	}
}


// ======== GLOBAl ==========
function iMapInfoClose (i)
{
	var objMap = window.iMap_data[i];
	objMap.thisMap.closeInfoWindow();
	window.iMap_data[i] = null;	
}
/** @class */
function AllCheckbox(item, options)
{
	var me = this;
	me.$root = $(item);
	me.$page = me.$root;
	options = options || { };

	var $all = me.$root.find(":checkbox[c_all]");

	$all.click(function()
	{
		var st = this.checked;
		me.$page.find(":checkbox[c_one]").each(function() { this.checked = st; });
		updateCount();

		if (options.onCheck) options.onCheck(this, me.$root);
	});

	function Recalc(p, raise)
	{
		var f = true;
		me.$page.find(":checkbox[c_one]").each(function() { f &= this.checked; });
		$all.setCheck(f);
		updateCount();

		if (options.onCheck) options.onCheck(p, me.$root);
	}
	this.Refrash = function()
	{
		Recalc($all, false);
	}
	function updateCount()
	{
		if (options.allCount) options.allCount.html(me.$root.find(':checked[c_one]').length);
	}

	function Init(page)
	{
		me.$page.find(":checkbox[c_one][c_one!=i]").click(function()
		{
			Recalc(this, true);
		})
		.attr('c_one', 'i');

		Recalc($all, false);
	}

	this.ChangePage = function(page)
	{
		me.$page = page;
		Init(page);
	}

	this.AddPage = function (page)
	{
		Init(page);
	}

	this.SetRoot = function(root, is_shiftChecked)
	{
		if (is_shiftChecked) shiftChecked(me.$root, root);
		me.$root = me.$page = root;
		Init(root);
	}
	function shiftChecked($oldRoot, $newRoot)
	{
		var map = { };
		$oldRoot.find(':checked[c_one]').each(function (){
			map[this.value] = true;
		});
		
		$newRoot.find(":checkbox[c_one]").each(function(){
			if (map[this.value])
			{
				$(this).check();
				if (options.onCheck) options.onCheck(this, item);
			}
		});
	}
	this.SetCheckAll = function(checked)
	{
		var count = 0;
		
		if(checked == 'inverse')
		{
			me.$root.find(":checkbox[c_one]").each(function(){
				if(!this.checked) count++;
				this.checked = !this.checked;
			});
		}
		else
		{
			count = me.$root.find(":checkbox[c_one]").setCheck(checked).length;
			$all.setCheck(checked);
		}
		
		if (options.allCount) options.allCount.html(checked ? count : 0);
		if(options.onCheck) options.onCheck(false, me.$root);
	}
	this.CheckedCount = function()
	{
		return me.$root.find(":checked[c_one]").length;
	}
	this.GetValues = function(sep)
	{
		var ids = [];
		me.$root.find(":checked[c_one]").each(function(){
			ids.push($(this).val());
		});
		return ids.join(sep);
	}

	Init(me.$root);
}

jQuery.fn.allcheckbox = function(options)
{
	if (!options) options = {};
	return this.each(function() {
		var item = this;
		new AllCheckbox(item, options);
	});
}
/** класс Check c 3-я состояниями
@param $root - корневой элемент
@param $options -
	sequence: -1 - последовательность состояний interim - check - uncheck (-1/1/0)
	иначе - uncheck - check - interim (0/1/-1)
@class
*/
function Check3Box(root, options)
{
	var me = this;
	var $root = $(root);
	this.$root = $root;
	this.$input = $root.find('input');
	this.$checkbox = $root.find('img[check3]');
	this.$input.data('Check3Box', this).data('IValue', this);
	$root.data('IValue', this);
	$root.disableTextSelect();

	$root.click(function()
	{
		if(me.$input.prop('disabled')) return false;
		me.SetValue(me.GetNextState(me.$input.val()));
	});
	this.GetNextState = function(val)
	{
		if (options.sequence == -1)
		{
			if (!val || val == 0) return -1;
			else if (val == -1) return 1;
			return 0;
		}
		else{
			if (!val || val == 0) return 1;
			else if (val == -1) return 0;
			return -1;
		}
	}
	this.Refresh = function()
	{
		me.$checkbox.setClass('icon_2 cb' + me.$input.val());
	}
	this.SetValue = function(value)
	{
		me.$input.val_old(value);
		me.Refresh();
		if (options && options.onChange) options.onChange.call(me, value);
	}
	if (this.$input.attr('_refresh')) this.Refresh();
}

/** Создание Check3Box
@param mix $options -
	sequence: -1 - последовательность состояний interim - check - uncheck (-1/1/0)
	иначе - uncheck - check - interim (0/1/-1)
*/
jQuery.fn.check3box = function(options)
{
	if (!options) options = {};
	return this.each(function() {
		var $item = $(this);
		if (!$item.data('Check3Box'))
			$item.data('Check3Box', new Check3Box($item, options));
	});
}

function CheckBlock(root, options)
{
	this.root = $(root);
	var _this = this;
	this.input = this.root.find("input");
	this.root.click(function(){ _this.onClick(); }).disableTextSelect();
	this.hover = new hoverClass(this.root, { add_class: "check-block-h", bind_hover: true });

	this.onClick = function()
	{
		this.root.toggleClass("check-block-on");
		this.input.val(this.root.hasClass("check-block-on") ? 1 : 0);
	}
}

// JavaScript Document

var Presentation_curr_container;

var Presentation_FadeSpeed = 450;

var Presentattion_StopBlinking = false;
var Presentattion_OtherStopBlinking = false;

var Presentattion_mainStopBlinking = false;



function Presentation_StopBlinking ()
{
	
	//Presentattion_OtherStopBlinking = true;
	//Presentation_curr_container = false;
	//Presentattion_StopBlinking = true;
	
	/*if (Presentation_curr_container)
	{
		Presentation_ChangeClass (false);
		Presentattion_StopBlinking = true;
		Presentation_curr_container = null;
	}*/ 
} 
 
 
function Presentation_CheckContainer (e)
{
	if (Presentattion_mainStopBlinking)
		return; 
	 
	Presentation_ChangeClass (true);
	 
	Presentattion_StopBlinking = false;
	Presentattion_OtherStopBlinking = false;
	
	if (Presentation_curr_container == e.id)
		return;
	
	if (!Presentation_curr_container)
		Presentation_curr_container = e.id;
	
	if (Presentation_curr_container != e.id)
	{
		var tmp_container = Presentation_curr_container;
		$("#" + tmp_container).fadeTo(Presentation_FadeSpeed, 0);
		Presentattion_StopBlinking = true;
		Presentation_ChangeClass (false);
		Presentation_curr_container = e.id; 
	} 
	 
	Presentation_Blinking();

}


function Presentation_Blinking() 
{
	
	if (Presentattion_mainStopBlinking)
		return; 
	
	if (Presentattion_OtherStopBlinking)
		return;
 
	if (Presentattion_StopBlinking)
	{
		Presentattion_StopBlinking = false;
		return;  
	} 
	
	
	$("#" + Presentation_curr_container).fadeTo(Presentation_FadeSpeed, 0.3, function () {
										  
		$("#" + Presentation_curr_container).fadeTo(Presentation_FadeSpeed, 0, function () {														  	
			Presentation_Blinking();
		});
			
	});
	 
}
 
function Presentation_ChangeClass (active)
{ 
	
	if (active)
		$("#" + Presentation_curr_container).addClass('presenation_selective_div');
	else
		$("#" + Presentation_curr_container).removeClass('presenation_selective_div');

}

function Presentation_ShowContent (e)
{
	
	$("#" + Presentation_curr_container).fadeTo(Presentation_FadeSpeed, 0, function () {														  	
		Presentation_StopBlinking();
	});
	
	
	Presentation_curr_container = false;
	Presentattion_mainStopBlinking = true;
	
	var c = "#presentation_content_shell";
	var m = "#presentation_main"; 
	
	$("#presentation_content").html(  $( "#" + e.id + "_content").html() );

	$(c).css("position","absolute");
	$(c).css("top", ( $(m).height() - $(c).height() ) / 2  + "px");
	$(c).css("left", ( $(m).width() - $(c).width() ) / 2  + "px");

	$(c).animate({opacity: "show"}, "fast");

	
}

function Presentation_HideContent ()
{
	Presentattion_mainStopBlinking = false; 
	$("#presentation_content_shell").animate({opacity: "hide"}, "fast");
	
}

function DatesRange(uid)
{
	this.root = $('#dates_range_' + uid);
	
	// Не инициализируем повторно
	if(this.root.data('_dates_range')) return false;
	
	this.uid = uid;
	this.from_filed = this.root.find('[field_from]');
	this.to_filed = this.root.find('[field_to]');
	this.interval = this.root.find('[interval]');
	var _this = this;
	
	// Получаем даты по умолчанию
	this.date_from = this.from_filed.val();
	this.date_from = this.date_from ? Calendar.dateToInt(Calendar.parseDate(this.date_from, true)) : false;
	this.date_to = this.to_filed.val();
	this.date_to = this.date_to ? Calendar.dateToInt(Calendar.parseDate(this.date_to, true)) : false;
	this.date_now = Calendar.dateToInt(new Date());
	
	this.root.data('_dates_range', this);
	
	this.UpdateInterval = function()
	{
		var interval = dateDiff("day", Calendar.intToDate(this.cal_from.selection.get()), Calendar.intToDate(this.cal_to.selection.get())) + 1;
		this.interval.html(Math.abs(interval));
	}
	
	this.SetDate = function(calendar, date)
	{
		var date_int = Calendar.dateToInt(date);
		calendar.selection.set(date_int);
		calendar.moveTo(date_int);
	}
	
	this.cal_from = Calendar.setup({
		 cont : this.uid + "_cal_from",
		 bottomBar : false,
		 date : this.date_from || this.date_now,
		 animation : !$.browser.msie,
		 onSelect : function() {
		 	// Получаем дату
			var int_date = this.selection.get();
			var date = Calendar.intToDate(int_date);
			// Прокручиваем соседа синхронно, если в нем пересечение
			var to_date = _this.cal_to.selection.get();
			if(!to_date || to_date < int_date) _this.SetDate(_this.cal_to, date);
			// Выводим результаты
			_this.UpdateInterval();
			date = Calendar.printDate(date, "%Y-%m-%d");
			_this.from_filed.val(date);
	    }
	});
	
	this.cal_to = Calendar.setup({
		 cont : this.uid + "_cal_to",
		 bottomBar : false,
		 date : this.date_to || this.date_now,
		 animation : !$.browser.msie,
		 onSelect : function() {
			var int_date = this.selection.get();
			var date = Calendar.intToDate(int_date);
			var from_date = _this.cal_from.selection.get();
			if(!from_date || from_date > int_date) _this.SetDate(_this.cal_from, date)
			_this.UpdateInterval();
			date = Calendar.printDate(date, "%Y-%m-%d");
			_this.to_filed.val(date);
	   	}
	});
	
	this.Reset = function()
	{
		this.SetDate(this.cal_from, this.date_from || this.date_now);
		this.SetDate(this.cal_to, this.date_to || this.date_now);
	}
	
	// Пихаем дефолтные даты в календари
	if(this.date_from) this.SetDate(this.cal_from, this.date_from);
	if(this.date_to) this.SetDate(this.cal_to, this.date_to);
}
function IncrementField(root, options)
{
	this.root = $(root);
	var _this = this;
	
	this.options = $.extend({
		'field_filter': 'input:first',
		'step': 1,
		//'arr_off_class': 'arr_disabled',
		'onChange': function () { }
	}, options);
	
	this.input = this.root.find(this.options.field_filter);
	this.arr_up = this.root.find('td.arr_up').click(function(){ _this.Increment(1); }).disableTextSelect();
	this.arr_dn = this.root.find('td.arr_dn').click(function(){ _this.Increment(-1); }).disableTextSelect();
	
	this.root.attr('_field_name', this.input.attr('name'));
	
	this.CheckArrows = function()
	{
		var curr_val = GetFloat(this.input.val());
		this.arr_up.toggleClass('arr_up_disabled', curr_val + this.options.step > this.options.max);
		this.arr_dn.toggleClass('arr_dn_disabled', curr_val - this.options.step < this.options.min);
	}
	
	this.Increment = function(sign)
	{
		sign = sign > 0 ? 1 : -1; // На всякий случай
		
		var new_val = GetFloat(this.input.val()) + sign * this.options.step;
		
		if(this.options.min !== undefined && sign < 0 && new_val < this.options.min) return false;
		if(this.options.max !== undefined && sign > 0 && new_val > this.options.max) return false;
		
		this.input.val(new_val).change();
		
		this.CheckArrows();
		if (this.options.onChange) this.options.onChange.call(this);
	}
	this.input.bind('change', function () { _this.options.onChange.call(_this)} );
	this.CheckArrows();	
}
function RangeSlider(root, options)
{
	var _this = this;
	this.root = $(root);
	//this.options = options || { };
	this.slider_el = this.root.find('[slider]');
	
	
	this.options = $.extend({		
		'field_from': 'input[name$=_from]',
		'field_to': 'input[name$=_to]'
	}, options);
	
	this.ready = this.options.wait_init ? false : true;
	
	this.field_from = this.options.range ? this.root.find(this.options.field_from) : this.root.find('input:first');
	this.field_from.bind('change', function() { _this.SetValue(0, $(this).val()); });
	
	if(this.options.range)
	{
		this.field_to = this.root.find(this.options.field_to);
		this.field_to.bind('change', function() { _this.SetValue(1, $(this).val()); });
	}
	
	ConsoleLog(this.options.name_from);
	
	// Обработчики
	this.onChange = function(event, ui)
	{
		if(this.options.range)
		{
			if($(ui.handle).is('.ui-corner-min'))
				this.field_from.val(ui.values[0]);
			else
			{
				var curr_to = GetFloat(this.field_to.val());
				if(!this.options.infinity || (curr_to && curr_to < this.options.max))
					this.field_to.val(ui.values[1]);
				else if(!curr_to) this.field_to.val('');
			}
			
			if(this.options.onChange && this.ready) this.options.onChange(this.root, ui.values);
		}
		else
		{
			this.field_from.val(ui.value);
			if(this.options.onChange && this.ready) this.options.onChange(this.root, ui.value);
		}
	}
	
	this.onSlide = function(event, ui)
	{
		if(this.options.range)
		{
			if($(ui.handle).is('.ui-corner-min'))
				this.field_from.val(ui.values[0]);
			else
			{
				var val_to = 0;
				if(this.options.infinity && ui.values[1] >= this.options.max) val_to = '';
				else val_to = ui.values[1];
				this.field_to.val(val_to);
			}
			
			if(this.options.onSlide && this.ready) this.options.onSlide(this.root, ui.values);
		}
		else
		{
			this.field_from.val(ui.value);
			if(this.options.onSlide && this.ready) this.options.onSlide(this.root, ui.value);
		}
	}
	
	this.GetValue = function(index)
	{
		if(this.options.range) return GetFloat(this.slider_el.slider('values', index));
		else return GetFloat(this.slider_el.slider('value'));
	}
	
	this.SetValue = function(index, value)
	{
		var set = false;
		value = GetFloat(value);
		
		if(this.options.range)
		{
			if(index == 1 && value < this.GetValue(0)) value = this.GetValue(0);
			else if(index == 0 && value > this.GetValue(1)) value = this.GetValue(1);
			
			if(index == 1 && value > this.options.max)
			{
				this.slider_el.slider('values', 1, this.options.max);
				this.field_to.val(value);
			}
			
			this.slider_el.slider('values', index, value);
		}
		else
			this.slider_el.slider('value', value);
	}
	
	this.InitSlider = function()
	{
		this.slider_el = this.root.find('[slider]');
		this.slider_el.slider({
			max: this.options.max,
			min: this.options.min,
			range: this.options.range ? true : "min",
			step: this.options.step || 0.01,
			slide: function(event, ui)
			{ 
				_this.onSlide(event, ui);
			},
			change: function(event, ui)
			{ 
				_this.onChange(event, ui);
			}
		});
		
		if(this.options.range)
		{
			this.options.to_value = this.options.infinity ? (this.options.to_value || this.options.max) : this.options.to_value;
			this.SetValue(1, this.options.to_value);
		}
		
		this.SetValue(0, this.options.from_value);
		
		this.ready = true;
	}
	
	this.InitSlider();
}

function Help()
{
	this.Vote = function(p, e, value)
	{
		var $root = $(p).closest('[vote_block]');
		var ajax = $root.get(0).ajax;
		if (ajax) ajax.abort();
		$root.get(0).ajax = $.ajax({
			type: "get",
			url: "/help/ajax/vote",
			data: {
				id : $root.attr('vote_block'),
				v : value
			},
			complete: function(data, status)
			{
				AjaxComplete(data, status, { });				
			}
		});		
		CancelBubble(e);
		//сразу ставим метку
		$(p).closest('[vote_block]').find('[vote]').replaceClass('voted_help', 'novoted_help');
		$(p).closest('[vote]').replaceClass('novoted_help', 'voted_help');
		return false;
	}
}
$$.Help = new Help();
//#region Comments
function Comments(root)
{
	var _this = this;
	this.root = root;
	
}

Comments.New = function($p)
{
	Comments.CancelOther($p);
	Comments.ChangeState($p, 'full');
	$($p).closest('form').find('input[name=parent_id]').val(0);
	$($p).autogrow();
}

Comments.ChangeState = function(p, state)
{
	var $p = $(p);
	var $form_root = $p.closest('[comments_form]');
	var $buttons = $form_root.find('[comments_form_buttons]');
	var $text = $form_root.find('textarea[name=text]');
	
	$form_root.BCH(function(){ Comments.TextBlur($text); }, true);

	if (state == "short")
	{
		if ($form_root.data('submiting'))
			return;
			
		$form_root.replaceClass('comm_form_full', 'comm_form_short').ToggleBCH(false);
		$text.attr('style', '');
	}
	else
	{
		$form_root.replaceClass('comm_form_short', 'comm_form_full').ToggleBCH(true);
	}
	
	if($.browser.msie) $form_root.find('.is-full').toggle(state == "full"); // Да чтоб им там икалось всю жизнь!!!!
}

Comments.TextFocus = function(p)
{
	Comments.New(p);
}

Comments.TextBlur = function(p)
{
	if (!$(p).val())
		Comments.Cancel(p);
}

Comments.Cancel = function($p)
{
	$p = $($p);
	var $form_root = $p.closest('[comments_form]');
	
	var is_answer = $form_root.attr('comments_answer_form') ? true : false;
	
	if (is_answer)
	{
		$form_root.closest('[comments_answer_container]').hide();
	}
	else
	{
		Comments.ChangeState($p, 'short');
	}
}

Comments.Submit = function($p)
{
	$p = $($p);
	var $form_root = $p.closest('[comments_form]');
	$form_root.data('submiting', true);
	
	$form_root.AjaxSend(false, '/core/comment/ajax/add');
}

Comments.Success = function($p, r, data)
{
	$p = $($p);
	var $form = $p.find('form:first');
	var $form_root = $form.closest('[comments_form]');
	$form_root.data('submiting', false);
	
	Comments.StartAnimate($p, r, data);
	
	ClearForm($form);
	
	$('[comment_count='+ data.selector + '_' + data.card_id +']').html(r.result.new_count);
}

Comments.Error = function($p, r, data)
{
	$($p).data('submiting', false);
}

Comments.StartAnimate = function($p, r, data)
{
	$p = $($p);
	var $root = Comments.FindRoot($p);
	var $form = $root.find('div[comments_form]:visible:first');
	var uid = $root.attr('comments_root');
	var overlay = $root.closest('div.overlay_layer');
	
	Comments.Cancel($p);
	
	$root.find('div[nodes_tree]:first').show(); // Если дерево изначально было скрыто - отображаем
	
	if (GetInt(data.parent_id) == 0)
		var $target = $('#comments_nodes_list_'+ uid);
	else
		var $target = $('#comments_subs_'+ data.parent_id);
	
	var $node = $(r.result.html);
	if(!$node.length) return false; // Мало ли что прийти может...
	
	$node.appendTo($target);
	$node = $node.filter('div.comm_node'); // После appendTo в объекте появляется какой-то мусор
	
	var target_pos = $node.position();
	
	// Граница экрана
	var $body = $('body');
	var screen_top = overlay.length ? overlay.scrollTop() : $body.scrollTop();
	var screen_height = $body[0].clientHeight;
	
	// Если элемент за экраном - скроллим до него
	if (target_pos.top < screen_top || target_pos.top + $node.height() > screen_top + screen_height)
		$node.get(0).scrollIntoView(false);
		
	$node.hide().fadeInUni("slow");
	Comments.UpdateCounters($root);
}

Comments.CancelOther = function($p)
{
	var $root = Comments.FindRoot($p);
	$root.find('div[comments_form]').each(function(){
		Comments.Cancel(this);
	});
}

Comments.Answer = function($p, id, text)
{
	$p = $($p);
	
	Comments.CancelOther($p);
	
	var $target = $('#comments_answer_container_'+ id);
	if (!$target.is(':parent'))
	{
		var $root = Comments.FindRoot($p);
		var $form_tpl = $root.find('div[form_tpl]:first');
		var $form_clone = $form_tpl.clone();
		$form_clone.removeAttr('form_tpl');
		
		$form_clone.find('input[name=parent_id]').val(id);
		$form_clone.appendTo($target);
		$form_clone.show();
		$target.show();
	}
	else
	{
		$target.show();
	}
	
	var field = $target.find('textarea[name=text]');
	if(text) field.val(text);
	field.focus();
}

Comments.FindRoot = function($p)
{
	return $($p).closest('[comments_root]');
}


Comments.AfterDelete = function($p, data, r)
{
	var $root = $p.closest('[comments_node]');
	
	var $body = $root.find('[comments_node_body]:first');
	var $deleted_node = $root.find('[comments_node_deleted]:first');
	if (GetInt(data.deleted) == 0)
	{
		$body.switchTo('state', 'state_0');
		$deleted_node.hide();
		$body.show();
		
	}
	else
	{
		$deleted_node.switchTo('state', 'state_1');
		$deleted_node.show();
		$body.hide();
	}
}

Comments.UpdateCounters = function(root)
{
	var nodes = root.find('div.comm_node');
	var counters = root.find('span[comm_cnt]');
	var cnt_total = counters.filter('[comm_cnt=total]');
	var cnt_visible = counters.filter('[comm_cnt=visible]');
	var visible_cnt = nodes.filter(':visible').length;
	
	if(root.attr('_list_ready'))	// Если список уже загружен - просто считаем ноды
		cnt_total.html(nodes.length);
	else 								// Иначе инкрементим общее число на количество новых нодов
		cnt_total.increment(visible_cnt - GetInt(cnt_visible.html()));
	
	cnt_visible.html(nodes.filter(':visible').length);
}

Comments.SwitchListView = function(root, mode)
{
	var list = root.find('div[nodes_tree]:first');
	
	if(mode == 'opened')
	{
		list.find('div.comm_node,div.comments_subs').show();
	}
	else
	{
		list.find('div.comments_subs').hide();
		var nodes = list.find('>div.comm_node');
		if(nodes.length > 3) nodes.filter(':lt('+ (nodes.length - 3) +')').hide();
		Comments.UpdateCounters(root);
	}
	
	root.switchTo('comm_toggle', mode);
}

// Загрузка комментариев в свернутый блок
Comments.ToggleList = function(p)
{
	var root = $(p).closest('[comments_root]');
	
	// Если список загружен, переключаем состояния
	if(root.attr('_list_ready'))
	{
		var to_state = $(p).find('[comm_toggle]:hidden:first').attr('comm_toggle');
		Comments.SwitchListView(root, to_state);
	}
	// Иначе загружаем...
	else
	{
		// Сохраняем открытую форму ответа, если такая есть
		var ans_block = root.find('div[comments_answer_container]:visible:first');
		if(ans_block.length)
		{
			var answer = {
				'id': ans_block.attr('comments_answer_container'),
				'text': ans_block.find('textarea.comm_field:first').val()
			};
			root.data('_list_answer', answer);
		}
		
		$(p).AjaxSend();
	}
}

Comments.onLoadList = function($p, r, data)
{
	var root = $($p);
	var comm_block = root.find('[nodes_tree]:first');
	var answer = root.data('_list_answer');
	
	// Взводим флаг готовности списка
	root.attr('_list_ready', 1);
	
	comm_block.html(r.result.html);
	
	Comments.UpdateCounters(root);
	
	root.switchTo('comm_toggle', 'opened');
	
	// Восстанавливаем форму ответа
	if(answer) Comments.Answer($p, answer.id, answer.text)
	
	comm_block.slideDown('fast');
}

Comments.ToggleSpam = function(p, hide)
{
	var root = $(p).closest('div.comm_node');
	root.find('div[comments_node_spam]:first').toggle(hide);
	root.find('div[comments_node_body]:first').toggle(!hide);
}

//#endregion



function PublishHelper() {}

PublishHelper.ShareSuccess = function($p, data, r)
{
	var $root = $p.closest('[_publish_share_block]');
	$root.find('[_publish_share_advance]').show().find('a:first').click(function() {
		AjaxDlg.ShowPopup('/publish/ajax/share_advanced_dlg?id=' + r.result.new_id);
	});
}

var Tab = {
	'To': function(p, name)
	{
		var $root = $(p).closest('[_tab_root]');
		var cb_root = $root.find("[_tab_contents]:first");
		var tabs = $root.find("[_tab_content]");
		var new_cb = tabs.filter("[_tab_content="+ name +"]");
		var tab_field = $root.find("input[_tab_input]");
		
		cb_root.css("height", cb_root.height());
		tabs.hide();
		cb_root.animate({ "height": new_cb.height() }, "fast", false, function(){
				new_cb.show();
				cb_root.css("height", "auto");
		});
		//$root.switchTo('_tab_content', name);
		
		tab_field.val(name);
		
		$root.find("div[_tab_header]").removeClass("tab_btn_on").filter('[_tab_header='+ name +']').addClass("tab_btn_on");
	}
};
function CardsSlider(p, options)
{
	var _this = this;
	this.options = options || { };
	this.margin = 0;
	this.root = $(p).closest('[cards_slider_root]');
	if(this.root.data('_cards_slider')) return false; // Не инициализируемся повторно
	this.root.data('_cards_slider', this);
	
	this.onResize = function(force_overs)
	{
		this.list_block.width(10);
		this.list_vis_w = this.list_block.parents(':first').width();
		this.list_block.width(this.list_vis_w);
		this.list_w = this.list_cb.outerWidth();
		
		if(_this.options.resize_overs || force_overs)
		{
			_this.over_l.height(_this.list_block.height());
			_this.over_r.height(_this.list_block.height());
		}
		
		this.Recalc();
	}
	
	this.Recalc = function()
	{
		var tmp_w = 0;
		this.nodes = [];
		this.first_vis = null;
		this.last_vis = null;
		this.margin = GetInt(this.list_cb.css('marginLeft'));
		
		// Строим массив элементов, и находим первый видимый
		this.list_block.find('td[cs_node]').each(function(i){
			var w = $(this).outerWidth();
			var i = _this.nodes.push({ 'width': w, 'node': $(this)}) - 1;
			
			if(_this.first_vis === null && tmp_w + _this.margin >= 0) _this.first_vis = i;
				
			tmp_w += w;
		});
		
		// Ищем последний видимый
		var i = this.first_vis;
		tmp_w = 0;
		while(i < this.nodes.length)
		{
			var el = this.nodes[i];
			tmp_w += el.width;
			
			if(tmp_w > this.list_vis_w)
			{
				this.last_vis = i - 1;
				break;
			}
			
			i++;
		}
		
		if(this.last_vis === null)
		{
			this.last_vis = this.nodes.length - 1;
		}
		
		this.vis_cnt = this.last_vis - this.first_vis + 1;
		
		/*$.dseUnion(this.arr_l, this.over_l, this.cnt_l).toggle(this.first_vis > 0);
		$.dseUnion(this.arr_r, this.over_r, this.cnt_r).toggle(this.last_vis < this.nodes.length - 1);*/
		
		this.arr_l.toggle(this.first_vis > 0);
		this.over_l.toggle(this.first_vis > 0);
		this.cnt_l.toggle(this.first_vis > 0);
		
		this.arr_r.toggle(this.last_vis < this.nodes.length - 1);
		this.over_r.toggle(this.last_vis < this.nodes.length - 1);
		this.cnt_r.toggle(this.last_vis < this.nodes.length - 1);
		
		this.cnt_l.html(this.first_vis);
		this.cnt_r.html(this.nodes.length - this.last_vis - 1);
	}
	
	this.SlideTo = function(direction)
	{
		// Нечего мотать)
		if(this.list_w <= this.list_vis_w) return false;
		
		var offset = 0;
		
		if(direction > 0)
		{
			// Если некуда крутить
			if(this.last_vis >= this.nodes.length - 1) return false;
			
			if(this.nodes.length - (this.last_vis + this.vis_cnt) > 0)
			{
				var idx = this.first_vis;
				while(idx <= this.last_vis)
				{
					offset += this.nodes[idx].width;
					idx++;
				}
				offset *= -1;
			}
			else
			{
				offset = this.list_vis_w - this.list_w - this.margin;
			}
			
			offset += this.margin;
		}
		else
		{
			// Если некуда крутить
			if(this.first_vis == 0) return false;
			
			var idx = 0;
			while(idx < this.first_vis - this.vis_cnt)
			{
				offset -= this.nodes[idx].width;
				idx++;
			}
		}
		
		this.list_cb.animate({ 'marginLeft': offset + 'px' }, "fast", false, function(){ _this.Recalc(); });
	}
	
	$(function()	{
		_this.arr_l = _this.root.find('[cs_arr_left]:first').click(function(){ _this.SlideTo(-1); });
		_this.arr_r = _this.root.find('[cs_arr_right]:first').click(function(){ _this.SlideTo(1); });
		_this.list_block = _this.root.find('div[cs_list_block]:first');
		_this.list_cb = _this.list_block.children(':first');
		
		_this.over_l = _this.root.find('[cs_over_l]');
		_this.over_r = _this.root.find('[cs_over_r]');
		_this.cnt_l = _this.root.find('[cs_cnt_left]');
		_this.cnt_r = _this.root.find('[cs_cnt_right]');
		
		$(window).resize(function(){ _this.onResize(); });
		_this.onResize();
	});
}
var Feed = (function()
{
	this.ToggleFilter = function(p, force_state)
	{
		var root = $(p).closest('div.feed_filter');
		if(force_state) 
			root.toggleClass('feed_filter_on', force_state);
		else
			root.toggleClass('feed_filter_on');
	}
	
	return this;
})();
function HtmlContent(){}

HtmlContent.InitImgZoom = function()
{
	$('img[zoom=full]').each(function ()
	{
		var $img= $(this);
		if ($img.data('_image_viewer_inited'))
			return true;
			
		$img.data('_image_viewer_inited', 1);
		
		$img.click(function(e) 
		{
			HtmlContent.ZoomImage(this);
		}).addClass('clickable');
	});
}

HtmlContent.ZoomImage = function($p)
{
	var params = ",1000x1000,zoom";
	$p = $($p);
	var rg = /(.*?),(.*)(\.\w+)/;
	var m = rg.exec($p.attr('src'));
	SH_ImageViewerShow(m[1] + params + m[3]);	
}


function SearchCommonFormSample(p)
{
	var root = $(p).closest("form");
	$(root[0].qs).val($(p).html());
}


function SearchCommonFormSubmit(p)
{
	var form = $(p).closest("form");
	var form_submit = $("#search_form_submit");
	form_submit.attr('action', form.attr('action'));
	form_submit[0].qs.value = form[0].qs.value;
	if (form_submit[0].qs_lang && form[0].qs_lang)
		form_submit[0].qs_lang.value = form[0].qs_lang.value;
		
	form_submit.submit();
	
	return false;
}







var AHC_helper_ajax = null;


function AHC_AjaxStart(p, e)
{
	if (!e)
		e= event;
		
	if (e)
	{
		switch(e.keyCode)
		{
			case 13:
				AHC_SubmitForm(p);
				return;
				
			case 37:
			case 38:
			case 39:
			case 40:
				return;
				break;
		}
	}
	
	if (AHC_helper_ajax)
		AHC_helper_ajax.abort();
		

	if (!p.value || p.value.length < 3)
	{
		AHC_HelperShow(p, false);
		return;
	}
	
	var root = $(p).parents("[AHC_root]:first");
	var qs = root.find("[AHC_qs]").get(0);
	
	var url = root.attr("AHC_helper_url");
		
	AHC_helper_ajax = $.ajax({
		type: "POST",
		url: url,
		data: {name : qs.value},
		complete: function(data, status){
			AHC_AjaxComplete(data, status, qs);
		}
	});

	return false;
}




function AHC_AjaxComplete(data, status, p)
{
	if (status == "success")
	{
		var root = $(p).parents("[AHC_root]:first");
		var helper_text = root.find("[AHC_helper]");
		helper.html(data.responseText);
		AHC_HelperShow(p, true);
	}
	else
	{
		SH_AlertAjaxError();
	}
}



function AHC_HelperShow(p, show)
{
	var root = $(p).parents("[AHC_root]:first");
	var helper = root.find("[AHC_helper]");
	var input = helper.siblings("input:first");
	
	if (show)
	{	
		var container = helper.find(".content");
		if (helper.height() > 350)
			container.height(300);
		
		var pos = input.offset();
		helper.css("left", pos["left"]);
		helper.css("top", pos["top"] + input.height() + 4);
		helper.show();
	}
	else	
	{
		//if (AHC_helper_ajax)	AHC_helper_ajax.abort();
		helper.hide();
		//helper.empty();
	}
	
}


function AHC_SubmitForm(p)
{
	AHC_HelperShow(null, 0);
	
	var root = $(p).parents("[AHC_root]:first");
	var qs = root.find("[AHC_qs]").get(0);

	var pFormSubmit = root.find("[AHC_submit_form]").get(0);
	
	pFormSubmit.qs.value = qs.value;
	pFormSubmit.submit();
}




//------------------------------------------------------

function PSSearch_ChangeSize()
{
	var cloud = $("#SCloud");
	var results = $("#PSS_search_results");
	var content_main = cloud.parents("[SH_content_main]:first");
	
	content_main.css("padding-bottom", 0)
	var pos = content_main.position();
	
	if ($.browser.msie)
		pos.top += 5;
	
	cloud.height($(window).height() - pos.top - $("#PollSearch_TableState").height() - 10);
	results.height($(window).height() - pos.top);
}


function PSSearch_Load(qs, qs_lang, url, ent_id)
{
	PSSearch_ShowState("loading");
	
	$.ajax({
		type: "GET",
		url: url,
		data: { 'qs': qs, 'qs_lang': qs_lang },
		complete: function(data, status){
			PSSearch_LoadComplete(data, status, qs, qs_lang, url, ent_id);
		}
	});

}

function PSSearch_LoadComplete(data, status, qs, qs_lang, url, ent_id)
{
	if (status == "success")
	{
		
		var tags = PSSearch_LoadCompleteProceed(data);
		
		var cloud = new SCloud();
		cloud.load_data_url = url;
		cloud.ent_id = ent_id;
		cloud.LoadingDataBegin = function () { PSSearch_ShowState("loading"); }
		cloud.LoadingDataEnd = function (data) { return PSSearch_LoadCompleteProceed(data); }
		cloud.Init("SCloud", tags, qs, "", qs_lang);
	
	
	}
	else 
	{
		//alert('Поризошла ошибка получения ответа. Проверьте свое соединение к интернет.');
		PSSearch_ShowState("results");
	}
}

function PSSearch_LoadCompleteProceed(data)
{
	var results_layer = $("#PSS_search_results");
	
	if (data)
		results_layer.html(data.responseText);
		
	
	//eval("var tags = " + $("#Scloud_data").get(0).value);
	var tags = Scloud_data_tags;
	
	
	//*
	var pager = results_layer.find("[SH_pager]");
	pager.find("a").each(function () {
		
		$(this).click(PSSearch_LinkClick);
	
	});
	
	results_layer.find('select[onajax]').attr("onchange", '').unbind('change').change(PSSearch_SelectChange);
	results_layer.find('a[onajax]').attr("onclick", '').unbind('click').click(PSSearch_LinkClick);
	//*/
	
	$("#ProductSearch_services").html(ProductSearch_services_html);
	
	
	PSSearch_ShowState("results");
	
	
	
	
	
	
	SH_InitCurrencyTooltip(results_layer);
	
	return tags;
}


//----------------------------------------
function PSSearch_UrlGo(url)
{
	PSSearch_ShowState("loading");
	
	$("body").scrollTop(0);
	
	if (url.indexOf("/ajax/") == -1)
		url = url.replace('/product/search', '/product/ajax/search');
	url = encodeURI(url);
	//alert(url); return;

	$.ajax({
		type: "GET",
		"url": url,
		data: {},
		complete: function(data, status){
			PSSearch_LinkClickComplete(data, status);
		}
	});
} 


function PSSearch_LinkClick()
{
	if ($(this).attr('onajax'))
	{
		eval($(this).attr('onajax'));
		PSSearch_UrlGo(decodeURI($(this).attr("urlajax")));
	}
	else
		PSSearch_UrlGo(decodeURI(this.href));
		
	return false;
}

function PSSearch_LinkClickComplete(data, status)
{
	if (status == "success")
	{
		var tags = PSSearch_LoadCompleteProceed(data);
		
	}
	else
	{
		SH_AlertAjaxError();
		PSSearch_ShowState("results");
	}
}


function PSSearch_SelectChange(p)
{
	eval($(this).attr('onajax'));
	
	PSSearch_UrlGo(decodeURI($(this).attr("urlajax")));
	//console.log(decodeURI($(this).attr("urlajax")));
}




function PSSearch_ShowState(state)
{
	SH_table_set_state(false, state, $("#PSS_search_results").closest("[SH_root]"));
	
	switch(state)
	{
		case "loading":
			$("#PSS_map_result_link").css("visibility", "hidden");
			break;
			
		case "results":
			$("#PSS_map_result_link").css("visibility", "visible");
			break;
	}
}
//#region FileUploaderForm
function FileUploaderForm($root, options)
{
	var me = this;
	this.options = object_merge({}, options);
	this.$root = $root;
	this.$root.data('FileUploaderForm', this);
	
	this.Show = function(show)
	{
		if (show)
		{
			this.$root.find("[_hefa_input]").html('<input type="file" name="file[]" onchange="FileUploaderForm.GetObject(this).Submit()">');
		}
		
		this.SwitchTo(show ? 'form' : 'button');
	}
	
	this.Submit = function()
	{
		this.SwitchTo('loading');
		
		if (!this.$form_submit)
		{
			var uid = Math.round(Math.random() * 1000000);
			this.$form_frame = $('<iframe id="fup_frame_'+ uid +'" name="fup_frame_'+ uid +'" width="100%" height="1" class="hidden"></iframe>');
			this.$form_frame.appendTo('body');
			
			this.$form_submit = $('<form action="'+ this.options.fup_url +'" target="fup_frame_'+ uid +'" id="fup_form_'+ uid +'" method="post" enctype="multipart/form-data" class="hidden">'+
				'<input type="hidden" name="module" value = "'+ this.fup_module +'">'+
				'<input type="hidden" name="card_id" value = "'+ this.fup_card_id +'">'+ 
				'<input type="hidden" name="tmp_uid" value = "'+ this.fup_tmp_uid +'">'+
				'</form>');
			this.$form_submit.appendTo('body');			
		}
		else
		{
			this.$form_submit.find('input[type=file]').remove();
		}
		
		var $field = this.$root.find("[_hefa_input]").find('input');
		var $field_detached = $field.detach();
		$field_detached.appendTo(this.$form_submit);
		this.$form_submit.submit();
		
		if (!this.$form_frame.data('fup_onload_binded'))
		{
			this.$form_frame.data('fup_onload_binded', 1)
			this.$form_frame.bind('load', function() 
			{
				
				var r = new AjaxResponse(me.$form_frame.frameDocument().find('body').find('#ResultJSON').val());
				me.SwitchTo('button');
				
				// Проверка на ошибку
				if (r.isError())
				{
					if (me.options.error) me.options.error(r);
					else r.alertErrors();
				}
				else
				{
					if (me.options.success) me.options.success(r);					
				}
			});
		}
		//"/entsite/files/ajax/upload";
	}
	
	this.SwitchTo = function(state)
	{
		this.$root.switchTo('hefa_state', state);
	}
}
FileUploaderForm.GetRoot = function(p)
{
	return $(p).closest('[_FileUploaderForm]');
}
FileUploaderForm.GetObject = function(p)
{
	var $root = FileUploaderForm.GetRoot(p);	
	return $root.data('FileUploaderForm');
}

//#endregion

//#region FileUploaderMulti

function FileUploaderMulti($root, options)
{
	var me = this;	
	this.options = object_merge({}, options);
	this.$root = $root;
	this.$root.data('FileUploaderMulti', this);
	
	this.$list = $root.find('[_FileUploaderMulti_list]');
	this.$drop = $root.find('[_FileUploaderMulti_drag]');
	this.$content = this.$list.find('[content]');
	this.fup_tmp_uid = '';
	
	function AddUPar(url)
	{
		return url + (url.indexOf('?') > 0 ? '&' : '?');
	}
	function InitDrop()
	{
		if (me.isInitDrop) return;
		me.isInitDrop = true;
		
		var $dropRoot = me.options.dropToRoot ? me.$root : me.$drop;
		
		$dropRoot.filedrop({
			
			dragRoot: $('body'),
			
			onDragEnter: function (e){
				me.$drop.replaceClass('drag_inactive', 'drag_active').switchTo('drag_state', 'drag');
			},
			onDragLeave: function (e){
				me.$drop.replaceClass('drag_active', 'drag_inactive').switchTo('drag_state', 'none');
			},
			onBeforeUpload: function(e) 
			{
				me.fileUploaderForm.SwitchTo('loading');
				
				this.url = AddUPar(me.options.url_upload) +
					"ajax=1" +
					"&module=" + me.fup_module +
					"&card_id=" + (me.fup_card_id || '') +
					"&tmp_uid=" + me.fup_tmp_uid;

				me.$drop.replaceClass('drag_active', 'drag_inactive').switchTo('drag_state', 'none');
				//me.$list.switchTo('fl_state', 'list');
				
								
				return true;
			},			
			onComplete: function (data, status){

				me.fileUploaderForm.SwitchTo('button');

				AjaxComplete(data, status, {
					success: function (data, r)
					{
						me.UpdateList(r.result);
					},
					error: function (data)
					{
						if (me.$content.find('[_fum_id]').length == 0)
							me.$list.switchTo('fl_state', 'empty');
						
					}
				});
			},
			onNotSupport: function (){	},			
			onProgress: function(event) {	}
		});
	}
	//для загрузки списка файлов
	var ajaxLoad = new AjaxMaster({
		switchStates: "fl_state:empty,loading,data",
		switchRoot: me.$list,
		success: function (r, data, request_data)
		{
			me.isLoaded = true;
			me.UpdateList(r.result);
			if (me.options.onLoad)
				me.options.onLoad();
		}
	});
	//форма прикрепления файлов
	this.fileUploaderForm = new FileUploaderForm(this.$root.find('[_FileUploaderForm]'), {
		fup_url: AddUPar(me.options.url_upload) +'frame=1',
		success: function (r) { me.UpdateList(r.result); }
	});
	
	this.UpdateList = function(data)
	{
		//me.$list.switchTo('fl_state', 'empty');
		if (data.files_count)
		{
			if (data.files_html_add)
				this.$content.append(data.files_html_add);
			else
				this.$content.html(data.files_html);
			me.$list.switchTo('fl_state', 'list');
			
			//блокируем претаскивание для img
			this.$content.find('img').bind('dragstart', function(event) { if (event && event.preventDefault) event.preventDefault(); return false; });			
		}
		if (this.$content.find('[_fum_id]').length == 0)
			me.$list.switchTo('fl_state', 'empty');
		
		if (data.uploaded_files)
		{
			var text = "";
			$(data.uploaded_files).each(function(){
				if (this.status == "error")
					text += "   • \"" + this.name + "\" - " + this.error.text + "\r\n";
					
			});
			
			if (text)
				alert(Msg.upload_files_errors + "\r\n" + text);
		}
		
		if (this.options.onUpdateList)
			this.options.onUpdateList(data);
	}
	
	this.UpdateParams = function(module, card_id, tmp_uid)
	{
		module = module || '';
		card_id = card_id || '';
		tmp_uid = tmp_uid || '';
		var in_tmp_uid = tmp_uid;
		
		if (card_id == "ignore")
		{
			card_id = ''; me.options.ignore_card_id = true;
		}
		
		if (me.options.ignore_card_id)
			card_id= '';
			
		var needLoad = true;
		if (me.isLoaded && me.fup_module == module && (me.options.ignore_card_id || me.fup_card_id == card_id))
			needLoad = false;
		
		if (card_id)
			tmp_uid = '';	 
		
		else if (!me.options.ignore_card_id && !tmp_uid)
			tmp_uid = uniqid();	
		
		
		this.fileUploaderForm.fup_module = me.fup_module = module;
		this.fileUploaderForm.fup_card_id = me.fup_card_id = card_id;
		this.fileUploaderForm.fup_tmp_uid = me.fup_tmp_uid = tmp_uid;
		
		var $form = me.options.innerForm ? me.$root.find('form') : me.$root.closest('form');
		$form.find(me.options.name ? 'input[fup_tmp_uid='+ me.options.name +']' : 'input[fup_tmp_uid]').val(me.fup_tmp_uid);
		
		InitDrop();
		
		if (!needLoad) return;
		
		if (!me.options.url_load || !in_tmp_uid && me.fup_tmp_uid && !me.options.ignore_card_id)
		{
			$root.switchTo('fl_state', 'empty');
		}
		else
		{
			ajaxLoad.Send(me.options.url_load, {
				module: me.fup_module,
				card_id: me.fup_card_id,
				tmp_uid: me.fup_tmp_uid
			});
		}		
	}
	
	this.AddFormShow = function(show)
	{
		this.fileUploaderForm.Show(show);
	}	
	
	this.AddFormCreateForm = function()
	{
		
	}
}

FileUploaderMulti.GetRoot = function(p)
{
	return $(p).closest('[_FileUploaderMulti]');
}

FileUploaderMulti.GetObject = function(p)
{
	return FileUploaderForm.GetRoot(p).data('FileUploaderMulti');
}

FileUploaderMulti.onFileListDeleted = function(p)
{
	p = $(p).closest('[_fum_id]');
	var $parent = p.parent();
	p.remove();
	if ($parent.find('[_fum_id]').length == 0)
	{
		var obj = FileUploaderMulti.GetObject($parent);
		me.$list.switchTo('fl_state', 'empty');
	}
}

FileUploaderMulti.FindFile = function(p)
{
	return $(p).closest('[_fum_id]');
}
//#endregion
/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
// JavaScript Document

var curr_container;  
var curr_link;

function ShowSubgroups()
{
	var sub_gr = document.getElementById("last_subgroups_on_index");	
	var icon = document.getElementById("show_subgroups_icon");	
	
	if(sub_gr.style.display == 'none')
	{
		sub_gr.style.display = 'block';
		icon.src = StaticUrl +"/img/catalog/hide_subgroups.jpg";
	}
	else
	{
		sub_gr.style.display = 'none';
		icon.src = StaticUrl +"/img/catalog/show_subgroups.jpg";
	}
	
}

function SetCardsOnPage()
{	
	var cp = document.getElementById("select_cards_on_page");
	var module = document.getElementById("module_name");
	var url = document.getElementById("clean_url");
	
	setCookie(module_name.value + "_cards_on_page",cp.selectedIndex);
	window.location  = url.value;
	
	
}



// ajax for product/main
//----------------------------------------------------------------
// base ajax loading 
function GetAjaxSubgroups(id,table_name,ajax_container,link_count)
{
	if (!curr_container)
		curr_container = ajax_container;
	else if (curr_container != ajax_container)
	{
		var curr_cont = document.getElementById("ajax_subgroups_container_" + curr_container);		
		curr_cont.style.display = 'none';
	}

	curr_container = ajax_container;
	var container = document.getElementById("ajax_subgroups_container_" + ajax_container);		
	container.style.display = 'block';

	if (!curr_link) 
		curr_link = link_count;
	else if (curr_link != link_count)
	{
		var current_link = document.getElementById("link_" + curr_link);		
		current_link.style.background = "#FFFFFF";
	}
		
	curr_link = link_count;
	var new_link = document.getElementById("link_" + link_count);
	new_link.style.background = "#bafa97";

	
	var url = "/product/ajax_show_subgroups";
	var param = "base_id=" + id + "&table_name=" + table_name + "&num_ajax_container=" + ajax_container;
	var myAjax = new Ajax.Updater(
		{success: 'ajax_subgroups_container_' + ajax_container}, url, {method: 'get', parameters: param, onFailure: reportError	});
}

//reload ajax
function SetNewSubgroups(id,base_id,table_name,container_id,ids)
{		
	var url = "/product/ajax_show_subgroups";
	var param = "id=" + id + "&base_id=" + base_id + "&table_name=" + table_name + "&num_ajax_container=" + container_id + "&ids=" + ids;
	var myAjax = new Ajax.Updater(
		{success: 'ajax_subgroups_container_' + container_id}, url, {method: 'get', parameters: param, onFailure: reportError	})
}


function DeleteSubgroups(id,base_id,table_name,container_id,ids)
{		
	var url = "/product/ajax_show_subgroups";
	var param = "id=" + id + "&base_id=" + base_id + "&table_name=" + table_name + "&num_ajax_container=" + container_id + "&ids=" + ids + "&delete=1";
	var myAjax = new Ajax.Updater(
		{success: 'ajax_subgroups_container_' + container_id}, url, {method: 'get', parameters: param, onFailure: reportError	})
}

//---------------------------------------------------------------------
function ColorPicker()
{
	var _this = this;
	
	this.base_color = "02d002";
	
	this.hexToRgb = function(hex_string, default_)
	{
	    if (default_ == undefined) {
	        default_ = null;
	    }
	
	    if (hex_string.substr(0, 1) == '#') {
	        hex_string = hex_string.substr(1);
	    }
	    
	    var r;
	    var g;
	    var b;
	    if (hex_string.length == 3) {
	        r = hex_string.substr(0, 1);
	        r += r;
	        g = hex_string.substr(1, 1);
	        g += g;
	        b = hex_string.substr(2, 1);
	        b += b;
	    }
	    else if (hex_string.length == 6) {
	        r = hex_string.substr(0, 2);
	        g = hex_string.substr(2, 2);
	        b = hex_string.substr(4, 2);
	    }
	    else {
	        return default_;
	    }
	    
	    r = parseInt(r, 16);
	    g = parseInt(g, 16);
	    b = parseInt(b, 16);
	    if (isNaN(r) || isNaN(g) || isNaN(b)) {
	        return default_;
	    }
	    else
	    {
	        return {red: r, green: g, blue: b};
	    }
	}
	
	this.rgbToHex = function(r, g, b, includeHash)
	{
		if (includeHash == undefined) {
		    includeHash = true;
		}
		
		r = r.toString(16);
		if (r.length == 1) {
		    r = '0' + r;
		}
		g = g.toString(16);
		if (g.length == 1) {
		    g = '0' + g;
		}
		b = b.toString(16);
		if (b.length == 1) {
		    b = '0' + b;
		}
		return ((includeHash ? '#' : '') + r + g + b).toUpperCase();
	}
	
	this.RGBtoHSB = function(RGB) {
		var R = RGB.red;
		var G = RGB.green;
		var B = RGB.blue;
		var largest = Math.max(R, Math.max(G, B));
		var lowest = Math.min(R, Math.min(G, B));
		var delta = largest - lowest;
		var HSB = new Array(3);
		HSB.hue = 0;
		HSB.saturation = 0;
		HSB.brightness = largest / 255;
		if (largest == 0 || delta == 0) return HSB;
		HSB.saturation = delta / largest;
		if (R == largest) HSB.hue = (G - B) / delta;
		else if (G == largest) HSB.hue = 2 + (B - R) / delta;
		else HSB.hue = 4 + (R - G) / delta;
		HSB.hue *= 60;
		if (HSB.hue < 0) HSB.hue += 360;
		else if (HSB.hue > 360) HSB.hue -= 360;
		return HSB;
	}
	
	this.HSBtoRGB = function(HSB) {
		var R, G, B;
		if (HSB.saturation == 0) R = G = B = HSB.brightness;
		else {
		  var h = HSB.hue / 60;
		  var i = Math.floor(h);
		  var f = h - i;
		  var a = HSB.brightness * (1 - HSB.saturation);
		  var b = HSB.brightness * (1 - HSB.saturation * f);
		  var c = HSB.brightness * (1 - HSB.saturation * (1 - f));
		  switch(i) {
		    case 0: R = HSB.brightness; G = c; B = a; break;
		    case 1: R = b; G = HSB.brightness; B = a; break;
		    case 2: R = a; G = HSB.brightness; B = c; break;
		    case 3: R = a; G = b; B = HSB.brightness; break;
		    case 4: R = c; G = a; B = HSB.brightness; break;
		    case 5: R = HSB.brightness; G = a; B = b; break;
		  }
		}
		var RGB = new Array(3);
		RGB.red = Math.round(R * 255);
		RGB.green = Math.round(G * 255);
		RGB.blue = Math.round(B * 255);
		return RGB;
	}
	
	// Задать цвет превью(HEX)
	// Первый аргумент - DOM-элемент, может быть как корневым, так и дочерним
	this.setColor = function(p, color)
	{
		var root = ( $(p).is('[CP_root]') ) ? $(p) : $(p).closest('[CP_root]');
		root.find("[curr_color]").css('background-color', color);
	}
	
	// Каллбек для слайдера, записывает значения RGB и hue в поля ввода
	this.setHue = function(p, defColor, hue, hue_only)
	{
		var root = $(p).closest('[CP_root]');
		RGB = this.hexToRgb(defColor,null);
		HSB = this.RGBtoHSB(RGB);
		HSB.hue += hue;
		
		if (HSB.hue >= 360) HSB.hue -= 360;
		if (HSB.hue < 0) HSB.hue += 360;
		RGB = this.HSBtoRGB(HSB);
		root.find('input[name="hue"]').val(hue);
		
		if(!hue_only)
		{
			var curColor = this.rgbToHex(RGB.red, RGB.green, RGB.blue,false);
			this.setColor(p, curColor);
			root.find('input[name="color"]').val(curColor);
		}
	}
	
	// Инициализация слайдера
	// slider_root - корневой элемент
	// def_hue - положение ползунка по умолчанию(в градусах палитры :P)
	this.Init_ColorSlider = function(slider_root, def_hue)
	{
		_this.root = $(slider_root).closest('[CP_root]');
		
		this.slider_root = $(slider_root).slider(
			{
				max: 180,
				min:-180,
				value: 0,
				slide: function(event, ui)
						{ 
							_this.setHue(ui.handle, _this.base_color, ui.value);
						},
				change: function(event, ui)
				{ 
					_this.setHue(ui.handle, _this.base_color, ui.value);
				}
			}
		);
		this.slider_root.slider('value', def_hue);
		
	}
	
	
	this.SaveColor = function ()
	{
		_this.setState("loading");
		
		var color = this.root.find('input[name=color]').val();
		var hue = this.root.find('input[name=hue]').val();
		
		if (_this.ajax)
			_this.ajax.abort();
		
		_this.ajax = false;
		
		
		_this.ajax = $.ajax({
			"type": "GET",
			"url": "/company/profile/ajax/skin/color",
			"data": { "color" : color, "position" : hue },
			"complete": function(data, status){
				
				if (status == 'abort') return;
				
				if (status == "success")
				{
					var r = new AjaxResponse(data);
					 
					// Проверка на ошибку
					if (r.isError())
					{
						// вывод сообщения об ошибке(ах)
						r.alertErrors();
						
					}
					
					else
					{
						//_this.setState("saved");
						
						//HM_ToolTip_Hide();
						window.location.reload(true);
						
						return;
					}
					
				}
				
				else
					SH_AlertAjaxError();
					
				
				_this.setState("begin");
			}
		});
	}
	
	this.setState = function(state)
	{
		_this.root.switchTo('state', state);
	}
}

$$.ColorPicker = new ColorPicker();

//#region AjaxPager
//превращает обычный нумерато страниц в ajax

function AjaxPager(root, options)
{	
	var me = this;	
	
	this.options = $.extend({
		onBefore: function (){},
		onSuccess: function ($page){},
		page_var: 'page'
	}, options);
	
	this.$root = $(root);
	this.data = options.data || {};
	
	var $page = me.$root.find('[_ajax_page_url]');
	this.current = { page: $page, url: $page.attr('_ajax_page_url'), num: $page.attr('_ajax_page_num') };	
	
	function Init($cont)
	{
		$cont.find('[SH_pager]').find('a').click(onAClick).each(function()
		{
			this.AjaxPager = me;
		}).end()
		.find('select[onajax]').attr("onchange", '').unbind('change').change(onSChange).each(function()
		{
			this.AjaxPager = me;
		});	
	}
	var oAjax = new AjaxMaster({
		switchStates: "pager_state:main,loading,main",
		noSwitchIfError: true,
		switchRoot: me.$root,
		success: function (r, data, request_data)
		{
			var $page = $('<div></div>').attr('_ajax_page_url', oAjax.page_url);
			$page.html(r.result.html);
			//если нет номера - было изменение количества на странице
			if (!oAjax.page_num){
				me.$root.find('[_ajax_page_url]').remove();
				oAjax.page_num = 1;
			}
			$page.appendTo(me.$root);
			Init($page);
			switchTo($page, oAjax.page_num);
			if (oAjax.page_num)
				$.history.load(me.options.page_var+ '~' + oAjax.page_num);
		},
		error: function(status, r, data, request_data)
		{
			
		}
	});
	function switchTo($page, num)
	{
		me.$root.find('[_ajax_page_url]').attr('_ajax_page_curr', '').hide();
		$page.attr('_ajax_page_curr', '1').show();
		me.current = { page: $page, num: num, url: $page.attr('_ajax_page_url')};	
		me.options.onSuccess.call(me, $page);
		//Anch('#' + me.options.page_var+ '~' + num); 
	}
	function onLoad(url, num)
	{
		if (me.current && me.current.num == num) return;
		if (me.options.onBefore.call(me) === false) return;
		me.data.ajax = 1;
		if (!url)//вычислыем url
		{
			if (!me.current && !me.current.url) return;
			url = me.current.url;
			var rg = new RegExp('(,' + me.options.page_var+ '~)(\\d+)');
			var m = rg.exec(url);
			if (m) url = url.replace(rg, num == 1 ? '' : '$1' + num);
			else
			{
				var pos = url.indexOf('.html');
				if (pos < 0) return;
				url = url.substr(0, pos) + ',' + me.options.page_var + '~' + num + url.substr(pos);
			}			
		}
		var $page = num ? findPage(url) : null;
		if ($page)
		{
			switchTo($page, num);
		}
		else
		{
			oAjax.page_url = url;
			oAjax.page_num = num;			
			oAjax.Send(url, me.data);
		}
	}	
	function findPage(url)
	{
		var $page = null;
		me.$root.find('[_ajax_page_url]').each(function (){
			if ($(this).attr('_ajax_page_url') == url)	{
				$page = $(this);
				return false;
			}
		});
		return $page;
	}	
	function onSChange(e)
	{
		eval($(this).attr('onajax'));
		onLoad($(this).attr("urlajax"));		
	}
	function onAClick(e)
	{
		onLoad($(this).attr("href"), $(this).attr('SH_page'));
		return false;
	}
	function onAnchorChanged(anchor)
	{
		if (!anchor || anchor == '') onLoad(null, 1);
		else
		{
			var rg = new RegExp(me.options.page_var+ '~(\\d+)');
			var m = rg.exec(anchor);
			if (m) onLoad(null, m[1]);
		}
	}
	//инициализируем ссылки
	Init(me.$root);
	
	//AddAnchorEvent(onAnchorChanged);
	//$(function(){
	$.history.init(onAnchorChanged);	
	//});	
}

jQuery.fn.ajaxPager = function(options)
{
	if (!options) options = {};
	return this.each(function() {
		new AjaxPager(this, options);		
	});	
};
//#endregion



//#region AjaxQS
function AjaxQS(input, options)
{
	var me = this;
	
	this.options = $.extend({
		onBefore: function (){ return true; },
		//результат фунции будет сохранен в кеш как результат поиска
		onSuccess: function (r, qs, inCache){ return r; },
		onEmpty: function () {},
		delay: 500,
		minChars: 2,
		matchCase: false,
		cacheLength: -1,
		mustMatch: 0,
		loadingClass: "ac_loading"
	}, options);
		
	me.$input = $(input);
	me.data = me.options.data || {};
	me.data.ajax = 1;
	
	var cache = {};
	
	var oAjax = new AjaxMaster({
		success: function (r, data, request_data)
		{
			me.$input.removeClass(me.options.loadingClass);
			r = me.options.onSuccess.call(me, r, data.qs, false);
			if (r)
				addToCache(data.qs, r);
		},
		error: function(status, r, data, request_data)
		{
			me.$input.removeClass(me.options.loadingClass);
		},
		'sendType' : 'get'
	});
	
	if (me.options.clearBtn) 
		me.options.clearBtn.click(function(e){ me.Clear(); });
	
	this.Clear = function ()
	{
		me.dChange.Clear();		
	}
	this.Find = function ()
	{
		onChange();
	}
	
	function onChange()
	{
		var v = me.$input.val();
		if (v.length >= me.options.minChars) {
			me.$input.addClass(me.options.loadingClass);
			requestData(v);
			if (me.options.clearBtn)
				me.options.clearBtn.show();
		} else {
			me.$input.removeClass(me.options.loadingClass);
			me.options.onEmpty.call(me);
			if (me.options.clearBtn)
				me.options.clearBtn.hide();
		}
	}
	function requestData(q)
	{
		if (!me.options.matchCase) q = q.toLowerCase();
		var r = loadFromCache(q);
		
		if (r) {
			me.options.onSuccess.call(me, r, q, true);
			me.$input.removeClass(me.options.loadingClass);
		} else {
			me.data.qs = q;			
			if(me.options.onBefore.call(me))
				oAjax.Send(me.options.url, me.data);			
		}
	};
	
	function addToCache(q, data) {
		if (!data || !q || !me.options.cacheLength) return;
		if (!cache.length || (cache.length > me.options.cacheLength && me.options.cacheLength > 0)) {
			flushCache();
			cache.length++;
		} else if (!cache[q]) {
			cache.length++;
		}
		cache.data[q] = data;
	};
	
	function loadFromCache(q) {
		if (!q || !me.options.cacheLength) return null;
		if (cache.data[q]) return cache.data[q];		
		return null;
	};
	// flush cache
	function flushCache(){
		cache = { data: {}, length: 0 };		
	};
	
	// flush cache
	flushCache();
	
	me.dChange = new DeferredChange(me.$input, onChange, me.options.delay);
};
//#endregion


//#region AjaxPagerMore
function AjaxPagerMore(root, options)
{
	var me = this;

	this.options = $.extend({
		onBefore: function (){},
		onSuccess: function ($page){},
		page_var: 'page',		
		autoFirstNext: false,
		gapHeight: 200
	}, options);
	
	me.$root = $(root);
	me.$curr = me.$root.find('[_ajax_page=main]');
	if (!me.$curr.length) me.$curr = me.$root;
	me.data = me.options.data || {};
	me.data.ajax = 1;
	
	var oAjax = new AjaxMaster({
		switchStates: "pager_state:main,loading,main",
		noSwitchIfError: true,
		switchRoot: me.$root,
		success: function (r, data, request_data)
		{
			//me.$curr.find('[SH_pager]').hide();// скрываем предыдущие
			me.$curr.find('[pager_more_block]').remove();
			
			var $page = $('<div></div>').attr('_ajax_page_url', oAjax.page_url);
			$page.html(r.result.html);
			$page.appendTo(me.$curr);
			me.$curr.attr('_pager_more_loaded', '1');//была дозагрузка
			Init($page);
			
			if (me.options.allCheckBoxes)
				me.options.allCheckBoxes.AddPage($page);
		},
		error: function(status, r, data, request_data)
		{
			
		}
	});
	
	if (me.options.ajaxQS)
	{
		me.options.ajaxQS.options.onSuccess = function (r, qs, inCache)
		{
			me.$root.find('[_ajax_page]').hide();
			if (inCache)
			{
				me.$root.find('[_ajax_page=qs]').each(function(){
					if ($(this).attr('_ajax_qs') == qs)
					{
						me.$curr = $(this);
						me.$curr.show();
						return false;
					}
				});
			}
			else
			{
				var $page = $('<div></div>').attr('_ajax_page', 'qs').attr('_ajax_qs', qs);
				$page.html(r.result.html);			
				$page.appendTo(me.$root);
				Init($page);
				me.$curr = $page;
			}
			
			if (me.options.allCheckBoxes)
				me.options.allCheckBoxes.SetRoot(me.$curr, true);
			//кешировать сами данные будет AjaxPagerMore 
			return true;
		}
		
		me.options.ajaxQS.options.onEmpty = function ()
		{
			me.$root.find('[_ajax_page]').hide();
			me.$curr = me.$root.find('[_ajax_page=main]').show();
			if (me.options.allCheckBoxes)
				me.options.allCheckBoxes.SetRoot(me.$curr, true);
		}
	}

	function Init($cont)
	{
		$cont.find('[SH_pager]').find('a').click(onMore).each(function()
		{
			this.AjaxPagerMore = me;
		});	
		
		var $pager = $cont.find('[SH_pager] [SH_next]');
		me.$curr.attr('_ajax_page_next', $pager.attr('SH_ajax_url') || $pager.attr("href") || '');
	}
	function onMore(e)
	{
		onLoad($(this).attr("href"));
		return false;
	}
	function onLoad(url)
	{
		if (me.options.onBefore.call(me) === false) return;
		
		oAjax.page_url = url;
		oAjax.Send(url, me.data);		
	}	
	//инициализируем ссылки
	Init(me.$root);
	
	var $body = $('body');
	
	$(window).bind('scroll',function(e)
	{
		if (oAjax.ajax) return;
		
		// Граница экрана
		var screen_top = $body.scrollTop();
		var screen_height = $body[0].clientHeight;
		var b = (me.$curr.position().top + me.$curr.height()) - me.options.gapHeight;
		if (b < screen_top + screen_height)
		{	
			if (!me.options.autoFirstNext && !me.$curr.attr('_pager_more_loaded')) return; //не было первой дозагрузки
			var nextUrl = me.$curr.attr('_ajax_page_next');
			if (nextUrl)
				onLoad(nextUrl);
		}
	});
}

jQuery.fn.ajaxPagerMore = function(options)
{
	if (!options) options = {};
	return this.each(function() {
		new AjaxPagerMore(this, options);		
	});	
}
//#endregion
function EntSkin()
{
	
}
var oSkin = new EntSkin();
/*
options:
@class
*/
function AjaxDlg(options)
{
	var me = this;

	var $root = null;
	var $sMain = null;
	var $sLoading = null;
	var $sCB = null;
	var $sSaving = null;
	var $sQueue = null;
	me.current = null;
	me.queue = [];
	var lSize = null;
	var dSize = null;
	var cache = [];
	var timer = null;

	if (!options) options = { inline: false };
	me.options = options;

	if (!options.inline)
	{
		$root = $('#AjaxDlgLayer');
		$sMain = $('#AjaxDlgMain');
		$sLoading = $('#AjaxDlgLoading');
		$sCB = $root.find(".dlg_cb");
		$sQueue = $('#AjaxDlgQueue');
	}
	else
	{
		$root = options.root;
		$sMain = $root.find('[dlg_state=main]');
		$sLoading = $root.find('[dlg_state=loading]');
		$sCB = $root.find(".dlg_cb");
		$sQueue = $root.find('[dlg_queue]');
	}

	$sSaving = $('#AjaxDlgSaving');

	$root.data('AjaxDlg', this);

	var oAjaxLoad = new AjaxMaster({
		switchStates: "dlg_state:main,loading,main",
		noSwitchIfError: true,
		switchRoot: $root,
		success: function (r, data, request_data)
		{
			$sCB.css('overflow', 'hidden');

			if (!me.options.no_cache && !r.result.no_cache)
				addToCache(this.dlg_path, r.result);

			createDlg(this.dlg_path, this.dlg_data, r.result.html + (r.result.dynamic_script || ''));

			me.current.dynamic_cache = r.result.dynamic_script ? true : false;
		},
		error: function(status, r, data, request_data)
		{
			if (me.options.inline)
				InleneClose();
			else
				RelativeOverlayClose();
		}
	});
	function createDlg(path, data, html)
	{
		$sMain.html('');
		var $dlg = $('<div></div>').attr('_ajax_dlg_path', path);
		$dlg.appendTo($sMain);

		$dlg.data("AjaxDlgInputData", data);
		me.current = { dlg: $dlg, path: path, data: data || {} };
		$dlg.html(html);

		AjaxMaster.Clear($dlg);
		// Отображаем
		$dlg.show();
		$sMain.show();
		setDlgPos($dlg, false);
		
		if (me.options.onStateChaned) me.options.onStateChaned.call(me, 'open');		
		me.AnimageResize($dlg);
	}
	function showByQueue()
	{
		dSize = { width: me.current.dlg.width(), height: me.current.dlg.height() };
		me.current = me.queue.pop();
		var $dlg = me.current.dlg;
		$sMain.html('');
		$dlg.detach().appendTo($sMain);
	
		// Отображаем
		$root.switchTo('dlg_state', 'main');
		$dlg.show();
		$sMain.show();
		setDlgPos($dlg, false);
		
		if (me.options.onStateChaned) me.options.onStateChaned.call(me, 'open');
		me.AnimageResize($dlg);
	}
	this.Show = function(url, e, options, data)
	{
		CancelBubble(e);
		if (timer)
		{
			clearTimeout(timer);
			me.CloseDlg();
		}

		if (!options) options = {};

		if (me.current && me.current.path == url) return;

		me.options.onStateChaned = options.onStateChaned;		

		if (me.current) //ципочка диалогов
		{
			//поиск уже открытых ранее
			for (i=0; i < me.queue.length; i++)
			{
				if (me.queue[i].path == url)
				{
					me.current.dlg.detach().appendTo($sQueue);
					me.queue.push(me.current);
					me.queue.push(me.queue[i]);
					me.queue[i] = null;
					me.queue = afilter(me.queue);
					showByQueue();
					return;
				}
			}
			dSize = { width: me.current.dlg.width(), height: me.current.dlg.height() };
			me.current.dlg.detach().appendTo($sQueue);
			me.queue.push(me.current);
		}
		else if (me.options.inline)
		{
			$root.show();
		}
		else
		{
			RelativeOverlayShow($root, { onClose: this.onCloseOverlay, bg_class: "overlay_bg_none" });
		}

		if (typeof url === "string")
		{
			var ch = (options && options.no_cache) || me.options.no_cache ? null : findInCache(url);

			if (!ch)
			{
				oAjaxLoad.dlg_data = data;
				oAjaxLoad.dlg_path = url;
				oAjaxLoad.Send(url);
				setDlgPos($sLoading, true);
			}
			else
			{
				createDlg(url, data, ch.data.html + (ch.data.dynamic_script || ''));
				me.current.dynamic_cache = ch.data.dynamic_script ? true : false;
			}
		}
		else //это jquery object
		{
			$root.switchTo('dlg_state', 'main');
			
			createDlg(false, data, url.valHtml());
		}
	}
	function InleneClose()
	{
		if (me.onCloseOverlay() === false) return;

		$root.hide();
	}
	this.CloseDlg = function(e)
	{
		me.current.closeReason = 'close';
		if (me.options.inline)
			InleneClose();
		else
			RelativeOverlayClose();
	}
	this.CancelDlg = function (e)
	{
		if (!me.current) return;
		me.current.closeReason = 'cancel';
		if (me.options.inline)
			InleneClose();
		else
			RelativeOverlayClose();
	}

	this.onSuccessSend = function(data, r, $sub)
	{
		$sMain.find('div[_ajax_dlg_path]').html(r.result.html);
		
		if (r.result.no_cache)
			removeFromCache(me.current.path);
		
		if (me.AutoHide(r.result.auto_hide) !== false)
			$root.switchTo('dlg_state', 'main');		
		
		if (r.result.auto_size)
			me.AnimageResize(me.current.dlg);		
	}
	this.AutoHide = function(time)
	{
		if (timer) clearTimeout(timer);
		if (!time) return;
		if (time == 'imm' || time == '0')
		{
			me.CloseDlg();
			return false;
		}
		else if (time == 'auto')
			time = 5000;

		timer = setTimeout(function () { me.CloseDlg(); }, time);
	}

	this.onCloseOverlay = function()
	{
		if (timer) { clearTimeout(timer); timer = null; }

		oAjaxLoad.Abort();
		if (me.current)
		{
			if (me.current.ajaxMaster)
				me.current.ajaxMaster.Abort();

			//обрабатываем вложенные диалоги
			var can_close = true;
			AjaxDlg.FindSubDlg(me.current.dlg).each(function (){
				var obj = $(this).data('AjaxDlg');
				if (obj && obj.current)
				{
					if (event_call(obj.current, 'onCanClose', obj, [!me.current.closeReason || me.current.closeReason == 'cancel']) === false)
					{
						can_close = false;
						return false;
					}	
					if (event_call(obj.current, 'onClose', obj, [!me.current.closeReason || me.current.closeReason == 'cancel']) === false)
						can_close = false;
				}
			});
			if (!can_close) return false;
			//
			if (event_call(me.current, 'onCanClose', this, [!me.current.closeReason || me.current.closeReason == 'cancel']) === false)
				return false;
				
			if (event_call(me.current, 'onClose', this, [!me.current.closeReason || me.current.closeReason == 'cancel']) === false)
				return false;

			//динамический кешь
			if (me.current.dynamic_cache)
			{
				 var ch = findInCache(me.current.path);
				 if (ch)
				 	ch.data.html = me.current.dlg.html();
			}
			//ципочка диалогов
			if (me.queue.length)
			{
				showByQueue();
				return false;
			}
			if (me.options.onStateChaned)
				me.options.onStateChaned.call(me, 'close');
			me.current = null;
		}
	}
	
	function afilter(arr)
	{
		var res = [];
		for (i=0; i<arr.length; i++)
		{
			if (arr[i])
				res.push(arr[i]);
		}
		return res;
	}
	this.AnimageResize = function ($dlg, size)
	{
		if (!options.inline)
		{
			$sCB.width(1000);//для свободного растягивания диалога и снятия с него необходимых размеров

			//плавно меняем размеры
			var newWidth = $dlg.outerWidth();
			var newHeight = $dlg.outerHeight();
			//var pos = $dlg.getCenter(null, newWidth, newHeight);
			var size = dSize || lSize || {width:100, height:100};

			$sCB.width(size.width);
			$sCB.height(size.height);

			$sCB.animate({
				//left: pos.left,
				//top: pos.top,
				height: newHeight,
				width: newWidth
			}, 'fast', false, function() { $sCB.css('overflow', 'visible'); $sCB.height('auto'); });

			$sSaving.width(newWidth);
		}
		else
		{
			//плавно меняем размеры
			var newHeight = $dlg.height();

			$sCB.height(lSize.height);

			$sCB.animate({
				height: newHeight
			}, 'fast', false, function() { $sCB.css('overflow', 'visible'); $sCB.height('auto'); });

			$sSaving.width(newWidth);
		}
	}
	function findInCache(path)
	{
		if (!cache) return null;
		for(var i = 0; i < cache.length; i++)
		{
			if (cache[i] && cache[i].path == path) return cache[i];
		}
		return null;
	}
	function addToCache(path, data)
	{
		if (me.options.no_cache) return;

		cache.push({ path: path, data: data});
	}
	function removeFromCache(path)
	{
		if (!path) return;
		for(var i = 0; i < cache.length; i++)
		{
			if (cache[i] && cache[i].path == path)
			{
				cache[i] = null;
				return;
			}
		}
	}
	function setDlgPos($dlg, loading)
	{
		if (loading) 	dSize = null;

		if (!options.inline)
		{
			if (loading)
			{
				if (!lSize)
				{
					lSize = {
						width: $sLoading.outerWidth(),
						height: $sLoading.outerHeight()
					};
				}
				$sCB.width(lSize.width);
				$sCB.height(lSize.height);
			}
		}
		else
		{
			if (loading)
			{
				if (!lSize)
				{
					lSize = {
						height: $dlg.height()
					};
				}
				else
				{
					$root.height(lSize.height);
				}
			}
		}
	}

	this.ClearCache = function(p)
	{
		$dlg = AjaxDlg.FindDlg(p);
		if ($dlg.length > 0)
			removeFromCache($dlg.attr('_ajax_dlg_path'));
	}
}
/** @static */
AjaxDlg.SwitchTo = function(p, state)
{
	var $root = AjaxDlg.FindRoot(p);
	$root.switchTo('dlg_state', state);
}
/** @static */
AjaxDlg.FindRoot = function(p)
{
	return $(p).closest('[_ajax_dlg]');
}
/** @static */
AjaxDlg.FindDlg = function(p)
{
	return $(p).closest('[_ajax_dlg_path]');
}
/** @static */
AjaxDlg.GetObject = function(p)
{
	var $root = AjaxDlg.FindRoot(p);
	return $root.data('AjaxDlg');
}
/** @static */
AjaxDlg.GetData = function(p)
{
	var data = AjaxDlg.FindDlg(p).data("AjaxDlgInputData");
	return data || {};
}

/** @static */
AjaxDlg.SendForm = function(p)
{
	$(p).AjaxSend();
	var obj = AjaxDlg.GetObject(p);
	if (obj) obj.current.ajaxMaster = $(p).getAjaxMaster();
}
/** @static */
AjaxDlg.Close = function(p, e)
{
	var obj = AjaxDlg.GetObject(p);
	if (obj) obj.CloseDlg(e);
}
/** @static */
AjaxDlg.Cancel = function(p, e)
{
	var obj = AjaxDlg.GetObject(p);
	if (obj) obj.CancelDlg(e);
}
/** @static */
AjaxDlg.onSuccess = function(data, r, $root, $sub)
{
	var obj = AjaxDlg.GetObject($root);
	if (obj) obj.onSuccessSend(data, r, $sub);
}
/** @static */
AjaxDlg.ClearCurrCache = function(p)
{
	var obj = AjaxDlg.GetObject(p);
	if (obj) obj.ClearCache(p);
}
/** @static */
AjaxDlg.FindInlineDlg = function (name)
{
	if (typeof name === 'string') return $('#'+name);
	if ($.isJqObject(name)) return name;
	return $(name);
	//return $('table[_ajax_dlg='+name+']');

}
/** @static */
AjaxDlg.FindSubDlg = function (p)
{
	return $(p).find('table[_ajax_dlg]');
}
/** @static */
AjaxDlg.HasOpenedSubDlg = function(p)
{
	var f = false;
	AjaxDlg.FindSubDlg(p).each(function (){
		var obj = $(this).data('AjaxDlg');
		if (obj && obj.current) f = true;
	});
	return f;
}
/**
Показать инлайновый диалога
@static
*/
AjaxDlg.ShowInline = function (name, url, event, options, data)
{
	$root = AjaxDlg.FindInlineDlg(name);
	if ($root.length == 0) return;
	var obj = $root.data('AjaxDlg');
	if (!obj)
	{
		obj = new AjaxDlg({
			root: $root,
			inline: true
		});
	}
	obj.Show(url, event, options, data);
}

/**
Показать всплывающий диалога
@static
*/
AjaxDlg.ShowPopup = function (url, event, options, data)
{
	if (!$$.AjaxDlg) $$.AjaxDlg = new AjaxDlg();
	$$.AjaxDlg.Show(url, event, options, data);
}
/** @static */
AjaxDlg.AutoHide = function (p, time)
{
	var obj = AjaxDlg.GetObject(p);
	if (obj) obj.AutoHide(time);
}
/** @static */
AjaxDlg.Bind = function (p, name, func)
{
	var obj = AjaxDlg.GetObject(p);
	if (!obj) return;
	switch (name)
	{
		case 'close':
			event_add(obj.current, 'onClose', func);			
			break;
		case 'canclose':
			event_add(obj.current, 'onCanClose', func);			
			break;
	}	
}
/** @static */
AjaxDlg.BindClose = function (p, func)
{
	AjaxDlg.Bind(p, 'close', func);
}
/** @static */
AjaxDlg.BindCanClose = function (p, func)
{
	AjaxDlg.Bind(p, 'canclose', func);
}
/** @static */
AjaxDlg.EditAuto = function (url, dlg_data)
{
	if (!dlg_data) dlg_data = { };
	if (typeof url !== "string" && dlg_data.init_by)
	{
		var ajax_data = $(dlg_data.init_by).attr('_ajax_data');
		if (ajax_data)
		{
			url.find('[_ajax_data]').attr('_ajax_data', ajax_data);
		}
	}
	AjaxDlg.ShowPopup(url, false, { }, $.extend(
		{
			'onSuccess': function (data, new_value, res_value, ajax_table)
			{
				if (dlg_data.replace) $(dlg_data.replace).html(new_value);
				if (dlg_data.append) $(dlg_data.append).append(new_value);
				if (dlg_data.prepend) $(dlg_data.prepend).prepend(new_value);
				if (dlg_data.insertAfter) $(new_value).insertAfter($(dlg_data.insertAfter));
				if (dlg_data.insertBefore) $(new_value).insertAfter($(dlg_data.insertBefore));
				if (dlg_data.replaceWith) $(dlg_data.replaceWith).replaceWith(new_value);
				if (dlg_data.reload) Reload();
				if (dlg_data.eval) eval(dlg_data.eval);				
			}
		}, dlg_data)
	);
}
/** @static */
AjaxDlg.EditAutoInline = function (name, url, dlg_data)
{
	if (!dlg_data) dlg_data = { };
	options = { };
	if (dlg_data.onStateChaned)
	{
		if (typeof(dlg_data.onStateChaned) == 'string')
			options.onStateChaned = function(state) { eval(dlg_data.onStateChaned); }
		else options.onStateChaned = dlg_data.onStateChaned;
	}

	if (typeof url === "string")
		url = url_add_param(url, 'inline', '1');

	AjaxDlg.ShowInline(name, url, false, options, $.extend(
		{
			'onSuccess': function (data, new_value)
			{
				if (dlg_data.replace) $(dlg_data.replace).html(new_value);
				if (dlg_data.append) $(dlg_data.append).append(new_value);
				if (dlg_data.replaceWith) $(dlg_data.replaceWith).replaceWith(new_value);
				if (dlg_data.reload) Reload();
				//if (dlg_data.auto_hide)
				//	AjaxDlg.AutoHide(AjaxDlg.FindInlineDlg(name), dlg_data.auto_hide);
				if (dlg_data.eval) eval(dlg_data.eval);
			}
		}, dlg_data)
	);
}
/** @static */
AjaxDlg.CanNext = function(p, msg)
{
	if (AjaxDlg.HasOpenedSubDlg(AjaxDlg.FindDlg(p)))
	{
		if (msg === false) return false;
		if (!msg) msg = 'Вы не завершили добавление вложенных элементов (зафразировать !!!!???)';
		alert(msg);
		return false;
	}
	return true;
}
/** @static */
AjaxDlg.Confirm = function (msg, header, msg_success, dlg_data)
{
	if (!dlg_data) dlg_data = { };
	$dlg_tpl = $('#ajax_conform_dlg');
	html = $dlg_tpl.val();
	
	html = html.replace('%header%', header).replace('%text%', msg).replace('%success%', msg_success);

	var $by = dlg_data.init_by ? $(dlg_data.init_by) : $('<div></div>');	

	$.each(['_ajax_url', '_ajax_data', '_ajax_before', '_ajax_success'], function (k, v){
		html = html.replace('%'+v+'%', $by.attr(v) || '');
	});
	$dlg_tpl = $('<textarea></textarea>');
	$dlg_tpl.val(html);
	
	AjaxDlg.ShowPopup($dlg_tpl, false, { }, $.extend(
		{
			'onSuccess': function (data, new_value)
			{
				if (dlg_data.replace) $(dlg_data.replace).html(new_value);
				if (dlg_data.reload) Reload();				
			}
		}, dlg_data)
	);
}
/** @static */
AjaxDlg.AutoSuccess = function (p, key_value, res_value, ajax_table)
{
	var obj = AjaxDlg.GetObject(p);
	if (!obj || !obj.current) return;
	var data = obj.current.data;

	// Обработчик события
	if (data && data.onSuccess)
		data.onSuccess.call(obj, data, key_value, res_value, ajax_table);
}

function GroupsSpineTree(list_root, button_root, options)
{
	this.list = $(list_root);
	this.list_toggler = this.list.closest('[groups_spine_root]');
	this.button = $(button_root);
	this.options = options ? options : { };
	this.state = this.options.show_list ? 'opened' : 'closed';
	var _this = this;
	this.show_timer = null;
	this.list_state = false;
	
	this.list.bind('mouseleave', function() { _this.onRootUnhover() });
	this.button.click(function() { _this.ToggleList()});
	this.list.find('[parent_group]').each( function () {
		var el = $(this);
		if(el.find('[subs_popup]').length) el.find('[group_link]').mouseover( function() { _this.onGroupHover(this) })
	});
	
	// Обработчик клика по кнопке вызова дерева
	this.ToggleList = function()
	{
		var new_state = this.state == 'opened' ? 'closed' : 'opened';
		this.button.switchTo('sg_state', new_state).replaceClass('groups_list_' + this.state, 'groups_list_' + new_state);
		if(new_state == 'opened') this.list_toggler.show();
		else this.list_toggler.hide();
		this.state = new_state;
		
		// Сохранение в куках
		if (this.options.cookie_value)
		{
			var cookie = getCookie('tree');
			cookie = typeof(cookie) == "string" ? cookie.split('_') : [];
			if (new_state == "closed")
			{
				if (!in_array(this.options.cookie_value, cookie))
					cookie.push(this.options.cookie_value);
			}
			else
			{
				var i = array_find(this.options.cookie_value, cookie);
				if (i != -1)
					cookie = array_remove(cookie, i);
			}
			
			cookie = array_implode('_', cookie);
			setCookie('tree', cookie, 1000);
		}
	}
	
	
	// Обработчик наведения на группу
	this.onGroupHover = function(p)
	{
		this.ClearShowTimer();
		if (this.list_state)
			_this.GroupsTooltipShow(p);
		else
			this.show_timer = setTimeout(function() { _this.GroupsTooltipShow(p); }, 200);
	}
	
	// Когда курсор за пределами родителя - сбрасываем
	this.onRootUnhover = function()
	{
		this.ClearShowTimer();
		this.list_state = false;
	}
	
	this.ClearShowTimer = function()
	{
		// Очищаем предыдущий таймер
		if (this.show_timer) 
		{
			clearTimeout(this.show_timer);
			this.show_timer = false;
		}
	}
	
	// Позиционирование и вывод туллтипа с подкатегориями
	this.GroupsTooltipShow = function(p)
	{
	 	this.list_state = true;
	 	
	 	// Если iHidder не успеет..
	 	this.list.find('[subs_popup]').hide();
	 	this.list.find('[group_link]').removeClass('group_link_hover');
	 	
	 	var el = $(p);
	 	var group_root = el.closest('[parent_group]');
	 	var popup = group_root.find('[subs_popup]');
	 	
	 	// Шайтанама автовыравнивание по вертикали
	 	var top_pad = $.browser.msie ? 2 : 44; // Отступ на докменю, кроме ИЕ
	 	var DocHeight = $(window).height();
	 	var rel_top = group_root.offset().top;
	 	var top = rel_top - popup.height()/2 + group_root.height()/2;
	 	// Попап от центра вылез за экран вверх, либо вообще выше экрана(пусть лучше вытянет экран вниз)
	 	if(top < $(document).scrollTop() + top_pad || popup.height() > DocHeight - top_pad)
	 	{
	 		top = $(document).scrollTop() + top_pad;
	 		if(top > rel_top) top = rel_top;
 		}
 		// Попап меньше экрана, но от центра залез под экран снизу
	 	else if((top+popup.height()) > ($(document).scrollTop()+DocHeight))
	 	{
	 		top = $(document).scrollTop() + DocHeight - popup.height() - 4;	
	 		if((top + popup.height()) < (rel_top + group_root.height())) top = rel_top - popup.height() + group_root.height();
 		}

		popup.css('top', top);
	 	popup.css('left', group_root.offset().left + group_root.width() - 1);
	 	popup.show();
	 	
	 	el.addClass('group_link_hover');
	 	iHidderInit(popup, el, function(obj) { _this.GroupsTooltipHide(obj)});
 	}
 	
 	// Скрывалка туллтипа для iHidder
 	this.GroupsTooltipHide = function(obj)
 	{
 		//this.ClearShowTimer();
 		obj.toggle_elements.hide();
 		obj.hover_elements.removeClass('group_link_hover');
 	}
}
//#region AjaxTextBox
function AjaxTextBoxInit(p, url, data, options)
{
	var p = $(p).get(0);
	var $AjaxTextBox = new AjaxTextBoxClass(p, url, data, options);
}
jQuery.fn.ajaxTextBox = function(url, data, options)
{
	return this.each(function() {
		var $item = $(this);
		if (!$item.data('AjaxTextBox'))
			$item.data('AjaxTextBox', new AjaxTextBoxClass(this, url || $item.closest('[_ajax_url]').attr('_ajax_url'), data, options));
	});
}
function AjaxTextBoxClass(p, url, data, options)
{
	var _this = this;
	
	this.options = options = $.extend({		
		delay: 500
	}, options);
	
	
	// Корневой элемент 
	var root = this.root = $(p).closest('[ajaxTextBox]');
	
	// Прелоадер
	this.preloader = root.find('[ajaxTextBoxPreloader]');
	
	
	// Поле ввода
	this.input = this.root.find("*").andSelf().filter("[ajaxTextBoxInput]"); 
	if (this.input.length == 0)
	{
		this.input = this.input.end().filter('input,textarea,select');
		if (this.input.length != 1) return false;
	}
		
	this.input.get(0).disabled = false;
	var old_input_class = this.input.get(0).className;
	
	// Метод отправки данных
	this.method = options.method ? options.method : 'POST';
	
	// Урл сохранения
	this.url = url;
	
	// Данные
	this.ajax_data = data;
	var root_data = root.attr('ajaxTextBoxData') || root.attr('_ajax_data');
	if (root_data)
	{
		eval("root_data = " + root_data + ";");
		this.ajax_data = object_merge(this.ajax_data, root_data);
	}
	
	// Чтоб лишний раз не посылать запрос
	var last_saved_value = this.input.val();
	
	
	// Распределяет ссылку на объект по всем детишкам
	this.DistributeToChilds = function ()
	{
		_this.root.find("*").andSelf().each(function() {
			this.$AjaxTextBox = _this;
		});
		
	}
	this.DistributeToChilds();
	
	
	// Обработчик изменения
	this.input.bind("keyup change", function()
	{
		_this.setInputState(last_saved_value == _this.input.val() ? "saved" : "editing")
		
		if (_this.change_timer)
			clearTimeout(_this.change_timer);
			
		AjaxAbort();
		
		_this.change_timer = setTimeout(function() { _this.SaveBegin() }, _this.options.delay);
	
	});
	
	// Сохранение
	this.SaveBegin = function ()
	{
		// Блокируем доп. действия при потере фокуса ввода
		if (_this.disable_saving)
		{
			_this.disable_saving = false;
			return;
		}
			
		var input_value = _this.input.val();
		
		if (last_saved_value == input_value)
		{
			_this.setInputState("saved");
			return;
		}
			
		AjaxAbort();
		
		_this.setInputState("saving");
		
		
		var data = {};
		var var_name = _this.input.attr("ajaxTextBoxVar") ? _this.input.attr("ajaxTextBoxVar") : _this.input.get(0).name;
		data[var_name] = input_value;
		
		data = object_merge(_this.ajax_data, data);
		
		
		_this.ajax = $.ajax({
			"type": _this.method,
			"url": _this.url,
			"data": data,
			"complete": function(data, status){
				
				if (status == 'abort') return;
				
				if (status == "success")
				{
					var r = new AjaxResponse(data);
					 
					// Проверка на ошибку
					if (r.isError())
					{
						_this.disable_saving = true;
						// вывод сообщения об ошибке(ах)
						r.alertErrors();
						_this.setInputState("editing");
						
					}
					
					else
					{
						// Все хорошо
						_this.setInputState("saved");
						last_saved_value = input_value; 
					}
					
				}
				else if (status == 'abort');
				else
				{
					_this.disable_saving = true;
					SH_AlertAjaxError();
					_this.setInputState("editing");
					
				}
				
			}
		});
		
		
	}
	
	// Переключает состояния
	this.setInputState = function(state)
	{
		var state_prefix = _this.options.state_prefix ? _this.options.state_prefix : "";
		
		_this.input.setClass(old_input_class + " " + state_prefix + state);	
		
	
		_this.preloader.css('visibility', state == 'saving' ? 'visible' : '');
		
		//console.log(state);
	}
	
	function AjaxAbort()
	{
		if (_this.ajax)
			_this.ajax.abort();
		
		_this.ajax = false;
	}
}

//#endregion
//----------------------------------------------------

//#region AjaxSwitcher
function iAjaxSwitcherInit (root, url, options)
{
	var $AjaxSwitcher = new AjaxSwitcher(root, url, options);	
}
/** 
Создает класс iAjaxSwitcherClass для переключения состояние с отправкой по ajax
@param str $url - ссылка для отправки по ajax
@param arr $options - параметры:
	switch_key: 'state', //селектор переключения состояния (для switchTo)
	wait_state: 'preloader', //состояние ожидания отправки
	callback_begin: function(sdata, switch_from, switch_to, root) { return true; }, //колбэк ф-ция перед запуском аякса
	callback_end: function (sdata, r, switch_from, switch_to, root) { } //колбек ф-ция при успешной отправки
@help - http://docs.google.com/a/promdex.com/Doc?docid=0AbeyaHqdiFe9ZGc2em5keDVfMThoZ2h4cHRkdg&hl=ru
*/
jQuery.fn.ajaxSwitcher = function(url, options)
{
	return this.each(function() {
		var $item = $(this);
		if (!$item.data('AjaxSwitcher'))
			$item.data('AjaxSwitcher', new AjaxSwitcher($item, url, options));
	});
}

/** Класс переключения состояние с отправкой по ajax
@param dom $root - корневой элемент
@param str $url - ссылка для отправки по ajax
@param arr $options - параметры
@class
*/
function AjaxSwitcher (root, url, options)
{
	var me = this;
	this.$root = $(root);
	
	this.options = $.extend({				
		switch_key: 'state', //селектор переключения состояния (для switchTo)
		wait_state: 'preloader', //состояние ожидания отправки
		callback_begin: function(sdata, switch_from, switch_to, root) { return true; }, //колбэк ф-ция перед запуском аякса
		callback_end: function (sdata, r, switch_from, switch_to, root) { } //колбек ф-ция при успешной отправки
	}, options);
	
	this.url = url;	
		
	// вешаем событие onClick
	this.$root.find("[ajaxSwitchTo]").bind("click", 
		function (e) { 	
			this.$AjaxSwitcher.AjaxSwitch(this);
			CancelBubble(e);
		}
	)
	// распределяет ссылку на объект по всем кнопкам
	.each(function() {
		this.$AjaxSwitcher = me;
	});

	// распределяет ссылку на объект по всем детишкам
	/*root.find("*").andSelf().each(function() {
		this.$AjaxSwitcher = me;
	});*/
	
	this.AjaxSwitch = function (p)
	{		
		var switch_to = $(p).attr("ajaxSwitchTo");
		var switch_from = $(p).attr(me.options.switch_key);
	
		// submit data
		eval("var sdata = " + $(p).attr("ajaxSwitcherData") );
		
		// колбэк ф-ция перед запуском аякса
		if (!me.options.callback_begin.call(this, sdata, switch_from, switch_to, me.$root))
			return false;

		me.$root.switchTo (me.options.switch_key, me.options.wait_state);
	
		$.ajax({		
			type: "POST",
			url: me.url,
			data : sdata,
						
			complete: function(data, status)
			{
				AjaxComplete(data, status, {
					success: function (data, r)
					{
						me.$root.switchTo (me.options.switch_key, switch_to);
						
						// колбэк ф-ция после окончания работы
						me.options.callback_end.call (me, sdata, r, switch_from, switch_to, root);
					},
					error: function (data)
					{
						me.$root.switchTo (me.options.switch_key, switch_from);
					}
				});
			}
		});			
	}	
}
//#endregion


//#region Размножалка мульти-полей

function FeedbackMultiplexor(root, options)
{
	var _this = this;
	
	this.root = root;
	this.container = root.find("[_container]");
	
	
	this.AddField = function ()
	{
		this.container.append(this.root.find("textarea[_field_tpl]").val().replace("</+textarea>", "</textarea>"));
	}

	this.DeleteField = function (p)
	{
		$(p).closest("[_field_node]").remove();
	}
}
//#endregion


//#region PopupHtmlEditor
//function PopupHtmlEditor(root, options)
//{
//	var _this = this;
//	
//	this.root = root;
//	
//	if (!options)
//		options = {};
//		
//	this.options = options
//	
//	/** Отображает/скрывает редактор
//	*/
//	this.Show = function(show, block_id, html, apply_callback, cancel_callback)
//	{
//		if (show)
//		{
//			// Пременяем каллбек
//			if(apply_callback)
//				this.options.apply_callback = apply_callback;
//			if(cancel_callback)
//				this.options.cancel_callback = cancel_callback;
//			
//			// Подгружаем редактор, если нужно
//			if (!this.root.attr('is_loading'))
//			{ 
//				var frame = this.root.find('iframe:first');
//				
//				// Отображем
//				RelativeOverlayShow(this.root);
//				
//				// Вешаем событие
//				frame.load(function(){ _this.LoadContent(block_id, html) });
//				frame.attr("src", this.options.editor_url + (this.options.editor_url.indexOf('?') > 0 ? "&" : "?") + 'module=' + this.options.module + "&type=popup&skin_css=" + this.root.attr("skin_css"));
//				this.root.attr('is_loading', 1);
//			}
//			else
//			{
//				// Отображем
//				//this.root.show();
//				RelativeOverlayShow(this.root);
//				
//				// Загружаем контент
//				this.LoadContent(block_id, html);
//			}
//		
//		}
//		else
//		{
//			// Скрываем
//			RelativeOverlayClose();
//			if(this.options.cancel_callback)
//				this.options.cancel_callback();
//				
//			this.options.apply_callback = false;
//			this.options.cancel_callback = false;
//		}
//	}
//	
//	/** Применяет изменения
//	*/
//	this.LoadContent = function(block_id, html)
//	{
//		if (this.root.is(":hidden"))
//			return;
//			
//		this.root.switchTo('editor_state', 'data');
//		
//		var html_editor = this.GetHtmlEditor();
//		html_editor.SetHtml(html);
//	
//		
//		// Флаг загруженности редактора
//		this.root.attr('is_loaded', 1);
//	}
//	
//	/** Применяет изменения
//	*/
//	this.Apply = function()
//	{
//		// Загружен полностью?
//		if (this.root.attr('is_loaded'))
//		{
//			// Редактор		
//			var html_editor = this.GetHtmlEditor();
//			
//			// Новое значение
//			var db_value = html_editor.GetBbCode();
//			var html_value = html_editor.GetData();
//			
//			if (this.options.apply_callback)
//				this.options.apply_callback(db_value, html_value);
//		}
//		
//		// Скрываем редактор
//		RelativeOverlayClose();
//		this.options.apply_callback = false;
//		this.options.cancel_callback = false;
//	}
//	
//	/** Возвращает объект HTML-редактора
//	*/
//	this.GetHtmlEditor = function()
//	{
//		var frame = this.root.find('iframe:first');
//		var doc;
//		if (frame[0].contentDocument)
//			doc = frame[0].contentDocument;
//		else
//			doc = document.frames['EditorHtmlFrame'].document;
//			
//		var html_editor = $(doc).find("textarea[name=text]")[0].HtmlEditor;
//		
//		return html_editor;
//	}
//}
//#endregion


//#region DynamicHtmlEditor
function DynamicHtmlEditor(root, options)
{
	var me = this;
	var $root = this.$root = $(root);
	this.$root.data('DynamicHtmlEditor', this);
	
	this.options = options || { };
	
	var loading_left = 3;
	var loading_content_result = null;
	
	var ajaxLoad = new AjaxMaster({
		switchStates: "dynhe_state:main,loading,loading",
		switchRoot: $root,
		success: function (r, data, request_data)
		{
			loading_content_result = r.result;
			me.LoadSuccess();
		}
	});
	
	this.Load = function()
	{
		var url = '/feedback/html-editor/ajax/dynamic?entskin='+ (this.options.entskin || '') + '&field_name=' + (this.options.field_name || '');
		ajaxLoad.Send(url);
		$.getScript(StaticUrl  + '/all/ckeditor/ckeditor.js', function(){ me.LoadSuccess(); });
		$.getScript(StaticUrl  + '/js/manual/html_editor.js?v=2.0.1', function(){ me.LoadSuccess(); });		
	}
	this.LoadSuccess = function()
	{
		loading_left--;
		if (loading_left > 0)
			return;
			
		$root.find('[dynhe_state=main]').html(loading_content_result.html);
	}
	
	this.onLoad = function()
	{
		this.HtmlEditor = HtmlEditor.GetObject(this.$root, this.options.field_name);
		
		if (this.html_editor_params)
			this.UpdateParams(this.html_editor_params.html, this.html_editor_params.module, this.html_editor_params.card_id, this.html_editor_params.tmp_uid);
		
		if (this.options.onLoad)
			this.options.onLoad();
			
		ajaxLoad.SwitchTo('main');
	}
	
	this.UpdateParams = function (html, module, card_id, tmp_uid)
	{
		if (this.IsLoaded())
			this.HtmlEditor.UpdateParams(html, module, card_id, tmp_uid);
		else
			this.html_editor_params = {
				'html'		: html,
				'module'	: module,
				'card_id'	: card_id,
				'tmp_uid'	: tmp_uid
			};
	}
	
	this.IsLoaded = function()
	{
		return this.HtmlEditor ? true : false;
	}
	
	this.SetHtml = function(html)
	{
		if (this.IsLoaded())
			this.HtmlEditor.SetHtml(html);
		else if (this.html_editor_params)
			this.html_editor_params.html = html;
		
	}
}

DynamicHtmlEditor.GetObject = function(p, field_name)
{
	return DynamicHtmlEditor.GetRoot(p, field_name).data('DynamicHtmlEditor');
}

DynamicHtmlEditor.GetRoot = function(p, field_name)
{
	if (field_name)
		return $(p).find('[_DynamicHtmlEditor='+ field_name +']');
	else
		return $(p).closest('[_DynamicHtmlEditor]');
}

DynamicHtmlEditor.UpdateParams = function(p, field_name, html, module, card_id, tmp_uid)
{
	var dynEditor = DynamicHtmlEditor.GetObject(p, 'text');
	dynEditor.UpdateParams(html, module, card_id, tmp_uid);
}

//#endregion

//#region SleepingHtmlEditor
function SleepingHtmlEditor(root, options)
{
	var me = this;
	this.options = options || { };
	
	var $root = this.$root = $(root);
	this.$root.data('SleepingHtmlEditor', this);
	this.DynamicHtmlEditor = DynamicHtmlEditor.GetObject($root, this.options.field_name);
	
	this.$textarea_simple = this.$root.find('[sleephe_state=simple]').find('textarea');
	
		
	this.current_state = '';
	
	
	this.UpdateParams = function(html, module, card_idtmp_uid, tmp_uid)
	{
		this.$textarea_simple.val(html);
		this.DynamicHtmlEditor.UpdateParams(html, module, card_id, tmp_uid);
		
		if (IsHtml(html))
		{
			this.SwitchTo('editor');
		}
		
	}
	
	
	this.SwitchTo = function(state)
	{
		if (this.current_state == state)
			return;
			
		this.current_state = state;
		
		if (state == "editor")
		{
			this.DynamicHtmlEditor.SetHtml(this.$textarea_simple.val());
		}
		
		this.$textarea_simple[0].disabled = state == 'editor';
		
		if (this.$textarea_editor && this.$textarea_editor.length > 0)
			this.$textarea_editor[0].disabled = state == 'simple';
			
		
		if (state == 'editor' && !this.DynamicHtmlEditor.IsLoaded())
		{
			this.DynamicHtmlEditor.options.onLoad = function()
			{
				me.$textarea_editor = $root.find('[sleephe_state=editor]').find('textarea[name='+ me.options.field_name +']');
			}
			
			this.DynamicHtmlEditor.Load();
		}
			
		this.$root.switchTo('sleephe_state', state);
		
	}
	
	this.SwitchTo('simple');
	
}

SleepingHtmlEditor.GetObject = function(p, field_name)
{
	return SleepingHtmlEditor.GetRoot(p, field_name).data('SleepingHtmlEditor');
}

SleepingHtmlEditor.GetRoot = function(p, field_name)
{
	if (field_name)
		return $(p).find('[_SleepingHtmlEditor='+ field_name +']');
	else
		return $(p).closest('[_SleepingHtmlEditor]');
}

SleepingHtmlEditor.SwitchTo = function(p, state, field_name)
{
	var editor = SleepingHtmlEditor.GetObject(p, field_name);
	editor.SwitchTo(state);
};

//#endregion

//#region HtmlEditorHelper

function HtmlEditorHelper() { };

HtmlEditorHelper.UpdateParams = function(p, field_name, html, module, card_id, tmp_uid)
{
	// Ищем сначала sleeping
	var slEditor = SleepingHtmlEditor.GetObject(p, field_name);
	if (slEditor)
	{
		slEditor.UpdateParams(html, module, card_id, tmp_uid);
		return;
	}
	
	var dynEditor = DynamicHtmlEditor.GetObject(p, field_name);
	if (dynEditor)
	{
		dynEditor.UpdateParams(html, module, card_id, tmp_uid);
		return;
	}
	
	var editor = HtmlEditor.GetObject(p, field_name);
	if (editor)
	{
		editor.UpdateParams(html, module, card_id, tmp_uid);
		return;
	}
}

HtmlEditorHelper.Reinit = function(p, field_name)
{
	var slEditor = SleepingHtmlEditor.GetObject(p, field_name);
	if (slEditor)
	{
		slEditor.SwitchTo('simple');
		return;
	}
}

HtmlEditorHelper.FindAllEditors = function(p)
{
	var $p = $(p);
	var rreturn = {};
	$p.find("table[_HtmlEditor]").each(function(){
		rreturn[$(this).attr("_HtmlEditor")] = $(this).data("HtmlEditor");
	});
	
	return rreturn;
}
	
HtmlEditorHelper.PrepareForSubmit = function(p)
{
	var $form = $(p).closest("form");
	if ($form.length == 0)
		$form = $(p).find("form:first");
		
	if ($form.length == 0)
		return;
		
	var editors = HtmlEditorHelper.FindAllEditors($form);
	for(var key in editors)
	{
		var $inp = $form.find("textarea[name="+ key +"]");
		if ($inp.length > 0)
		{
			$inp.removeAttr("name");
			
			var $inp_submit = $form.find("input[type=hidden][name="+ key +"]");
			if ($inp_submit.length == 0)
			{
				$inp_submit = $('<input type="hidden" name="'+ key +'">');
				$inp_submit.appendTo($form);
				
				var $inp_ready_flag = $('<input type="hidden" name="'+ key +'_rf" value="1">');
				$inp_ready_flag.appendTo($form);
			}
			
			$inp_submit.val(editors[key].GetBbCode());
		}
	}
}

HtmlEditorHelper.Prepare = function($p)
{
	return HtmlEditorHelper.PrepareForSubmit($p);
}
//#endregion

//#region Telephone
function Telephone(root, options)
{
	var _this = this;
	
	this.root = $(root);
	
	this.options = options ? options : {};
	
	this.code_field = this.root.find("[_field_type=DD_List]:first");
	this.telephone_field = this.root.find("input[telephone_field]:first");
	this.telephone_code = this.root.find("input[telephone_code]:first");
	// Интерфейс
	this.root.data('IValue', this);
	
	this.SetValue = function (value, sender)
	{
		if (sender.attr("_field_type") == "Telephone")
		{
			var values = value.split("-");
			if (values.length < 2)
				values = ["", ""];
			
			var code = this.code_field.data("JsControl");
			if (code) code.SetValue(values[0]);
			
			this.telephone_code.val(values[0]);
			this.telephone_field.val(values[1]);
		}
		else
		{
			ConsoleLog("Ошибка в JsControl<Telephone>. Не поддерживается вызов SetValue для вложенных элементов");
		}
	}
}
//#endregion


//#region ImageAutoEditor
function ImageAutoEditor() { };

ImageAutoEditor.FindRoot = function(p)
{
	return $(p).closest('[_field_image_ae]');
}

ImageAutoEditor.Delete = function(p)
{
	var $root = ImageAutoEditor.FindRoot(p);
	var name = $root.attr('_field_image_ae');
	$root.find('[_field_image_ae_img]:first').hide();
	$root.find('[_field_image_ae_b_del]:first').hide();
	$root.find('[_field_image_ae_b_res]:first').show();
	$root.find('[_field_image_ae_field]:first').hide();
	
	var $prev = $root.find('input[type=hidden][name='+ name +'_pv]');
	$prev.attr('_field_image_ae_prev', $prev.val())
	$prev.val('');
	
}

ImageAutoEditor.Change = function(p)
{
	var $root = ImageAutoEditor.FindRoot(p);
	var name = $root.attr('_field_image_ae');
	$root.find('[_field_image_ae_field]:first').toggle();	
}

ImageAutoEditor.RestorePrevious = function(p)
{
	var $root = ImageAutoEditor.FindRoot(p);
	var name = $root.attr('_field_image_ae');
	$root.find('[_field_image_ae_img]:first').show();
	$root.find('[_field_image_ae_b_del]:first').show();
	$root.find('[_field_image_ae_b_res]:first').hide();
	$root.find('[_field_image_ae_field]:first').hide();
	
	var $prev = $root.find('input[type=hidden][name='+ name +'_pv]');
	$prev.val($prev.attr('_field_image_ae_prev'));
}

//#endregion 

//#region deferredChange
function DeferredChange(input, func, delay, $options)
{
	var me = this;
	var $root = $(input);
	this.$root = $root;
	this.$input = $(input);
	
	this.options = object_merge({}, $options);
	
	var timer = null;
	delay = delay || 400;
	
	var oldVal = $root.val();
	var newVal;
	
	
	this.onChange = function(e)
	{
		oldVal = newVal;
		func.call(this, this.$input[0], e);
	}
	
	this.CheckChange = function(by_timer, e)
	{
		me.ClearTimer();
		newVal = me.$input.val();
		if (oldVal != newVal)
		{
			if (by_timer)
			{
				timer = setTimeout(function () { 
					me.onChange(e);
				}, delay);
			}
			else
				this.onChange(e);
		}
	}
	
	this.ClearTimer = function()
	{
		if (timer) clearTimeout(timer);
		timer = null;
	}
	
	this.onChangeTimer = function(e)
	{
		this.CheckChange(true, e);
	}
	this.Clear = function()
	{
		me.$input.val('');
		
		this.CheckChange(false, e);
	}
	
	
	$root.change(function(e) 
	{
		me.CheckChange(false, e);
	});
	
	$root.bind('keyup', function(e)
	{ 
		me.onChangeTimer(); 
	});
	
	
	$root.bind('keydown', function(e)
	{
		if (e.keyCode == 13)
		{
			me.CheckChange(false, e);
			return false;
		}
	});
	
}
/** Подписка на событие отложенного изменения 
@param func - функция
@param int delay - задержка в милисикундах, по умолчанию = 400
*/
jQuery.fn.deferredChange = function(func, delay, $options)
{
	return this.each(function() 
	{
		var $item = $(this);
		if (!$item.data('DeferredChange'))
		{
			$obj = new DeferredChange(this, func, delay, $options);
			$item.data('DeferredChange', $obj);
		}
	});
}
//#endregion

//#region onInputNumber
/** ограничивает вод для input
@static
@param obj $p - 
@param obj $e - 
@param str $type - 'i' - целое число, 'f' - вещественное
@return bool - 
*/
function onInputNumber(p, e, type)
{
	if (!e && window.event) e = event;
	if (!e) return;
	
	if (e.keyCode < 49) return true; //служебные кода
	if (e.keyCode >= 49 && e.keyCode <= 57 && !e.shiftKey) return true; //цыфры
	if (e.keyCode >= 96 && e.keyCode <= 105 && !e.shiftKey) return true; //num цыфры 
	if (type == 'f')
	{
		var val = p.value;
		if (/[\.,]/i.test(val)) return false;
		if (!e.shiftKey && (e.keyCode == 190 || e.keyCode == 188)) return true; //.,
		if (e.keyCode == 191 || e.keyCode == 110) return true;
	}
	return false;
}
//#endregion


//#region enterKey
function EnterKeyEvent(input, func, $options)
{
	var me = this;
	var $root = $(input);
	this.$root = $root;
	this.$input = $(input);
	
	this.options = object_merge({}, $options);
	
	
	this.onEnter = function(e)
	{
		func.call(this, this.$input[0], e);
	}
	
	
	$root.bind('keydown', function(e)
	{
		if (e.keyCode == 13)
		{
			me.onEnter(e);
			//return false;
		}
	});
	
}

/** Подписка на событие отложенного изменения 
@param func - функция
@param int delay - задержка в милисикундах, по умолчанию = 400
*/
jQuery.fn.enterKey = function(func, $options)
{
	return this.each(function() 
	{
		var $item = $(this);
		if (!$item.data('EnterKeyEvent'))
		{
			$obj = new EnterKeyEvent(this, func, $options);
			$item.data('EnterKeyEvent', $obj);
		}
	});
}
//#endregion
// JavaScript Document

// SEARCH
var InteractiveMap_lng_scale = 0.000010689951881062143; // longitude in 1px for 17 scale 
var InteractiveMap_lat_scale = 0.000007041074826759086; // latitude in 1px for 17 scale

var InteractiveMap_width, InteractiveMap_height;

var InteractiveMap_BasePoint = new Array();
var InteractiveMap_scale;

var InteractiveMap_main_office = 0;

var InteractiveMap_new_points = 0;

var InteractiveMap_maxlength = 0;
var InteractiveMap_minlength = 0;
var InteractiveMap_selected_length = 0;

var InteractiveMap_placemark = new Array();
var InteractiveMap_data = new Array();

var InteractiveMap_distinctPoints = new Array();

var InteractiveMap_map;

var InteractiveMap_BaseScale = 3;	// масштаб для одного объекта

// SCROLL
var InteractiveMap_Scroll_drag = 0;
var InteractiveMap_Scroll_x = 0;
var InteractiveMap_Scroll_x_px = 0;

var InteractiveMap_Scroll_x_dx = 0;

   
// PERSONAL CABINET
var InteractiveMap_PC_change_place=false;
var InteractiveMap_PC_ajax;
 
var InteractiveMap_PC_Container;
 
var InteractiveMap_PC_Styles = new Array();

var InteractiveMap_Tables = new Array();
	
InteractiveMap_Tables = {"ent_card": 0, "ent_agcy": 1};

InteractiveMap_default_settings = false;
InteractiveMap_default_x = 63;
InteractiveMap_default_y = 56;
InteractiveMap_default_scale = 3;

InteractiveMap_PC_Styles = {
	
		"ent_card": {
				"base_icon": '<img src="'+ StaticUrl +'/all/0.gif" style="background:url('+ StaticUrl +'/img/interactive_map/icons/main_office.png) no-repeat" width="50" height="50" class="png">',
				"new_icon": '<img src="'+ StaticUrl +'/all/0.gif" style="background:url('+ StaticUrl +'/img/interactive_map/icons/main_office_selecting.png) no-repeat" width="48" height="48" class="png">',
				"base_dpoint": {"x": -20, "y": -50},
				"new_dpoint": {"x": -20, "y": -50},
				"image_path": "/data/ent/card_main/"
					},
					
		"ent_agcy": {
				"base_icon": '<img src="'+ StaticUrl +'/all/0.gif" style="background:url('+ StaticUrl +'/img/interactive_map/icons/agcy.png) no-repeat" width="100" height="100" class="png">',
				"new_icon": '<img src="'+ StaticUrl +'/all/0.gif" style="background:url('+ StaticUrl +'/img/interactive_map/icons/agcy_selecting.png) no-repeat" width="100" height="100" class="png">',
				"base_dpoint": {"x": -20, "y": -50},
				"new_dpoint": {"x": -20, "y": -50},
				"image_path": "/data/ent_agcy/card_main/"
					}
		};

// OTHER FUNCTIONS
var InteractiveMap_OF_ajax;

var InteractiveMapOFPoint = new Array();


function InteractiveMap_BuildSearchResultMap(container, data)
{ 
	 
	InteractiveMap_width = container.offsetWidth;
	InteractiveMap_height = container.offsetHeight;

	InteractiveMap_FindExtr(data); 

	InteractiveMap_map = new YMaps.Map(container);
    InteractiveMap_map.setCenter(new YMaps.GeoPoint(InteractiveMap_BasePoint.x, InteractiveMap_BasePoint.y), InteractiveMap_scale);
	
	 
	InteractiveMap_map.addControl(new YMaps.TypeControl()); 
	InteractiveMap_map.addControl(new YMaps.ToolBar());
	InteractiveMap_map.addControl(new YMaps.Zoom());
	//InteractiveMap_map.addControl(new YMaps.MiniMap()); 
	InteractiveMap_map.addControl(new YMaps.ScaleLine());
 

	var main_office_index;
	
	
	InteractiveMap_maxlength = 0;
	InteractiveMap_minlength = 0;
	InteractiveMap_placemark = new Array();

	for (var d in data)  
	{
		
		InteractiveMap_placemark[d] = new YMaps.Placemark( InteractiveMap_SetPoint (data[d]["map_x"], data[d]["map_y"], data[d]["main_office"]) );
		
		if (data[d]["main_office"])
		{
			InteractiveMap_placemark[d].setOptions({style:InteractiveMap_SetStyles(data[d], d, {"x": -20, "y": -50}, InteractiveMap_PC_Styles["ent_card"].base_icon), hideIcon:true});
			InteractiveMap_placemark[d].disableBalloon(); 
			InteractiveMap_main_office = d;
		}
		else   
		{
			
			var search_base_icon = $("#interactive_map_template_search_base_icon").html().replace('%price%',data[d]["price"]).replace('%cy%', data[d]["cy"]).replace('%units%', data[d]["units"]);
			
			InteractiveMap_placemark[d].setOptions({style: InteractiveMap_SetStyles(data[d], d, {"x": -24, "y": -48}, search_base_icon), hideIcon:true});
 
		}   
		InteractiveMap_map.addOverlay(InteractiveMap_placemark[d]); 
		InteractiveMap_map.addOverlay(InteractiveMap_placemark[d]);  // Второй нужен для долбанутого IE иначе херово отображает иконки

	
	}   

	
	if (!InteractiveMap_main_office)
	{
		InteractiveMap_main_office = 0;
		$("#InteractiveMap_ForRegisterUsers").hide();
	}
	
	var i = 0;

	for (var p in data)
	{
		
		if (p != InteractiveMap_main_office)
		{
			
			InteractiveMap_placemark[p].distance = InteractiveMap_placemark[InteractiveMap_main_office]._point.distance(InteractiveMap_placemark[p]._point)/1000;
			
			if (!InteractiveMap_minlength)
				InteractiveMap_minlength = InteractiveMap_placemark[p].distance*1;
			else if (InteractiveMap_minlength*1 > InteractiveMap_placemark[p].distance*1)
				InteractiveMap_minlength = InteractiveMap_placemark[p].distance*1;
		
			if (InteractiveMap_maxlength < InteractiveMap_placemark[p].distance*1)
				InteractiveMap_maxlength = InteractiveMap_placemark[p].distance*1; 
			
			var image_rep = "";
			
			if (data[p]["image"])
				image_rep = '<img src="' + data[p]["image"] + '">';
			
			var search_balloon_content = $("#interactive_map_template_search_balloon_content").html().replace('%name%',data[p]["name"]).replace('%ent_name%', data[p]["ent_name"]).replace('%distance%', Math.floor(InteractiveMap_placemark[p]["distance"])).replace("%image%",image_rep).replace('%price%', data[p]["price"]).replace('%cy%', data[p]["cy"]).replace('%id%', data[p]["id"]).replace('%id%', data[p]["id"]).replace('%id%', data[p]["id"]).replace('%id%', data[p]["id"]).replace('%id%', data[p]["id"]).replace('%id%', data[p]["id"]) + "";
			
				 
			
			InteractiveMap_placemark[p].setBalloonContent(search_balloon_content); 
		}

	} 
	
	 
	InteractiveMap_data = data;
	
	InteractiveMap_selected_length = InteractiveMap_maxlength;
	
	InteractiveMap_SetScrollValues();
	
	//document.getElementById("interactive_map_templates").innerHTML = "";

}

	function InteractiveMap_SetScrollValues()
	{
		
		var step = (InteractiveMap_maxlength - InteractiveMap_minlength)/6;
		
		var left_padd = InteractiveMap_minlength/6;
		
		if (InteractiveMap_new_points == 1)
		{
			$("#InteractiveMap_Scale").hide();
		}
		else
		{
			
			$("#InteractiveMap_Scroll_linevalue_0").html(Math.floor(InteractiveMap_minlength) + " км");
			$("#InteractiveMap_Scroll_linevalue_1").html(Math.floor(step*6+InteractiveMap_minlength) + " км");
			$("#InteractiveMap_Scroll_linevalue_2").html(Math.floor(step*5+InteractiveMap_minlength) + " км");
			$("#InteractiveMap_Scroll_linevalue_3").html(Math.floor(step*4+InteractiveMap_minlength) + " км");
			$("#InteractiveMap_Scroll_linevalue_4").html(Math.floor(step*3+InteractiveMap_minlength) + " км");
			$("#InteractiveMap_Scroll_linevalue_5").html(Math.floor(step*2+InteractiveMap_minlength) + " км");
			$("#InteractiveMap_Scroll_linevalue_6").html(Math.floor(step+InteractiveMap_minlength) + " км");
		}
	}

	function InteractiveMap_FindExtr (data, main_office_req)
	{
		
		var icons_count = 0;
		var min_lng, min_lat, max_lng, max_lat;
		
		min_lng = min_lat = 180;
		max_lng = max_lat = 0;
		
		for (var d in data)
		{ 
		
			icons_count++;
		
			if (data[d]["main_office"])
			{
				InteractiveMap_main_office = d; 
				
				if (!main_office_req)
					continue;  
			}
			
			if (min_lng*1 > data[d]["map_x"]*1) 
				min_lng = data[d]["map_x"]*1;
				
			if (min_lat*1 > data[d]["map_y"]*1)
				min_lat = data[d]["map_y"]*1;  
				
			if (max_lng*1 < data[d]["map_x"]*1)
				max_lng = data[d]["map_x"]*1;  
				 
			if (max_lat*1 < data[d]["map_y"]*1) 
				max_lat = data[d]["map_y"]*1;  
		}
		  
		var dlng = max_lng*1 - min_lng*1 + (max_lng*1 - min_lng*1) / 3.5;
		var dlat = max_lat*1 - min_lat*1 + (max_lng*1 - min_lng*1) / 3.5; 
		  
		  
		InteractiveMap_BasePoint.x = min_lng*1 + dlng/2;
		InteractiveMap_BasePoint.y = min_lat*1 + dlat/2; 
		 
		
	 	// InteractiveMap_lng_scale - долгота 
		// InteractiveMap_lng_scale - долгота на 1 пиксель
		// InteractiveMap_width - длина в пикселях
		// InteractiveMap_width*InteractiveMap_lng_scale - долгота для массштаба 17 на текущих размерах карты 
		
		// InteractiveMap_lat_scale - широта
		// InteractiveMap_lat_scale - широта на 1 пиксель 
		// InteractiveMap_height - высота в пикселях
		// InteractiveMap_height*InteractiveMap_lat_scale - широта для массштаба 17 на текущих размерах карты

	 
		var i=17;
		
		var curr_lng_k = InteractiveMap_lng_scale;
		var curr_lat_k = InteractiveMap_lat_scale;

	
		while (dlng >= curr_lng_k*InteractiveMap_width || dlat >= curr_lat_k*InteractiveMap_height)
		{
			
			curr_lng_k *= 2;
			curr_lat_k *= 2;
			
			i--;
		} 
		
		var limit = 2;
		
		if (main_office_req)
			limit = 1;
		
		if (icons_count <= limit)
		{
			i = InteractiveMap_BaseScale;
			
			if (icons_count == 1)
			{
				InteractiveMap_BasePoint.x = data[InteractiveMap_main_office].map_x;
				InteractiveMap_BasePoint.y = data[InteractiveMap_main_office].map_y;
			}
		}
		
		if (i > 9)
			i = 9;
			
		InteractiveMap_scale = i; 
			
	}

	function InteractiveMap_SetPoint (x, y, main_office)
	{ 
	
		if (!InteractiveMap_distinctPoints[x + "|" + y])
		{
			if (!main_office)
				InteractiveMap_new_points++;
			InteractiveMap_distinctPoints[x + "|" + y] = true;
		}
		else
		{ 
			x = x*1 - 0.0004 + Math.random()/125;
			y = y*1 - 0.0002 + Math.random()/250;    
			
			InteractiveMap_distinctPoints[x + "|" + y] = true;
		} 
		
		var point = new YMaps.GeoPoint(x, y);
		return point;
	}
	
	
	function InteractiveMap_SetStyles (data, count, point, text)
	{
		var s = new YMaps.Style(); 
        s.iconStyle = new YMaps.IconStyle("interactive_map#template" + count);
        s.iconStyle.offset = new YMaps.Point(point.x, point.y);  
        YMaps.Styles.add("interactive_map#" + count, s); 
          
        var t = new YMaps.Template(); 
         
		t.text = text; 
			
        YMaps.Templates.add("interactive_map#template" + count, t);	
		
		return "interactive_map#" + count;
	}
 
 
	function InteractiveMap_ChangeUrlLength()
	{
		

		var farest_point = new Array();
		farest_point.dx = 0; farest_point.dy = 0; 


		for (d in InteractiveMap_data)   
		{    
		
			if (InteractiveMap_placemark[d].distance*1 > 0 && (InteractiveMap_selected_length*1+InteractiveMap_minlength*1) >= InteractiveMap_placemark[d].distance*1) 
			{
				farest_point.dx = Math.max(farest_point.dx, Math.abs(InteractiveMap_placemark[d]._point.__lng - InteractiveMap_data[InteractiveMap_main_office].map_x));
				farest_point.dy = Math.max(farest_point.dy, Math.abs(InteractiveMap_placemark[d]._point.__lat - InteractiveMap_data[InteractiveMap_main_office].map_y));
			}
		}

			 
		var location = "/product/ajax/search" + "?qs=" + SCloud_query_data.qs + "&ew=" + SCloud_query_data.ew ;
		
		
		farest_point.dx = Math.ceil(farest_point.dx*10000 + 90)/10000;
		farest_point.dy = Math.ceil(farest_point.dy*10000 + 90)/10000;	
		
			
		if (farest_point.dx*1 == 0 && farest_point.dy*1 == 0)
		{
			farest_point.dx = 0.0001;
			farest_point.dy = 0.0001;
		}
	
		location += "&dx=" + farest_point.dx + "&dy=" + farest_point.dy;
				
		PSSearch_UrlGo( decodeURI(location) );	
		
		$("#InteractiveMap_CancelFilter").show();

	}
 
function InteractiveMap_CancelFilter ()
{
	$("#InteractiveMap_CancelFilter").hide();
	
	var location = "/product/ajax/search" + "?qs=" + SCloud_query_data.qs + "&ew=" + SCloud_query_data.ew;
	
	PSSearch_UrlGo( decodeURI(location) );	
}
 
function InteractiveMap_HideMap ()
{
	$("#InteractiveMap_RootContainer").css("visibility", "hidden");
}
 
//#########################################################################################################################################################
//SCROLL###################################################################################################################################################
//#########################################################################################################################################################



function InteractiveMap_Scroll_displayCoords(e)
{
	InteractiveMap_Scroll_x_px = e.pageX; 
	InteractiveMap_Scroll_setImage(e.pageX,e.pageY);
}	 


function InteractiveMap_Scroll_ff()  
{  

	var ua = navigator.userAgent.toLowerCase();
 	if((ua.indexOf("msie") != -1 && ua.indexOf("opera") == -1 && ua.indexOf("webtv") == -1))
	{
		InteractiveMap_Scroll_x_px = window.event.clientX+document.body.scrollLeft+5;
		InteractiveMap_Scroll_setImage(window.event.clientX+document.body.scrollLeft,window.event.clientY+document.body.scrollTop);
	}
	
} 


function InteractiveMap_Scroll_BeginDrag(evn)
{
	var e = evn;
	if (!e)
		e = event;
	
	result = getPos(document.getElementById("InteractiveMap_Scroll_pointer"));
	InteractiveMap_Scroll_x_dx = Math.abs(result.left - InteractiveMap_Scroll_x_px);
	
	InteractiveMap_Scroll_drag=true;  
	
	if (e && e.preventDefault)
		e.preventDefault();

	return true;
} 
  
 
function InteractiveMap_Scroll_EndDrag()
{
	InteractiveMap_Scroll_drag=false;
	 
}    
  
function InteractiveMap_Scroll_setImage(x,y)
{  
	var root_container = $("#InteractiveMap_RootContainer");
	if (!root_container || !root_container.length)
		return;
		
	x = x - root_container.position().left;
	var pointer = document.getElementById("InteractiveMap_Scroll_pointer");
	
	if (pointer != null)
	{ 
		
		var const_left = pointer.offsetWidth/2 + InteractiveMap_Scroll_x_dx-5;
		var const_left_max = pointer.offsetWidth/2 + InteractiveMap_Scroll_x_dx-5 + $("#InteractiveMap_Scroll_LeftInfo").width();
	
		if(InteractiveMap_Scroll_drag && x>const_left_max && x<(const_left_max+document.getElementById("InteractiveMap_Scroll_line").offsetWidth)-40)
		{	
			pointer.style.left = x - const_left_max; 
			InteractiveMap_Scroll_x = x;
	
			InteractiveMap_selected_length = (x - const_left_max)*( (InteractiveMap_maxlength - InteractiveMap_minlength) / (document.getElementById("InteractiveMap_Scroll_line").offsetWidth - const_left*2));
	  
			for (d in InteractiveMap_data)  
			{    
				if (InteractiveMap_placemark[d]["distance"] > 0)
				{
					if (InteractiveMap_selected_length + InteractiveMap_minlength > InteractiveMap_placemark[d]["distance"]) 
						InteractiveMap_map.addOverlay(InteractiveMap_placemark[d]);
					else 
					{
						if (InteractiveMap_placemark[d].__destructListener) 
							InteractiveMap_map.removeOverlay(InteractiveMap_placemark[d])
					}
				}
			}
			
		}
	}
	
}

function InteractiveMap_InitCarret()
{
	var carret = $("#InteractiveMap_Scroll_pointer");
	
	var left_info = $("#InteractiveMap_Scroll_LeftInfo");
	
	var line = $("#search_result_map_root");
	
	
	carret.css("top", "-11px");
	carret.css("left",  line.width() - carret.width() - left_info.width() - 2); 
}


//#########################################################################################################################################################
//PERSONAL CABINET#########################################################################################################################################
//#########################################################################################################################################################

function InteractiveMap_PC_ChangePlace()
{ 

	if (!InteractiveMap_PC_change_place)
		SH_table_set_state("#InteractiveMap_state", "changing");

	// меняем занчение переключателя
	InteractiveMap_PC_change_place = InteractiveMap_PC_change_place ? false : true;
}

function InteractiveMap_ChangePersonalCabinet(container, data)
{	
	  
	InteractiveMap_data[0] = data; 
		
	InteractiveMap_PC_Container = container;
		
	InteractiveMap_scale = InteractiveMap_BaseScale;
		
	if (data.map_x == 0 && data.map_y == 0)
	{
		InteractiveMap_default_settings = true;
		
		data.map_x = InteractiveMap_default_x;
		data.map_y = InteractiveMap_default_y;
		InteractiveMap_scale = InteractiveMap_default_scale;
	}

		
	InteractiveMap_map = new YMaps.Map(container);
    InteractiveMap_map.setCenter(new YMaps.GeoPoint(data.map_x, data.map_y), InteractiveMap_scale);
	
	 
	InteractiveMap_map.addControl(new YMaps.TypeControl()); 
	InteractiveMap_map.addControl(new YMaps.ToolBar());
	InteractiveMap_map.addControl(new YMaps.Zoom());
	//InteractiveMap_map.addControl(new YMaps.MiniMap()); 
	InteractiveMap_map.addControl(new YMaps.ScaleLine());

	

	if (!InteractiveMap_default_settings)
	{
		var point = new YMaps.GeoPoint(data["map_x"], data["map_y"]); 
		InteractiveMap_PC_AddPlaceholder (point, 0, InteractiveMap_PC_Styles[data["table"]].base_icon, InteractiveMap_PC_Styles[data["table"]].base_dpoint); 	}

	
	YMaps.Events.observe(InteractiveMap_map, InteractiveMap_map.Events.Click, function (mEvent) {

		if (InteractiveMap_PC_change_place)
		{
			
			SH_table_set_state("#InteractiveMap_state", "changed");
			
			if (InteractiveMap_placemark[1]) 
				InteractiveMap_map.removeOverlay(InteractiveMap_placemark[1])
			
			InteractiveMap_PC_AddPlaceholder (mEvent._point, 1, InteractiveMap_PC_Styles[data["table"]].new_icon, InteractiveMap_PC_Styles[data["table"]].new_dpoint); 
			
			var pForm = getParentByTagName(container, "FORM");
			pForm.map_x.value = InteractiveMap_placemark[1]._point.__lng;
			pForm.map_y.value = InteractiveMap_placemark[1]._point.__lat;
		}
		
    }); 
}  

function InteractiveMap_PC_CancelSelecting()
{
	
	
	var pForm = getParentByTagName(InteractiveMap_PC_Container, "FORM");
	pForm.map_x.value = InteractiveMap_data.map_x;
	pForm.map_y.value = InteractiveMap_data.map_y;  
	
	// если есть вторая точка - удаляем как указатель так и её значение
	if (InteractiveMap_placemark[1])
	{
		InteractiveMap_map.removeOverlay(InteractiveMap_placemark[1]);
		InteractiveMap_placemark[1] = null;
	}
	
	if (InteractiveMap_PC_change_place)
		InteractiveMap_PC_ChangePlace();
	
	SH_table_set_state("#InteractiveMap_state", "start");

		
}



function InteractiveMap_PC_AddPlaceholder(point, index, content, dpoint)
{
	
	InteractiveMap_placemark[index] = new YMaps.Placemark(point);
		 
	InteractiveMap_placemark[index].setOptions({style:InteractiveMap_SetStyles(false, index, dpoint, content), hideIcon:true});
		
	InteractiveMap_map.addOverlay(InteractiveMap_placemark[index]); 
	

	if (index == 0 && InteractiveMap_data.image || index == InteractiveMap_main_office)
	{
		
		var image,path;
		
		if (index == InteractiveMap_main_office)
		{
			if (InteractiveMap_data[index].image)
			{
				path = InteractiveMap_PC_Styles["ent_card"].image_path;
				image = InteractiveMap_data[index].image;
			}
			else
				InteractiveMap_placemark[index].disableBalloon();
		}
		else
		{
			path = InteractiveMap_PC_Styles[InteractiveMap_data.table].image_path;
			image = InteractiveMap_data.image;
		}
			
		InteractiveMap_placemark[index].setBalloonContent('<div><img src="' + path + image + '" /></div>');
			

		InteractiveMap_map.__overlays[index].openBalloon();
		InteractiveMap_map.__overlays[index].openBalloon(); // а вот тут второй для долбаной Oper'ы
	}
	else
	{
		
		
		if (InteractiveMap_main_office)
			if (InteractiveMap_data[index].source_html)
			{
				InteractiveMap_placemark[index].setBalloonContent (InteractiveMap_data[index].source_html);
				return;
			}
		
		
		InteractiveMap_placemark[index].disableBalloon();
	}
}



//#########################################################################################################################################################
//OTHER PESOLNAL CABINET###################################################################################################################################
//#########################################################################################################################################################

function InteractiveMap_OPC_Load(container, data)
{
	
	InteractiveMap_data = data;
	
	InteractiveMap_PC_Container = container;

	InteractiveMap_width = container.offsetWidth;
	InteractiveMap_height = container.offsetHeight;

	InteractiveMap_FindExtr(data, true); 

	InteractiveMap_map = new YMaps.Map(container);
    InteractiveMap_map.setCenter(new YMaps.GeoPoint(InteractiveMap_BasePoint.x, InteractiveMap_BasePoint.y), InteractiveMap_scale);

	 
	InteractiveMap_map.addControl(new YMaps.TypeControl()); 
	InteractiveMap_map.addControl(new YMaps.ToolBar()); 
	InteractiveMap_map.addControl(new YMaps.Zoom());
	//InteractiveMap_map.addControl(new YMaps.MiniMap()); 
	InteractiveMap_map.addControl(new YMaps.ScaleLine());
	
	
	for (var d in data)  
	{
		var point = new YMaps.GeoPoint(data[d]["map_x"], data[d]["map_y"]); 
		InteractiveMap_placemark[d] = new YMaps.Placemark(point);
		
		var table = "ent_agcy";
		
		if (data[d]["main_office"])
			table = "ent_card";
			
		InteractiveMap_PC_AddPlaceholder (point, d, InteractiveMap_PC_Styles[table].base_icon, InteractiveMap_PC_Styles[table].base_dpoint); 
	
	}   
	  

}

function InteractiveMap_OPC_SetWindowScroll ()
{
	var pos = getPos (InteractiveMap_PC_Container);
	self.scroll(0,pos.top);
}

function InteractiveMap_OPC_SetCenterMainOffice () 
{
	
	InteractiveMap_map.__overlays[InteractiveMap_main_office].openBalloon();
	
	for (var d in InteractiveMap_data)  
		if (d != InteractiveMap_main_office)	
			InteractiveMap_map.__overlays[d].closeBalloon();
	
	InteractiveMap_OPC_SetWindowScroll ();
	InteractiveMap_SetCenterMap (InteractiveMap_data[InteractiveMap_main_office].map_x, InteractiveMap_data[InteractiveMap_main_office].map_y);
}

function InteractiveMap_OPC_SetCenterAgcy (id) 
{
	InteractiveMap_OPC_SetWindowScroll ();
	
	InteractiveMap_map.__overlays[InteractiveMap_main_office].closeBalloon();
	
	for (var d in InteractiveMap_data)  
	{
		InteractiveMap_map.__overlays[d].closeBalloon();
		if (InteractiveMap_data[d].id == id && d != InteractiveMap_main_office)
		{ 
		
			InteractiveMap_map.__overlays[d].openBalloon();
			InteractiveMap_SetCenterMap (InteractiveMap_data[d].map_x, InteractiveMap_data[d].map_y);
			break;  
		}
	}
	
	
}

function InteractiveMap_SetCenterMap (map_x, map_y)
{
	var point = new YMaps.GeoPoint(map_x, map_y); 
	InteractiveMap_map.panTo(point);
}

//#########################################################################################################################################################
// OTHER FUNCTIONS ########################################################################################################################################
//#########################################################################################################################################################

function InteractiveMap_OF_GetCoordByCity(id)
{

	if (window.location.pathname.toLowerCase() != "/register/3")
		return;
		 
	if (InteractiveMap_OF_ajax)
		InteractiveMap_OF_ajax.abort();
		
	InteractiveMap_OF_ajax = $.ajax(
	{
		type: "POST",
		
		url: "/interactive_map/ajax/get-coord-by-city?id=" + id,		
		 
		complete: function(data, status){ 
		InteractiveMap_OF_AjaxFinish(data, status);
		}
		
		});	
		
}
		
function InteractiveMap_OF_AjaxFinish(data, status, p)
{
   
	if (status == "success")
		eval("var result = " + data.responseText);
	else
		SH_AlertAjaxError();


	if (InteractiveMap_placemark[0])
		InteractiveMap_map.removeOverlay(InteractiveMap_placemark[0]);

	// настраиваем центр карты
	var point = new YMaps.GeoPoint(result.x, result.y); 
	InteractiveMap_PC_AddPlaceholder (point, 0, InteractiveMap_PC_Styles["ent_card"].base_icon, InteractiveMap_PC_Styles["ent_card"].base_dpoint);
	InteractiveMap_map.panTo(InteractiveMap_placemark[0]._point); 
	
	var pForm = getParentByTagName(InteractiveMap_PC_Container, "FORM");
	pForm.map_x.value = result.x;
	pForm.map_y.value = result.y;   
}


function GroupsSub(root)
{
	this.root = $(root);
	this.list_block = root.find('div[groups_list]:first');
	this.list_h = this.list_block.height();
	this.list_block.height(this.list_h).css('overflow', 'hidden');
	this.list_block.find('tr').show();
	this.root.data('_gl_state', 'cut');
	
	this.tmp_h = 0;
	
	this.LockList = function()
	{
		this.list_block.height(this.tmp_h);
		this.list_block.css('overflow', 'hidden');
	}
	
	this.UnlockList = function()
	{
		this.tmp_h = this.list_block.height();
		this.list_block.css('height', 'auto').css('overflow', 'visible');
	}
	
	this.ToggleList = function(force_state)
	{
		var curr_state = root.data('_gl_state');
		if(force_state == curr_state) return false;
		
		var new_state = force_state || curr_state == 'cut' ? 'full' : 'cut';
		
		if(new_state == 'full')
		{
			this.UnlockList();
			var new_h = this.list_block.height();
			this.LockList();
		}
		else var new_h = this.list_h;
		
		root.replaceClass('groups_sub_' + curr_state, 'groups_sub_' + new_state);
		
		this.list_block.animate({ 'height': new_h }, 'fast');
		
		root.data('_gl_state', new_state);
	}
}

GroupsSub.ToggleGroups = function(p, force_state)
{
	var root = $(p).closest('div.groups_sub_root');
	if(!root.length) return false;
	
	var gs_obj = root.data('_gl_obj');
	
	if(!gs_obj)
	{
		gs_obj = new GroupsSub(root);
		root.data('_gl_obj', gs_obj);
		gs_obj.ToggleList(force_state);
	}
	else gs_obj.ToggleList(force_state);
}
/** класс для списка элементов
- управляет вложенным в него input
- для этого input можно использовать функцию jquery.val()
	
@param $options - 
	items: '>[listitem_value]',//селектор элементов списка
	itemValue: 'listitem_value', //атрибут элемента списка, в котором хранится значение элемента
	currItemClass: 'curr_item',//имя класса, которое будет добавлено к выделенному элементу
	hoverClass: 'hover_item', //имя класса, которое добавляется к наведенному элементу
	allowNull: false, //false - если значение списка не указано, то будет выбран 1 элемент списка		
	multiSelect: false //true - разрешает множественное выделение
	//дополнительные параметры:
	onSelectItem: function ($item) { 	}//обработчик события при выбере элемента списка
	initValue: <значение>, //значени, которое будет установлено при инициализации
@class	
*/
function ListBox(item, options)
{
	var me = this;
	this.$root = $(item);

	this.options = $.extend({		
		items: '>[listitem_value]',//селектор элементов списка
		itemValue: 'listitem_value', //атрибут элемента списка, в котором хранится значение элемента
		currItemClass: 'curr_item',//имя класса, которое будет добавлено к выделенному элементу
		hoverClass: 'hover_item', //имя класса, которое добавляется к наведенному элементу
		allowNull: false, //false - если значение списка не указано, то будет выбран 1 элемент списка		
		multiSelect: false //true - разрешает множественное выделение
		//дополнительные параметры:
		//onSelectItem: function ($item) { 	}//обработчик события при выбере элемента списка
		//initValue: <значение>, //значени, которое будет установлено при инициализации
	}, options);
	
	if (this.options.inputName)
		this.$input = this.$root.closest('form').find('input[name='+this.options.inputName+']');
	else	
		this.$input = this.$root.find('input');
		
	this.$input.data('ListBox', this).data('IValue', this);
	this.$root.data('IValue', this);
	
	this.$items = this.$root.find(me.options.items)
	.click(function(e){
		onSelectItem($(this), true);
	})
	.hover(
		function () {
			$(this).addClass(me.options.hoverClass);
		},
		function () {
			$(this).removeClass(me.options.hoverClass);
		}
   );

	this.Refresh = function()
	{
		var val = me.$input.val();
		if (me.options.multiSelect)
		{
			var arr = val.split(';');
			var fl = false;
			for (var i = 0; i < me.$items.length; i++)
			{
				if (in_array($(me.$items.get(i)).attr(me.options.itemValue), arr))
				{
					onSelectItem($(me.$items.get(i)));
					fl = true;
				}
			}
			return fl;
		}
		else
		{
			for (var i = 0; i < me.$items.length; i++)
			{
				if ($(me.$items.get(i)).attr(me.options.itemValue) == val)
				{
					onSelectItem($(me.$items.get(i)));
					return me.$items.get(i);
				}
			}
		}
	}
	function addValue(id, list)
	{
		if (!list) return id;
		var arr = list.split(';');
		var res = "";
		var fl = false;
		for (var i = 0; i < arr.length; i++)
		{			
			res += (res.length ? ";" : "") + arr[i];
			if (arr[i] == id) fl = true;
		}
		if (!fl) res += (res.length ? ";" : "") + id;
		return res;
	}
	function removeValue(id, list)
	{
		if (!list) return "";
		var arr = list.split(';');
		var res = "";
		for (var i = 0; i < arr.length; i++)
		{
			if (arr[i] != id)
				res += (res.length ? ";" : "") + arr[i];
		}
		return res;
	}
	function onSelectItem($item, click)
	{
		if (me.options.multiSelect)
		{
			if (click)
			{
				if ($item.hasClass(me.options.currItemClass))
				{
					//снимаем выделение
					$item.removeClass(me.options.currItemClass);
					me.$input.val_old(removeValue($item.attr(me.options.itemValue), me.$input.val()));
				}
				else
				{
					//ставим выделение
					$item.addClass(me.options.currItemClass);
					me.$input.val_old(addValue($item.attr(me.options.itemValue), me.$input.val()));
				}				
			}
			else 
			{
				$item.addClass(me.options.currItemClass);
			}			
		}
		else 
		{
			me.$input.val_old($item.attr(me.options.itemValue));
			me.$items.removeClass(me.options.currItemClass);
			$item.addClass(me.options.currItemClass);
		}

		if (me.options.onSelectItem) me.options.onSelectItem($item, click);
	}
	
	this.GetValue = function()
	{
		return me.$input.val_old();
	}
	
	this.SetValue = function(id)
	{
		me.$input.val_old(id);
		me.Refresh();
	}
	
	this.Reset = function()
	{
		me.SetValue(me.options.initValue);
	}
	
	//превоначальная инициализация
	if (me.options.initValue)
		me.$input.val_old(me.options.initValue);
	else
		me.options.initValue = me.$input.val_old();
	
	if (!me.Refresh() && !me.options.allowNull && me.$items.length > 0)
		onSelectItem($(me.$items.get(0)), true);	
	
};
/** создание ListBox
@param $options - 
	items: '>[listitem_value]',//селектор элементов списка
	itemValue: 'listitem_value', //атрибут элемента списка, в котором хранится значение элемента
	currItemClass: 'curr_item',//имя класса, которое будет добавлено к выделенному элементу
	hoverClass: 'hover_item', //имя класса, которое добавляется к наведенному элементу
	allowNull: false, //false - если значение списка не указано, то будет выбран 1 элемент списка		
	multiSelect: false //true - разрешает множественное выделение
	//дополнительные параметры:
	onSelectItem: function ($item) { 	}//обработчик события при выбере элемента списка
	initValue: <значение>, //значени, которое будет установлено при инициализации
*/
jQuery.fn.listbox = function(options)
{
	return this.each(function() {
		var $item = $(this);
		if (!$item.data('ListBox'))
			$item.data('ListBox', new ListBox($item, options));
	});
}
/*
*	Track  id of parent elenemt
*	Tracker  id of tracked element
*	OnUpdate  function whitch calls on each value change
*	OnComplete  function whitch calls on end of the drag
*	FingerOffset  distance between mouse pointer and corner tracker's edge
*	FormatNumbers  lead numders in hairlines with spaces
*	Min & Max  range of vaues
*	MinSpace  minimum difference between Min & Max
*	RoundTo  values will be rounded to this value
*	Margins  indent between Track & Tracker
*	AllowedValues  force Tracker to stick to the values
*
*	OnUpdate  function whitch called each time, when Tracker moved
*	OnComplete  function whitch called when user stop draging
*/

function cDoubleTrackBar(Track, Tracker, Settings) {
	this.Track = $(Track).get(0);
	this.Tracker = $(Tracker).get(0);
	if (!Track || !Tracker)
		return false;
	this.OnUpdate = Settings.OnUpdate;
	this.OnComplete = Settings.OnComplete;
	this.FingerOffset = Settings.FingerOffset || 0;
	this.FormatNumbers = Settings.FormatNumbers || false;
	this.Min = Settings.Min || 0;
	this.Max = Settings.Max || 100;
	this.MinSpace = Settings.MinSpace || 0;
	this.RoundTo = Settings.RoundTo || 1;
	this.Margins = Settings.Margins || 0;
	this.AllowedValues = Settings.AllowedValues || false;

	if (this.Min >= this.Max)
		this.Max = this.Min +1;
	this.MinPos = this.Min;
	this.MaxPos = this.Max;
	if (this.Max - this.Min < this.MinSpace)
		this.MinSpace =  this.Max - this.Min;
	if (this.Max - this.Min < this.RoundTo)
		this.RoundTo =  this.Max - this.Min;
	this.MinSpace = Math.ceil(this.MinSpace/this.RoundTo)*this.RoundTo;
	
	this.Track.style.width = (this.Track.clientWidth || this.Track.offsetWidth) + 'px';
	this.OnTrackMouseDown = this.bindAsEventListener(this.TrackMouseDown);
	this.OnDocumentMouseMove = this.bindAsEventListener(this.DocumentMouseMove);
	this.OnDocumentMouseUp = this.bindAsEventListener(this.DocumentMouseUp);
	this.MinTmr = 0;
	this.MaxTmr = 0;

	this.bindEvent(this.Track, 'mousedown', this.OnTrackMouseDown);

	this.TrackerLeft = 0;
	this.UpdateTracker(this.Track.offsetWidth + this.FingerOffset);
	if(Settings.MinPos) this.SetPos(Settings.MinPos, true);
	if(Settings.MaxPos) this.SetPos(Settings.MaxPos, false);
	this.Disabled = (typeof Settings.Disabled != 'undefined') ? Settings.Disabled : false;
	if (typeof this.OnUpdate == 'function') {
		this.OnUpdate.call(this);
	}
}
cDoubleTrackBar.prototype = {

	TrackMouseDown: function(event) {
		this.TrackerLeft = this.Tracker.offsetLeft - this.Margins;
		this.TrackerRight = this.TrackerLeft + this.Tracker.offsetWidth;

		this.TrackerOffsets = this.getOffsets(this.Track);

		var X = event.clientX + document.documentElement.scrollLeft;
		X -= this.TrackerOffsets[0];

		this.Left = Math.abs(this.TrackerLeft-X+this.Margins) <= Math.abs(this.TrackerRight-X+this.Margins);

		if (typeof this.Disabled == 'function') {
			if ( this.Disabled.call(this) )
				return true;
		} else if ( this.Disabled )
			return true;
		
		this.UpdateTracker(X);

		this.bindEvent(document, 'mousemove', this.OnDocumentMouseMove);
		this.bindEvent(document, 'mouseup', this.OnDocumentMouseUp);

		return this.stopEvent(event);
	},
	DocumentMouseMove: function(event) {
		this.UpdateTracker(event.clientX + document.documentElement.scrollLeft - this.TrackerOffsets[0]);
		return this.stopEvent(event);
	},
	DocumentMouseUp: function(event) {
		this.unbindEvent(document, 'mousemove', this.OnDocumentMouseMove);
		this.unbindEvent(document, 'mouseup', this.OnDocumentMouseUp);

		if (typeof this.OnComplete == 'function') {
			this.OnComplete.call(this);
		}
		return this.stopEvent(event);
	},
	UpdateTracker: function(X){
		var _LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
		var _minSpace = Math.floor(_LogicWidth*this.MinSpace/(this.Max-this.Min));
		var _oldMin = this.MinPos;
		var _oldMax = this.MaxPos;

		X -= this.Margins;
		if (this.Left) {
			X += this.FingerOffset;
			this.TrackerLeft = Math.max(0, Math.min(this.TrackerRight - _minSpace - 1, X));
			this.MinPos = Math.round((this.Min + this.TrackerLeft*(this.Max-this.Min)/_LogicWidth) / this.RoundTo) * this.RoundTo;
			if (this.MinSpace >= this.MaxPos - this.MinPos) {
				this.MinPos = this.MaxPos - this.MinSpace;
			}
			if (this.AllowedValues) {
				this.TrackerLeft = Math.round(_LogicWidth*(this.MinPos - this.Min)/(this.Max - this.Min));
			}
		} else {
			X -= this.FingerOffset;
			this.TrackerRight = Math.max(this.TrackerLeft + _minSpace + 1 , Math.min(_LogicWidth + 1, X));
			this.MaxPos = Math.round((this.Min + (this.TrackerRight-1)*(this.Max-this.Min)/_LogicWidth) / this.RoundTo) * this.RoundTo;
			if (this.MinSpace >= this.MaxPos - this.MinPos) {
				this.MaxPos = this.MinPos + this.MinSpace;
			}
			if (this.AllowedValues) {
				this.TrackerRight = Math.round(_LogicWidth*(this.MaxPos - this.Min)/(this.Max - this.Min))+1;
			}
		}
		this.Tracker.style.width = (this.TrackerRight - this.TrackerLeft) + 'px';
		this.Tracker.style.left = (this.Margins + this.TrackerLeft) + 'px';

		if (typeof this.OnUpdate == 'function')
			if ( !this.AllowedValues || (this.AllowedValues && (_oldMax!=this.MaxPos || _oldMin!=this.MinPos)) )
				this.OnUpdate.call(this);
	},
	
	SetPos: function (pos, is_min) {
        
		this.Left = is_min;
		pos = pos * 1;
                
		if((typeof this.Disabled != 'function' && this.Disabled) || (typeof this.Disabled == 'function' && this.Disabled.call(this)) || isNaN(pos))
		{
			if (typeof this.OnUpdate == 'function') this.OnUpdate.call(this);
			return false;
		}

		if(!is_min) pos++; // При смещении правого края значение почему-то уменьшается на 1 
	
		var LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
		pos = Math.round(pos / this.RoundTo) * this.RoundTo;
		
		var n_pos = this.Margins + pos * LogicWidth / this.Max;

		this.UpdateTracker(n_pos);
		if (typeof this.OnComplete == 'function') this.OnComplete.call(this);
	},
	
	SetPosTmr: function (pos, is_min) {
		_this = this;
		if(is_min)
		{
			clearTimeout(this.MinTmr);
			this.MinTmr = setTimeout(function() { _this.SetPos(pos, is_min); }, 700);
		}
		else
		{
			clearTimeout(this.MaxTmr);
			this.MaxTmr = setTimeout(function() { _this.SetPos(pos, is_min); }, 700);
		}
	},
	
	AddHairline: function (pos) {
		var _Touch = this.Track.appendChild( document.createElement('div') );
		var _LogicWidth = this.Track.offsetWidth - this.Margins*2 - 1;
		
		_Touch.style.left = this.Margins + _LogicWidth/(this.Max-this.Min)*(pos-this.Min) + 'px';
		_Touch.className = 'touch';
		_Touch.innerHTML = "<span>" + (this.FormatNumbers ? this.leadSpaces(pos) : pos) + "</span>";
	},
	
	AutoHairline: function(num) {
		if (num >= 1)
			this.AddHairline(this.Min);
		if (num >= 2)
			this.AddHairline(this.Max);
		if (num >= 3) {
			num--;
			var diff = this.Max - this.Min;
			var roundTo = [10, 20, 50, 100, 250, 500, 1000, 2000, 5000, 10000, 20000, 50000, 100000, 250000, 500000, 1000000];
			var DoRound = 1;
			for (var i=0; roundTo[i]; i++) {
				DoRound = roundTo[i]/10;
				if (roundTo[i]>diff)
					break;
			}
			for (var i=1; i<num; i++) {
				var val = this.Min + diff/num*i;
				val = Math.round(val/DoRound)*DoRound;
				this.AddHairline(val);
			}
		}
	},
	
	getOffsets: function(element) {
	    var valueT = 0, valueL = 0;
	    do {
			valueT += element.offsetTop  || 0;
			valueL += element.offsetLeft || 0;
			element = element.offsetParent;
	    } while (element);
	    return [valueL, valueT];
	},
	leadSpaces: function(numb) {
		var res = '';
		numb = numb.toString();
		var l = numb.length;
		for (var i=l; i>0; i--)
			if ((l-i)%3==2)
				res = '&nbsp;'+numb.charAt(i-1)+res;
			else
				res = numb.charAt(i-1)+res;
		return res;
	},
	bindEvent: function(element, event, callBack){
		if (element.addEventListener) {
			element.addEventListener(event, callBack, false);
		} else {
			element.attachEvent('on' + event, callBack);
		}
	},
	unbindEvent: function(element, event, callBack){
		if (element.removeEventListener) {
			element.removeEventListener(event, callBack, false);
	    } else if (element.detachEvent) {
			element.detachEvent('on' + event, callBack);
	    }
	},
	bindAsEventListener: function (callBack) {
		var _object = this;
		return function(event) {
			return callBack.call(_object, event || window.event);
		}
	},
	stopEvent: function (event){
		if (event.preventDefault) {
			event.preventDefault();
			event.stopPropagation();
		} else {
			event.returnValue = false;
			event.cancelBubble = true;
		}
		return false;
	}
}

function BalanceSlider(root, options)
{
	var _this = this;
	this.options = options || { };
	this.root = $(root).find('[slider]');
	this.field_left = $(this.options.left_input);
	this.field_right = $(this.options.right_input);
	this.half = this.options.total_value / 2;
	
	this.onSlide = function(event, ui, is_change)
	{
		var l_value = Round(this.half - ui.value, 2);
		var r_value = Round(this.half + ui.value, 2)
		this.field_left.val(digit_to_str(l_value, 2, this.options.is_price));
		this.field_right.val(digit_to_str(r_value, 2, this.options.is_price));
		
		if(this.options.onslide)
			this.options.onslide({ left : l_value, right : r_value });
			
		if(is_change && this.options.onchange)
			this.options.onchange({ left : l_value, right : r_value });
	}
	
	/** Сеттер значиений
	index - идентификатор поля: 0 - левое, 1 - правое
	*/
	this.SetValue = function(index, value)
	{
		value = GetFloat(value);
		if(value < 0) value = 0;
		else if(value > this.options.total_value) value = this.options.total_value;
		
		if(index == 0) val = this.half - value;
		else val = value - this.half;
		
		this.root.slider('value', val);
	}
	
	this.SetValueTimeout = function (index, value)
	{
		if (this.set_value_timer)
		{
			clearTimeout(this.set_value_timer);
			this.set_value_timer = null;
		}
		
		this.set_value_timer = setTimeout(function(){ _this.SetValue(index, value) }, 1000);
	}
	
	// Инициализация
	this.root.slider({
		min : -(this.half),
		max : this.half,
		range : 'min',
		step : this.options.step ? this.options.step : 0.01,
		slide : function(event, ui) { _this.onSlide(event, ui); },
		change : function(event, ui) { _this.onSlide(event, ui, true); }
	});
	
	// Значения по умолчанию
	if(this.options.left_value)
		this.SetValue(0, this.options.left_value);
	else if(this.options.right_value)
		this.SetValue(1, this.options.right_value);
	else
		this.root.slider('value', 0);
	
	// События полей ввода
	this.field_left.bind('keyup', function() { _this.SetValueTimeout(0, $(this).val()); });
	this.field_right.bind('keyup', function() { _this.SetValueTimeout(1, $(this).val()); });
}
function Notification()
{
	this.admin = false;
	this.Toggle = function(event, p)
	{
		if(event)
		{
			// Не срабатывать на ссылках
			var target = event.target || event.srcElement;
			if(target.tagName == 'A' || $(target).closest('a').length) 
			{
				var href = (target.tagName == 'A') ? $(target).attr('href') : $(target).closest('a').attr('href');
				Go(href);
				return true;
			}
			else if ($(target).closest('[_ajax]').length) return true;
		}
		
		var root = $(p).hasClass('notify_root') ? $(p) : $(p).closest('[notify_root]');
		var notes_root = root.closest('[notes_root]');
		var is_toggle = false;
		if(root.find('[state="full"]').is(':visible')) is_toggle = true; 
		notes_root.find('[notify_root]').switchTo('state', 'cut').replaceClass('notify_on', 'notify_off');
		if(!is_toggle)
		{
			this.onUnHover(root);
			root.switchTo('state', 'full').replaceClass('notify_off', 'notify_on');
		}
		//if(root.find('[alr_new]').is(':visible') && !this.admin)
		//	this.setRead(root);	
	}
	this.setRead = function ($p)
	{						
		$.ajax({
			type: "get",
			url: "/notification/ajax/read",
			data: { id : $p.attr('notify_root') },
			complete: function(data, status){
				if (data.responseText == "OK")
				{
					$p.find("[alr_new]").hide();
					$('#nt_not_read_cnt').increment(-1);
				}					
			}
		});			
	}
	this.Delete = function (p)
	{			
		var $root = $(p).closest('[notify_root]');
		var $notes_root = $root.closest('[notes_root]');
		$root.switchTo('del_status', 'wait');
		$.ajax({
			type: "get",
			url: "/notification/ajax/delete",
			data: { id : $root.attr('notify_root') },
			complete: function(data, status)
			{
				if (status == "success")
				{
					var r = new AjaxResponse(data);
					if (r.isError()) r.alertErrors();
					else
					{
						$nr = $root.find("[alr_new]");
						if ($nr.length && !$nr.is(":hidden"))
							$('#nt_not_read_cnt').increment(-1);
												
						$('#nt_all_count').increment(-1);
						$root.remove();
						return;
					}
				}
				//елси любай ошибка
				$root.switchTo('del_status', 'init');				
			}
		});			
	}
	this.onNotRead = function(p)
	{
		Go($(p).attr('url'));
	}
	this.onHover = function(p)
	{
		if($(p).find('[state="full"]').is(':hidden')) $(p).addClass('notify_hover');
	}
	this.onUnHover = function(p)
	{
		if($(p).find('[state="full"]').is(':hidden')) $(p).removeClass('notify_hover');
	}
	this.Vote = function(p, e, value)
	{
		var $root = $(p).closest('[vote_root]');
		var ajax = $root.get(0).ajax;
		if (ajax) ajax.abort();
		$root.get(0).ajax = $.ajax({
			type: "get",
			url: "/notification/ajax/vote",
			data: {
				id : $root.attr('vote_root'),
				v : value
			},
			complete: function(data, status)
			{
				if (status == 'abort') return;
				
				if (status == "success")
				{
					var r = new AjaxResponse(data);
					if (r.isError()) r.alertErrors();
					
					else
					{
					    //...
					}
				}					
			}
		});		
		CancelBubble(e);
		//сразу ставим метку
		$root.find('[vote]').replaceClass('voted_notify', 'novoted_notify');
		$(p).closest('[vote]').replaceClass('novoted_notify', 'voted_notify');
		return false;
	}
}
$$.Notification = new Notification();
function PeriodSlider(root, options)
{
	var _this = this;
	this.options = options || { };
	this.limit = options.limit ? options.limit : 0;
	this.root = root.find('[slider]');
	this.limiter = this.root.find('.ui-slider-limit');
	this.start_date = NewDate(this.options.start_date);
	this.value = this.options.value;
	this.lock_ui = false;
	
	if(typeof(this.options.input_selector) == 'string' && this.options.input_selector.charAt(0) == '#')
		this.input = $(this.options.input_selector);
	else
		this.input = root.find(this.options.input_selector);
	
	
	this.date_block = this.root.find('.ui-curr-date');
	this.curr_date = this.date_block.find('[date]');
	this.curr_month = this.date_block.find('[month]');
	
	// Каллбек для слайдера
	this.onChange = function(event, ui, is_change)
	{
		if(ui.value < this.limit && this.limit <= this.options.period)
		{
			this.root.slider('value', this.limit);
			this.value = this.limit;
			this.call_cb(is_change);
			return false;
		}
		else if(ui.value >= this.limit)
		{
			var current = calc_date(ui.value, this.start_date);
			this.date_block.css('left', $(ui.handle).position().left);
			this.curr_date.html(current.getDate());
			this.curr_month.html(Msg.month_i[current.getMonth() + 1]);
			
			if(this.limit < this.options.period) this.value = ui.value;
			
			var out_value = this.options.out_diff ? this.value - this.limit : this.value;
			
			this.input.val(out_value);
			//ConsoleLog('Лимит в пределах шкалы');
		}
		
		if(!this.lock_ui) this.call_cb(is_change);
	}
	
	this.call_cb = function(is_change)
	{
		if(this.options.onslide)
			this.options.onslide({ value : this.value, limit : this.limit });
			
		if(is_change && this.options.onchange)
			this.options.onchange({ value : this.value, limit : this.limit });
	}
	
	// Сеттер для значения
	this.SetValue = function(value)
	{
		value = GetInt(value);
		if(value < 0)
			value = 0;
		
		if(this.options.out_diff)
			value = value + this.limit;
		else
			value = value < this.limit ? this.limit : value;
		
		this.value = value;
		
		if(value > this.options.period)
		{
			this.lock_ui = true;
			this.root.slider('value', this.options.period);
			this.input.val(this.options.out_diff ? value - this.limit : value);
			this.value = value;
			this.lock_ui = false;
			this.call_cb(true);
		}
		else
			this.root.slider('value', value);
	}
	
	// Сеттер для лимита
	this.SetLimit = function(limit)
	{
		if(limit < 0) limit = 0;
		
		var curr_period = this.value - this.limit;
		
		this.limiter.css('width', ((limit > this.options.period ? this.options.period : limit) * 100 / this.options.period) + '%');
		
		this.limit = limit;
		
		this.SetValue(curr_period + (this.options.out_diff ? 0 : limit));
	}
	
	// Заблокировать на текущем значении
	this.Lock = function()
	{
		this.SetLimit(this.value);
	}
	
	// Инициализация
	this.root.slider({
		min : 0,
		max : this.options.period,
		range : 'min',
		slide : function(event, ui) { return _this.onChange(event, ui); },
		change : function(event, ui) { return _this.onChange(event, ui, true); }
	});
	
	this.input.bind('keyup', function() { _this.SetValue($(this).val()) });
	
	if(this.options.limit)
		this.SetLimit(this.options.limit);
	
	if(this.options.value !== undefined)
		this.SetValue(this.options.value);
}
$$.MainMenu = (function()
{
	var _this = this;
	this.locked = false;
	
	this.Init = function()
	{
		this.root = $('#mmenu_static').closest('table.MM2_root');
		this.popup = $('#mm_popup_root');
		
		this.buttons = this.root.find('a[_popup_id]').click(function() {
			_this.ShowPopup(this);
		});
		
		this.root.BCH(function(){ _this.HidePopup(); }, true);
	}
	
	this.ShowPopup = function(p)
	{
		var id = $(p).attr('_popup_id');
		if(!id || this.popup.find('[popup_id='+ id +']').is(':visible')) return false;
		
		this.root.ToggleBCH(true);
		this.LockPopup(false);
		this.popup.switchTo('popup_id', id).show();
		// Если есть поле ввода - снимаем с него фокус
		this.popup.find('input.mm_form_qs:first').blur();
		iHidderInit(this.popup, $('#dock_menu'), function(){ _this.HidePopup(); }, { 'bind_to_hover': true, 'delay': 400 });
	}
	
	this.HidePopup = function()
	{
		if(!this.locked)
		{
			this.root.ToggleBCH(false);
			this.popup.hide();
		}
	}
	
	this.LockPopup = function(lock)
	{
		this.locked = lock;
	}
	
	$(function(){ _this.Init(); });
	
	return this;
})();
//#region AjaxMaster

/**
@param mix $options -
form - jQuery или DOM формы, из кот. будут взяты параметры
frame - 1, отправляет не с помощью AJAX, а в iframe. Для корректной работы, обязательно должна быть передеана форма через options.form!
error, success, loading, beforeSend, stateChanged: события. Могут быть как функцией, так и строкой JS-кода.
alertError : функция вывода ошибок
conectionErrorOff : true | false - отключает вывод стандартной ошибки подключения
switchStates : Если не задан, switchTo не вызывается. Если == "auto", то эквиваленто "state:main,loading,success". Строка в формате state_attr:state_1,state_2,state_3 .state_attr может быть не указан, по-умолчанию "state". state_1, state_2, state3 - состояния исходное, загрузка, success.
switchRoot : Элемент для switch
noSwitchIfError : не переключаться в состояние main, если возникла ошибка. Нужно в частности для AjaxDlg
sendType : get | post (default)
@return mix -
@class
*/
function AjaxMaster(options)
{
	var _this = this;

	this.options = options = options || {};
	this.ajax = null;

	if (options.switchStates == "auto")
		options.switchStates = "state:main,loading,success";

	// Разбор options.switchStates
	if (options.switchStates && typeof(options.switchStates) == "string")
	{
		var info_1 = options.switchStates.split(":");
		options.switchStates = {};
		var states;

		if (info_1.length == 2)
		{
			options.switchStates.name = info_1[0];
			states = info_1[1];
		}
		else
		{
			options.switchStates.name = "state";
			states = info_1[0];
		}

		var info_2 = states.split(",");
		options.switchStates.main = info_2[0];
		options.switchStates.loading = info_2[1];
		options.switchStates.success = info_2[2];
	}
	
	if (this.options.switchRoot)
		this.$switch_root = this.options.switchRoot;
		
	this.options.form = $(this.options.form).length > 0 ? $(this.options.form) : null;
	
	
	// Функция отрпавки
	this.Send = function(url, data)
	{
		if (this.options.delay)
			this.SendDelay(this.options.delay, url, data);
		else
			this.SendNoDelay(url, data);
	}
	
	// Подготовка к отправке
	this.SendNoDelay = function(url, data)
	{
		url = url || this.options.url;
		
		data = data || {};
		
		// Передана форма?
		if (this.options.form)
			data = object_merge(this.options.form.getAjaxDataByForm(), data);
		
		// Сливаем в общим options.ajax_data
		if (this.options.ajax_data)
			data = object_merge(this.options.ajax_data, data);
			
		//добавляем данные для rollback
		if (this.options.ajax_rollback && this.options.loopMode)
		{
			data._d = this.options.ajax_d;
			data._s = this.options.ajax_s;
		}
		// onBeforeSend
		if (this.options.beforeSend)
			if (!this.options.beforeSend.call(this, data))
				return false;
		
		// onLoading
		if (this.options.loading) this.options.loading.call(this, data);
		
		// Переключалка
		this.SwitchTo("loading");
		
		// Отменяем предыдущий
		this.Abort();
		
		// Оптправляем
		if (this.options.frame)
			this.SendFrame(url, data);
		else
			this.SendAjax(url, data);
	}
	
	// Функция запуска аякса
	this.SendAjax = function(url, data)
	{
		// AJAX
		this.ajax = $.ajax({
			"type": this.options.sendType || "POST",
			"url": url,
			"data": data,
			"complete": function(request_data, status)
			{
				_this.ajax = false;
				
				if (status == 'abort' || request_data.readyState == 0) return;
				
				if (status == 'success')
				{
					var r = new AjaxResponse(request_data);

					// Проверка на ошибку
					if (r.isError())
					{
						

						// вывод сообщения об ошибке(ах)
						if (_this.options.alertError)
							_this.options.alertError.call(_this, status, r, data, request_data);
						else
							r.alertErrors();

						// Event
						if (_this.options.error)
							_this.options.error.call(_this, status, r, data, request_data);
							
						// Переключалка
						if (!_this.options.noSwitchIfError)
							_this.SwitchTo("main", data);


					}
					else
					{
						// Все хорошо
						//сохраняем данные для rollback
						if (_this.options.ajax_rollback && _this.options.loopMode)
						{
							_this.options.ajax_d = r.result._d;
							_this.options.ajax_s = r.result._s;
						}
						// Переключалка
						_this.SwitchTo("success", data, r.result);

						// Event
						if (_this.options.success)
							_this.options.success.call(_this, r, data, request_data);
					}

				}
				
				else
				{
					
					if (!_this.options.conectionErrorOff)
						SH_AlertAjaxError(request_data);

					// Event
					if (_this.options.error)
						_this.options.error.call(_this, status, r, data, request_data);
						
					// Переключалка
					if (!_this.options.noSwitchIfError)
						_this.SwitchTo("main", data);
					
				}

			}
		});
	}
	
	// Функция отправки через iframe
	this.SendFrame = function(url, data)
	{
		if (!this.options.form)
			return;
			
		if (!this.$form_frame)
		{
			var name = 'ajax_frame_'+ GetInt(Math.random() * 100000) + GetInt(Math.random() * 100000);
			this.$form_frame = $('<iframe id="'+ name +'" name="'+ name +'" width="100%" height="1" class="hidden"></iframe>');
			this.$form_frame.appendTo('body');
		}
		
		var $form = this.options.form;
		
		$form.attr('action', url);
		$form.attr('target', this.$form_frame.attr('name'));
		
		// Очищаем input'ы передаваемые доп. параметры в прошлый раз
		$form.find('input[ajax_master_tmp]').remove();
		
		// Флаг для правильного вывода результата
		data['frame_ajax'] = 1;
		
		// Добавляем доп. параметры из data в форму.
		for(var key in data)
		{
			if (!$form[0][key])
			{
				var input = $('<input type="hidden" ajax_master_tmp="1" name="'+ key +'"/>');
				input.val(data[key]);
				input.appendTo($form);
			}
		}
		
		// bind
		this.$form_frame.unbind('load');
		this.$form_frame.load(function()
		{
			var response = _this.$form_frame.frameDocument().find('textarea').valHtml();
			var r = new AjaxResponse(response);
			
			// Проверка на ошибку
			if (r.isError())
			{
				// Переключалка
				_this.SwitchTo("main", data);
			
				// вывод сообщения об ошибке(ах)
				if (_this.options.alertError)
					_this.options.alertError.call(_this, false, r, data);
				else
					r.alertErrors();
			
				// Event
				if (_this.options.error)
					_this.options.error.call(_this, false, r, data);
			
			
			}
			else
			{
				// Все хорошо
				// Переключалка
				_this.SwitchTo("success", data);
			
				// Event
				if (_this.options.success)
					_this.options.success.call(_this, r, data);
			}
		});
		
		// submit
		$form[0].submit();
	}
	
	
	// Функция запуска аякса с задержкой
	this.SendDelay = function(delay, url, data)
	{
		this.ClearTimer();
		this.Abort();
		
		this.timer = setTimeout(function(){ _this.SendNoDelay(url, data); }, delay);
	}
	
	// Очищает таймер SendDelay
	this.ClearTimer = function()
	{
		if (this.timer)
		{
			clearTimeout(this.timer);
			this.timer = null;
		}
	}
	
	
	this.Cancel = function()
	{
		this.ClearTimer();
		this.Abort();

		// Переключалка
		_this.SwitchTo("main");
	}

	this.Abort = function()
	{
		if (this.ajax)
		{
			this.ajax.abort();
			this.ajax = false;
		}
		
		if (this.$form_frame)
		{
			var win = this.$form_frame.frameWindow()[0];
			if (win.stop)
				win.stop();
			else
				this.$form_frame.frameDocument()[0].execCommand('Stop');
		}
	}

	this.SwitchTo = function(state, data, result)
	{
		if (!this.options.switchRoot || !this.options.switchStates)
			return;

		// Для режима зацикливания main - означает в исходное состояние, success - противоположное состояние
		if (this.options.loopMode && data)
		{
			var flag_value = data[this.options.loopMode];
			if (state == "main")
				state = flag_value ? "main" : "success";
			else if (state == "success")
				state = flag_value ? "success" : "main";			
		}
		var value = this.options.switchStates[state];
		if (state == 'success')
		{
			if (data && data._state) value = data._state;
			if (result && result._state) value = result._state;
			if (result && result._replace) this.options.switchRoot.find('['+this.options.switchStates.name+']').html(result._replace);
		}		
		// Переключаемся
		this.options.switchRoot.switchTo(this.options.switchStates.name, value);
		
		// Событие
		if (this.options.stateChanged)
			this.options.stateChanged.call(_this, value);
	}
}
//#endregion

//#region AjaxSend
jQuery.fn.getAjaxDataByForm = function(filterEmpty, not_form)
{
	//собираем параметры формы
	var data = { };
	var $form = not_form ? $(this) : this.closest("form");
	if ($form.length == 0)
		return false;

	$form.find("input,textarea,select").each(function()
	{
		var p = this;
		var el = $(this);
		if (!p.name || p.disabled) return;
		var el_value = el.val();
		if (filterEmpty && !el_value) return;

		if (el.is(":radio") && !p.checked) return;

		if (data[p.name] != undefined)
		{
			var val = data[p.name];
			if (typeof val === "object")
				val.push(el_value);
			else
				val = [val, el_value];
			data[p.name] = val;
		}
		else
			data[p.name] = el_value;
	});
	
	// HTML-редакторы
	var editors = HtmlEditorHelper.FindAllEditors($form);
	for(var key in editors)
		data[key] = editors[key].GetBbCode();
	
	

	return data;
};

function eval_event_add(obj, name, func)
{
	if (!func || func == '' || !obj) return;
	if (!obj[name]) obj[name] = [];
	obj[name].push(func);
}
/**
*/
jQuery.fn.AjaxSend = function(data, url, e, only_create, without_form)
{
	// находим родителя
	var root = this.closest("[_ajax]");
	if (root.length == 0)
		return;
		
	var $root = root;
	
	// Доп. родитель
	var subroot = this.closest("[_ajax],[_ajax_sub]");
	if (subroot.attr('_ajax')) subroot = $(null);
	
	var $subroot = subroot;
	
	var form = subroot.find("form:first");
	if (form.length == 0 && !subroot.attr("_ajax_subform_only")) form = root.find("form:first");
		
	var $form = form;
	
	var oAjaxMaster;
	
	oAjaxMaster = subroot.data('AjaxMaster');
	if (!oAjaxMaster) oAjaxMaster = root.data('AjaxMaster');

	// Проверяем создан ли объект
	if (!oAjaxMaster)
	{
		var options = {};
		
		// Парсим аттрибуты
		options.ajax_data = subroot.attr("_ajax_data") ? eval(subroot.attrEval("_ajax_data", true)) : eval(root.attrEval("_ajax_data", true));
		options.conectionErrorOff = subroot.attr("_ajax_conectionErrorOff") || root.attr("_ajax_conectionErrorOff");
		options.loopMode = subroot.attr("_ajax_loopMode") || root.attr("_ajax_loopMode");
		options.frame = subroot.attr("_ajax_frame") || root.attr("_ajax_frame");
		options.ajax_rollback = subroot.attr("_ajax_rollback") || root.attr("_ajax_rollback");
		options.delay = GetInt(subroot.attr("_ajax_delay") || root.attr("_ajax_delay"));
		options.noSwitchIfError = subroot.attr("_ajax_noSwitchIfError") || root.attr("_ajax_noSwitchIfError");
		
		//#region Обработчики и события

		// Куски js-кода для функций-колбеков
		var _js_code = {};
		eval_event_add(_js_code, 'success', subroot.attr("_ajax_success"));
		eval_event_add(_js_code, 'success', root.attr("_ajax_success"));
			
		_js_code.error = subroot.attr("_ajax_error") || root.attr("_ajax_error");
		_js_code.loading = subroot.attr("_ajax_loading") || root.attr("_ajax_loading");
		_js_code.beforeSend = subroot.attr("_ajax_before") || root.attr("_ajax_before");
		_js_code.alertError = subroot.attr("_ajax_alertError") || root.attr("_ajax_alertError");
		_js_code.stateChanged = subroot.attr("_ajax_stateChanged") || root.attr("_ajax_stateChanged");

		// <textarea success>
		eval_event_add(_js_code, 'success', root.find("textarea[_ajax_success]:first").val());		

		// <textarea error>
		if (!_js_code.error)
			_js_code.error = root.find("textarea[_ajax_error]:first").val();

		// <textarea loading>
		if (!_js_code.loading)
			_js_code.loading = root.find("textarea[_ajax_loading]:first").val();

		// <textarea beforeSend>
		if (!_js_code.beforeSend)
			_js_code.beforeSend = root.find("textarea[_ajax_before]:first").val();

		// <textarea alertError>
		if (!_js_code.alertError)
			_js_code.alertError = root.find("textarea[_ajax_alertError]:first").val();
			
		// <textarea stateChanged>
		if (!_js_code.stateChanged)
			_js_code.stateChanged = root.find("textarea[_ajax_stateChanged]:first").val();
			


		// Обработчики и события
		if (_js_code.success)
		{
			options.success = function(r, data, request_data)
			{ 
				var call_next = false;
				for (var i=0; i < _js_code.success.length; i ++)
				{
					eval(_js_code.success[i]);
					if (!call_next) return;
				}
			}		
		}
		if (_js_code.error)
			options.error = function(status, r, data, request_data){ eval(_js_code.error) }
			
		if (_js_code.alertError)
			options.alertError = function(status, r, data, request_data){ eval(_js_code.alertError) }

		if (_js_code.loading)
			options.loading = function(data){ eval(_js_code.loading) }

		if (_js_code.beforeSend)
			options.beforeSend = function(data){ var rreturn = eval(EvalReturn(_js_code.beforeSend)); return rreturn == null || rreturn == undefined ? true : rreturn; }
			
		if (_js_code.stateChanged)
			options.stateChanged = function(data){ eval(_js_code.stateChanged) }
		


		//#endregion

		//#region Switcher
		var _ajax_switch = subroot.attr("_ajax_switch") || root.attr("_ajax_switch");
		var _ajax_switch_root = subroot.attr("_ajax_switch_root") || root.attr("_ajax_switch_root");
		if (_ajax_switch_root)
			_ajax_switch_root = subroot.length > 0 ? subroot.closest(_ajax_switch_root) : root.closest(_ajax_switch_root);
		else
			_ajax_switch_root = root;
			
		if (_ajax_switch == "auto" || options.loopMode && !_ajax_switch)
		{
			options.switchStates = options.loopMode ? "state:state_0,loading,state_1" : "state:main,loading,success";
			options.switchRoot = _ajax_switch_root;
		}
		else if (_ajax_switch)
		{
			options.switchStates = _ajax_switch;
			options.switchRoot = _ajax_switch_root;
		}

		//#endregion

		//#region Соединяем с <textarea options>
		//
		var js = root.find("textarea[_ajax_options]:first").val();
		var t_options = {};
		if (js && js != "")
		{
			// Убираем случайную запятую в конце
			js = "t_options = {"+ js.replace(/[,\s]+$/g, "") + "};";
			eval(js);

			options = object_merge(t_options, options)
		}
		//#endregion

		//#region <textarea data>
		//
		if (!options.ajax_data)
		{
			var js = root.find("textarea[_ajax_data]:first").val();
			if (js && js != "")
			{
				// Убираем случайную запятую в конце
				js = "var t_data = {"+ js.replace(/[,\s]+$/g, "") + "};";
				eval(js);

				options.ajax_data = t_data;
			}
		}
		//#endregion
		
		options.root = root;
		
		//Вложенная форма
		if (form.length > 0 && !without_form)
			options.form = form;
			

		// Создаем объект класса
		oAjaxMaster = new AjaxMaster(options);
		if (subroot.length > 0)
			subroot.data('AjaxMaster', oAjaxMaster);
		else
			root.data('AjaxMaster', oAjaxMaster);
	}

	
	oAjaxMaster.$dom_root = root;
	
	//Вложенная форма
	if (form.length > 0)
		oAjaxMaster.options.form = form;
	
	if (!only_create)
	{
		url = url || subroot.attr('_ajax_url') || root.attr('_ajax_url');
	
		
		oAjaxMaster.Send(url, data);
	}
	
	
	// CancelBubble
	if (e)
		CancelBubble(e);
	
};


/** Поиск ближайшего родительского _ajax обьекта */
jQuery.fn.getAjaxMaster = function()
{
	return AjaxMaster.GetRoot(this).data('AjaxMaster');
};
/** @static */
AjaxMaster.GetRoot = function (p)
{
	return $(p).closest('[_ajax]');
}
/** Сбрасывает AjaxMaster
@static
*/
AjaxMaster.Clear = function(p)
{
	$(p).closest('[_ajax]').data('AjaxMaster', false);
}
/** Поиск ближайшего родительского _ajax обьекта */
jQuery.fn.AjaxCancel = function(e)
{
	var o = this.getAjaxMaster();
	if (o)
		o.Cancel(e);

	// CancelBubble
	if (e)
		CancelBubble(e);

	return this;
};
/** Перевод в первоначальное состояние ближайшего родительского _ajax обьекта
@param empty_fields - поля фромы которые надо очистить
*/
jQuery.fn.AjaxReset = function(names)
{
	var obj = this.getAjaxMaster();
	//if (!obj) return this;
	//очищаем поля
	var $form = AjaxMaster.GetRoot(this).find("form:first");
	if ($form.length >0)
	{
		if (names == 'all')
			ClearForm($form, true);
		else if (names == 'public')
			ClearForm($form, false);
		else 
			ClearForm($form, true, names);
	}
	//переключаем в исходное состояние
	//obj.SwitchTo("main");
	return this;
};

/** Поиск ближайшего родительского _ajax обьекта */
jQuery.fn.AjaxSwitchTo = function(state)
{
	this.getAjaxMaster().SwitchTo(state);
	return this;
};



//#endregion

//#region AjaxResponse
/** 
@class
@param mix $data - 
*/
function AjaxResponse(data)
{
	response_text = typeof(data) == "string" ? data : data.responseText;
	this.ajax = typeof(data) == "string" ? false : data;

	if (response_text)
	{
		try
		{
			eval('this.result = '+ response_text + ';');
		}
		catch(ex)
		{
			this.result = {};
		}
	}
	else
		this.result = {};


	this.getErrors = function ()
	{
		if (!this.isError())
			return false;

		var errors = [];
		for (var i in this.result.errors)
		{
			errors.push("" + (this.result.errors[i].caption && false ? this.result.errors[i].caption + ": " : "") + this.result.errors[i].text);
		}

		return errors;
	}

	this.alertErrors = function()
	{
		var a_errors = this.getErrors();
		if (a_errors && a_errors.length > 0)
		{
			var text = "";
			if (a_errors.length > 1)
			{
				text = Msg.ajax_errors_caption + "\r\n";

				for (var i in a_errors)
				{
					text += "• " + a_errors[i] + "\r\n";
				}
				
				if (text) alert(text);
			}
			else
			{
				if (this.result.errors[0].type == "club_access")
				{
					$$.ClubAccessSticker.force_update_cccount_balance = true;
					$$.ClubAccessSticker.Show(this.result.errors[0].extra.type);
				}
				else
					if (a_errors[0]) alert(a_errors[0]);
			}
		}
	}

	this.isError = function()
	{
		if (!this.result || this.result.status == "ok" || !this.result.errors || !this.result.errors.length)
			return false;

		return true;
	}

	this.isAborted = function()
	{
		if (!this.ajax || !this.ajax.status || this.ajax.status == 0)
			return true;
		else
			return false;
	}
}
/** Обертка для AjaxResponse
@param mix $data -
@param str $status - "success" | ...
@param arr $options - параметры:
	alertError: function (r) { } - колбек ф-ция вывода ошибки, по умолчанию r.alertErrors();
	success: funtion (data, r) { } - колбек ф-ция вызовется при успехе
	error: function (data) { } - колбек ф-ция вызовется при ошибке
	connectionErrorOff: true | false - отключает сообщение об ошибке коннекта
@return mix -
@static
*/
function AjaxComplete(data, status, options)
{
	if (status == 'abort') return;
	
	options = options || {};
	
	
	if (status == "success")
	{
		var r = new AjaxResponse(data);

		if (r.isError())
		{
			if (options.alertError) options.alertError(r);
			else r.alertErrors();

			if (options.error) options.error(data);
		}
		else
		{
			if (options.success) options.success(data, r);
		}
	}
	
	else
	{
		if (!options.connectionErrorOff)
			SH_AlertAjaxError();

		if (options.error) options.error(data);
	}
}
//#endregion


//#region AjaxQueue
/** 
@param mix $options - 
n - кол-во одновременно загружаемых элементов
@return mix - 
*/
function AjaxQueue(options)
{
	var _this = this;
	this.options = object_merge(options, {});
	
	this.options.n = GetInt(this.options.n);
	if (!this.options.n)
		this.options.n = 1;
	
	this.items = [];
	
	this.loading_count = 0;
	
	this.Push = function (data, extra, url)
	{
		_this.items.push({
			'data' 	: data,
			'url'		: url,
			'extra'	: extra
		})
	}
	
	
	this.StartLoad = function()
	{
		this.all_count = this.items.length;
		this.Load();
	}
	
	this.Load = function()
	{
		if (this.loading_count >= this.options.n)
			return;
		
		if (this.items.length == 0 && this.loading_count == 0)
		{
			this.LoadComplete();
			return;
		}
		
		if (this.items.length == 0)
			return;
		
		
		this.loading_count++;
		
		var item = this.items.shift();
		
		var data = object_merge(this.options.data, item.data);
		
		// AJAX
		this.ajax = $.ajax({
			"type": "POST",
			"url": item.url || _this.options.url,
			"data": data,
			"complete": function(request_data, status)
			{
				if (status == 'abort') return;
				
				_this.loading_count--;
				
				_this.Load();
				
				if (status == "success")
				{
					var r = new AjaxResponse(request_data);
					 
					// Проверка на ошибку
					if (r.isError())
					{
						if (_this.options.onError) 
							_this.options.onError(r, item, request_data);
					}
					
					else
					{
						// Все хорошо
						// Event
						if (_this.options.onLoad) 
							_this.options.onLoad(r, item, request_data);
							
						_this.UpdateLoadingPercent();
					}
					
				}
				
				else
				{
					if (_this.options.onError) 
						_this.options.onError(r, item, request_data);
				}
				
			}
		});
		
		this.Load();
		
	}
	
	this.LoadComplete = function()
	{
		if (this.options.onComplete)
			this.options.onComplete();
	}
	
	this.UpdateLoadingPercent = function()
	{
		if (!this.options.preloader)
			return;
			
		var $percent = this.options.preloader.find('[percent]');
		var percent = Math.round((this.all_count - this.items.length) / this.all_count * 100);
		$percent.width(percent + '%');
	}
}

//#endregion

var SCloud_query_data = null;


function SCloud() { return this; }

SCloud.prototype.Init = function (container_id, tags, qs, ew, qs_lang)
{
	var root = $("#" + container_id);
	this.root = root; var _this = this;
	
	// Центр
	this.InitCenter();
		
	this.orbit_inc = { "x": 5, "y": 4 }
	
	
	// Слой, для измерения ширины и высоты тега
	$("body").append("<span id='SCloud_meter' style='position:absolute; top:-1000px; left:-1000px'>text</span>");	
	this.meter = $("#SCloud_meter");
	
	// Навигация
	this.navigation = [];
	
	this.navigator = {};
	this.navigator.root = this.root.find("[SCloud_navigator]");
	this.navigator.back = this.navigator.root.find(".navigation-back");
	this.navigator.bar = this.navigator.root.find(".navigation-bar");
	
	this.navigator.back.click(function () { _this.NavigatorBackClick(); });
	
	this.init_load_data = { "qs": "", "ew": ew, "qs_lang": qs_lang }
	this.NavigationAdd({"tag": qs, "layer": $("dummy_tag"), "rect": this.center_tag.rect}, "inc");
	
	
	SCloud_query_data = { "qs": qs, "ew": ew, "qs_lang": qs_lang }
	
	
	root.get(0).SCloud_this = this;
	
	
	
	// Отображаем теги
	this.Next(tags, "inc");
}



SCloud.prototype.InitScale = function ()
{
	this.min_weight = this.tags[this.tags.length - 1].weight;
	this.max_weight = this.tags[0].weight;
	
	if (this.tags.length > 3)
	{
		this.max_weight = GetInt((1 * this.tags[0].weight + 1 * this.tags[1].weight + 1 * this.tags[2].weight) / 3); 
		//console.log(this.max_weight);
	}
	
	this.scale = {
		"x": (Math.max(this.center_tag.rect.left, this.root.width() - this.center_tag.rect.left - this.center_tag.rect.width) - 30) / (this.max_weight - this.min_weight),
		"y": (Math.max(this.center_tag.rect.top, this.root.height() - this.center_tag.rect.top - this.center_tag.rect.height) - 30) / (this.max_weight - this.min_weight)
		};
		
	
	// Подбираем масштаб размера шрифта
	var dmm = this.max_weight - this.min_weight;
	this.scale.size = 15 / (dmm > 0 ? dmm : 1)
	var satisfy = false;
	
	while (!satisfy)
	{
		satisfy = true; this.scale.size *= 0.99;
		
		for (var i = 0; i < this.tags.length; i++)
		{
			// Область тега
			var tag_rect = this.CalculateTagRect(this.tags[i]);
			
			if (tag_rect.width > this.root.width / 2)
				satisfy = false;
		}
	}
	
	
}

SCloud.prototype.Next = function (new_tags, operation)
{
	//--------------------------------------------------
	if (operation /*== "inc"*/)
	{
		// скрываем старые, кроме выбранного
		if (this.tags)
		{
			for (var i = 0; i < this.tags.length; i++)
			{
				if (!this.tags[i].is_center)
					this.tags[i].layer.remove();
			}
		}
		
		// Новый список тегов
		this.tags = new_tags; 
		
		if (this.tags.length == 0)
			return;
		
		// Инициализация
		this.InitScale();
		
		// Эффектно показываем новые теги
		this.ShowNewTags();
	}
	
	// --------------------------------------------
	else if (operation == "exc")
	{
		this.HideExcTags(new_tags);
	}
	
	
	
	
}

SCloud.prototype.HideExcTags = function (new_tags)
{
	// Определяем теги, которые стали ненужными
	for (var i = 0; i < this.tags.length; i++)
	{
		if (!this.tags[i].is_center)
		{
			var tag = this.tags[i];
			
			if (!this.FindTag(tag, new_tags))
				tag.layer.fadeOut('fast', function (){ $(this).remove() });
			
		}
	}
}

SCloud.prototype.ShowNewTags = function ()
{
	this.CalculateTagsCoord();
	
	// Генерируем слои
	for (var i = 0; i < this.tags.length; i++)
	{
		var tag = this.tags[i];
		if (tag.rect)
		{
			this.root.append("<a href='javascript:' class='a_nn a_dgray_blue' SCloud_tag='"+ i +"' style='position:absolute; display: none;  top:"+ GetInt(tag.rect.top) +"px; left:"+ GetInt(tag.rect.left) +"px; font-size:"+ this.GetSize(tag) +"px; line-height:1em'><span>"+ tag.tag +"</span><img src='"+ StaticUrl +"/img/search/cloud/button_exc.gif' width=10 height=10 class=icon_r style='visibility:hidden'></a>");
		}
		
		tag.layer = $("not_exist_tag");
	}
	
	var center_rect = this.center_tag.rect; var tags = this.tags; var _this = this;
	this.root.find("[SCloud_tag]").each(function ()
	{
		var layer = $(this);
		var ii = layer.attr('SCloud_tag');
		
		if (ii == -1)
			return true;
			
		var tag = _this.tags[layer.attr('SCloud_tag')];
		
		if (!tag)
			return true;
		
		//console.log(tag.is_center);
		
		if (tag.is_center)
			return true;
			
		tag.layer = layer;
		layer.get(0).SCloud_tag = tag;
		
		var top = layer.css("top");
		var left = layer.css("left");
		
		layer.css("top", center_rect.top);
		layer.css("left", center_rect.left);
		//layer.css("opacity", 0);
		layer.css("display", "inline");
		
		// События корневого слоя
		layer.mouseenter(function () { _this.TagLayerMouseEnter(this) });
		layer.mouseleave(function () { _this.TagLayerMouseLeave(this) });
		
		
		// События
		var inc_layer = layer.find("span");
		inc_layer.mouseenter(function () { _this.TagMouseEnter(this) });
		inc_layer.mouseleave(function () { _this.TagMouseLeave(this) });
		inc_layer.click(function () { _this.TagClick(this); return false; });
		inc_layer.get(0).SCloud_animating = true;
		
		
		// Иконка исключения
		var exc_layer = layer.find("img");
		exc_layer.css("background", "red");
		exc_layer.click(function () { _this.TagExcClick(this) });
		
		
		layer.animate({ 
					  	"top": top,
					  	"left": GetInt(left) + 7
					  	//"opacity": 1
					  }, 
					  {
						  "duration": 'fast',
						  "complete": function () { this.SCloud_animating = false; }
					  });
	});
}

SCloud.prototype.CalculateTagsCoord = function ()
{
	// Область орбиты
	var orbit_rect = this.IncRect(this.center_tag.rect, this.orbit_inc.x, this.orbit_inc.y);
	var positioned = false;
	
	for (var i = 0; i < this.tags.length; i++)
	{
		
		var tag = this.tags[i];
		
		// Область тега
		var tag_rect = this.CalculateTagRect(tag);
		
		
		positioned = false;
		
		// Будем пробывать, пока не выйдем за рамки
		
		while (this.CheckOrbitBound(orbit_rect))
		{
			for (var i_try = 0; i_try < 8; i_try++)
			{
				var point = this.CalculateProposePoint(orbit_rect, tag_rect, i_try, tag); 
				positioned = this.CheckTagPosition(tag, point, tag_rect);
				
				if (positioned) break;
			}
			
			// Разместился?
			if (positioned)
			{
				this.tags[i].rect = {
					"left": 	point.left,
					"top":		point.top,
					"width": 	tag_rect.width,
					"height":	tag_rect.height
				}
				
				//this.root.append("<a href='' class='a_nu a_black_blue' SCloud_tag='"+ i +"' style='position:absolute;  top:"+ tag.rect.top +"px; left:"+ tag.rect.left +"px; font-size:"+ this.GetSize(tag) +"px; line-height:1em'>"+ tag.tag +"</a>");
				
				//this.root.append("<div style='position:absolute; border:1px solid red; top:"+ orbit_rect.top +"px; left:"+ orbit_rect.left +"px; width:"+ orbit_rect.width +"px; height:"+ orbit_rect.height +"px; '></div>");
				
				break;
			}
			else
			{
				orbit_rect = this.IncRect(orbit_rect, this.orbit_inc.x, this.orbit_inc.y);
			}
				
			
		}
	}
	
}

SCloud.prototype.CheckOrbitBound = function (orbit_rect)
{
	if (orbit_rect.top > 0 || orbit_rect.left > 0 || orbit_rect.top + orbit_rect.height < this.root.height() || orbit_rect.left + orbit_rect.width < this.root.width())
		return true;
		
	return false;
}


SCloud.prototype.CalculateProposePoint = function(orbit_rect, tag_rect, i_try, tag)
{
	var point = { "top": 0, "left": 0 }
	
	var dev_x = orbit_rect.width * 0.2 * this.CalculatePositionDeviation(tag);
	var dev_y = orbit_rect.height * 0.2 * this.CalculatePositionDeviation(tag);
	
	switch(i_try)
	{
		case 0:
			
			point.left = orbit_rect.left + orbit_rect.width / 2 - tag_rect.width / 2 + dev_x;
			point.top = orbit_rect.top + orbit_rect.height;
			return point;
			
		case 1:
			point.left = orbit_rect.left + orbit_rect.width / 2 - tag_rect.width / 2 + dev_x;
			point.top = orbit_rect.top - tag_rect.height;
			return point;
			
		case 2:
			point.left = orbit_rect.left - tag_rect.width;
			point.top = orbit_rect.top + orbit_rect.height / 2 - tag_rect.height / 2 + dev_y;
			return point;
		
		case 3:
			point.left = orbit_rect.left + orbit_rect.width;
			point.top = orbit_rect.top + orbit_rect.height / 2 - tag_rect.height / 2 + dev_y;
			return point;
			
			
		case 4:
			
			point.left = orbit_rect.left - tag_rect.width + dev_x; 
			point.top = orbit_rect.top - tag_rect.height;
			return point;
			
		case 5:
			point.left = orbit_rect.left - tag_rect.width + dev_x;
			point.top = orbit_rect.top + orbit_rect.height;
			return point;
			
		case 6:
			point.left = orbit_rect.left + orbit_rect.width;
			point.top = orbit_rect.top - tag_rect.height + dev_y;
			return point;
			
		case 7:
			point.left = orbit_rect.left + orbit_rect.width;
			point.top = orbit_rect.top + orbit_rect.height + dev_y;
			return point;
	}
}

SCloud.prototype.CalculatePositionDeviation = function (tag)
{
	var sum = 0;
	for (var i = 0; i < tag.tag.length; i++)
	{
		sum += tag.tag.charCodeAt(i);
	}
	
	return sum % 3 == 0 ? -1 : (sum % 3 == 1 ? 1 : 0);
}

SCloud.prototype.CalculateTagRect = function (tag)
{
	this.meter.html("&nbsp;" + tag.tag + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
	this.meter.css("font-size", "" + this.GetSize(tag) + "px");
	this.meter.css("line-height", "1.7em");
	return { "width": this.meter.width(), "height": this.meter.height() }
}

SCloud.prototype.GetSize = function (tag)
{
	return GetInt(this.scale.size * (Math.min(tag.weight, this.max_weight) - this.min_weight) + 12);
}

SCloud.prototype.IncRect = function (rect, dx, dy)
{
	return {
		"left": 	rect.left - dx,
		"top":		rect.top - dy,
		"width": 	rect.width + 2 * dx,
		"height":	rect.height + 2 * dy
		}
}

SCloud.prototype.CheckTagPosition = function (tag, point, tag_rect)
{

	if (point.left < 0 || point.top < this.navigator.root.height() + 10 || point.left + tag_rect.width > this.root.width() || point.top + tag_rect.height > this.root.height())
		return false;
		
		
	var x1 = point.left + tag_rect.width / 2;
	var y1 = point.top + tag_rect.height / 2;
	
	
		
	for (var i = 0; i < this.tags.length; i++)
	{
		if (this.tags[i].rect)
		{
			var rect = this.tags[i].rect;
			var x2 = rect.left + rect.width / 2;
			var y2 = rect.top + rect.height / 2;
			
			if ( Math.abs(x1 - x2) <= (tag_rect.width + rect.width) / 2 && 
				 Math.abs(y1 - y2) <= (tag_rect.height + rect.height) / 2)
				return false;
		}
	}
	
	return true;
}

//-----------------------------------------------------

SCloud.prototype.TagMouseEnter = function (p)
{
	if (this.loading_state)	return;
	
	var tag = this.GetTagByLayer(p); var _this = this;
	if (tag.layer.get(0).SCloud_animating)
		return;
		
	tag.mouse_timer = setTimeout(function () { _this.ChooseTagBegin(tag, "inc") }, 1500);
}

SCloud.prototype.TagClick = function (p)
{
	if (this.loading_state)	return;
		
	var tag = this.GetTagByLayer(p);
	this.TagMouseLeave(p);
	this.ChooseTagBegin(tag, "inc");
}


SCloud.prototype.TagMouseLeave = function (p)
{
	var tag = this.GetTagByLayer(p);
	if (tag.mouse_timer)
	{
		clearTimeout(tag.mouse_timer); tag.mouse_timer = null;
	}
}

SCloud.prototype.GetTagByLayer = function (p)
{
	//return this.tags[$(p).attr('SCloud_tag')];
	return $(p).closest('[SCloud_tag]').get(0).SCloud_tag;
}


SCloud.prototype.TagExcClick = function (p)
{
	var tag = this.GetTagByLayer(p);
	this.ChooseTagBegin(tag, "exc");
}


//======================================================

//-----------------------------------------------------

SCloud.prototype.TagLayerMouseEnter = function (p)
{
	var tag = this.GetTagByLayer(p);
	var exc_layer = tag.layer.find("img");
	
	exc_layer.css("visibility", "visible");
}


SCloud.prototype.TagLayerMouseLeave = function (p)
{
	var tag = this.GetTagByLayer(p);
	var exc_layer = tag.layer.find("img");
	
	exc_layer.css("visibility", "hidden");
}

//=============================================


SCloud.prototype.ChooseTagBegin = function (tag, operation)
{
	this.loading_state = true;
	
	if (this.LoadingDataBegin)
		this.LoadingDataBegin();
	
	if (this.ajax_load_data)
		this.ajax_load_data.abort();
	
	var _this = this;
	
	SCloud_query_data = _this.GetLoadData(tag, operation);
	
	this.ajax_load_data = $.ajax({
		type: "GET",
		url: _this.load_data_url,
		data: SCloud_query_data,
		
		complete: function(data, status){
			_this.ChooseTagEnd(data, status, tag, operation);
		}
	});
}

SCloud.prototype.ChooseTagEnd = function (data, status, tag, operation)
{
	
	if (status == "success")
	{
		
		var new_tags = [];
		
		if (this.LoadingDataEnd)
			new_tags = this.LoadingDataEnd(data);
			
		
		// Новый текущий элемент
		if (operation == "inc")
			this.SetNewCenter(tag);
		else
			this.InitCenter();
		
		if (this.center_tag.layer)
			this.center_tag.layer.show();
		
		this.NavigationAdd(tag, operation);
		
		this.Next(new_tags, operation);
	}
	else
	{
		//alert('Поризошла ошибка получения ответа. Проверьте свое соединение к интернет.');
		PSSearch_ShowState("results");
	}
	
	this.loading_state = false;
}


SCloud.prototype.InitCenter = function ()
{
	if (this.center_tag && this.center_tag.layer)
		this.center_tag.layer.remove();
			
	this.center_tag = {};
	this.center_tag.rect = {
		"left": 	this.root.width() / 2,
		"top":		this.root.height() / 2,
		"width":	10,
		"height":	5
		};
}

SCloud.prototype.SetNewCenter = function (tag)
{
	if (this.center_tag.layer)
			this.center_tag.layer.remove();
			
	this.center_tag = tag;
	this.center_tag.is_center = true; 
	
	with(this.center_tag.layer)
	{
		attr('SCloud_tag', -1);
		removeClass("a_nn a_dgray_blue");
		addClass("a_black_nn");
		
		
		
		unbind("mouseenter");
		unbind("mouseleave");
		
		
		var inc_layer = find("span");
		inc_layer.unbind("mouseenter");
		inc_layer.unbind("mouseleave");
		inc_layer.unbind("click");
		
		var exc_layer = find("img");
		exc_layer.css("visibility", "hidden");
		
		
		prepend('<img src="'+ StaticUrl +'/img/search/cloud/center_icon.gif" width="9" height="9" class="icon">');
	}
}






// ------------------- NAVIGATOR -------------------------------

SCloud.prototype.NavigationAdd = function (tag, operation)
{
	if (this.navigation.length > 0 && this.navigation[this.navigation.length - 1].tag.id == tag.id)
		return;
		
	var layer_clone = tag.layer.clone(); layer_clone.css("left", -9000); layer_clone.attr("SCloud_tag", -1);
	this.navigation.push({
		"operation":	operation,
		"tag":			tag,
		"layer_clone":	layer_clone
	});
	
	// Здесь запустить анимацию добавления элемента в навигацию
	this.NavigatorAdd(tag, operation);
}

SCloud.prototype.NavigationLoadData = function (i)
{
	if (i == -1)
		i = this.navigation.length - 1;
		
	var result = { "qs": this.init_load_data.qs, "ew": this.init_load_data.ew, "qs_lang": this.init_load_data.qs_lang };
	for (var j = 0; j <= i; j++)
	{
		var nav = this.navigation[j];
		switch (nav.operation)
		{
			case "inc":
				result.qs += (result.qs ? " " : "") + nav.tag.tag;
				break;
				
			case "exc":
				result.ew += (result.qs ? "," : "") + nav.tag.id;
				break;
		}
		
	}
	
	return result;
}

SCloud.prototype.GetLoadData = function (tag, operation)
{
	var result = this.NavigationLoadData(-1);
	
	switch (operation)
	{
		case "inc":
			result.qs += (result.qs ? " " : "") + tag.tag;
			break;
			
		case "exc":
			result.ew += (result.qs ? "," : "") + tag.id;
			break;
	}
	
	if (this.ent_id > 0)
		result.ent_id = this.ent_id;
	
	return result;
}

SCloud.prototype.FindTag = function (tag, tags)
{
	for (var i = 0; i < this.tags.length; i++)
	{
		if (tag.id == tags[i].id)
			return true;
	}
	
	return false
}




SCloud.prototype.NavigatorAdd = function (tag, operation)
{
	this.NavigatorBackShow();
	
	if (this.navigation.length == this.navigator.bar.find("a").length)
		return;

		
	
	
	this.navigator.bar.append("<span><a href='javascript:' class='a_nu'></a>&nbsp;&nbsp; </span>");
	var node = this.navigator.bar.find("a:last");
	var container = node.parent();
	
	switch(operation)
	{
		case "inc":
			node.html(tag.tag);
			container.prepend("+ ");
			container.addClass("color_blue");
			break;
			
		case "exc":
			node.html(tag.tag);
			container.prepend("- ");
			node.addClass("a_red_nu");
			container.addClass("color_red");
			break;
	}
	
	node.attr('SCloud_i', this.navigation.length - 1); var _this = this;
	node.click(function () { _this.NavigatorNodeClick(this) });
	
}

SCloud.prototype.NavigatorGo = function (i)
{
	if (i == this.navigation.length - 1)
	{
		//return;
		
		i--;
	}
	
	if (i == 0)
	{
	}
	
	//i--;
	
	if (i < 0)
		return;
	
	var nav = this.navigation[i];
	var tag = nav.tag;
	
	// Удаляем хвост
	this.navigation = this.navigation.slice(0, GetInt(i));
	this.navigator.bar.find("a:gt("+ i +")").parent().remove();
	
	
	// Восстанавливаем тег
	var layer_clone = nav.layer_clone.clone(); layer_clone.css("left", nav.tag.rect.left); layer_clone.hide(); 
	tag.layer = layer_clone;
	this.root.append(layer_clone); 
	
	
	this.NavigatorBackShow();
	
	this.ChooseTagBegin(tag, nav.operation)
}


SCloud.prototype.NavigatorBackShow = function ()
{
	if (this.navigation.length > 1)
		this.navigator.back.show();
	else
		this.navigator.back.hide();
}


SCloud.prototype.NavigatorNodeClick = function (p)
{
	var node = $(p);
	var i = node.attr('SCloud_i');
	
	this.NavigatorGo(i);
}


SCloud.prototype.NavigatorBackClick = function (p)
{
	this.NavigatorGo(this.navigation.length - 1);
}
function ClubAccessSticker()
{
	var _this = this;
	
	
	
	this.Show = function(type)
	{
		if (!this.CheckReady())
		{
			if (!is_document_ready )
			{
				$(function() { _this.Show(type) });
			}
			return;
		}
		
		this.$root.switchTo("state", type);
		
		if (this.force_update_cccount_balance)
			this.UpdateAccountBalance();
			
		RelativeOverlayShow(this.$root);
	}
	
	this.Hide = function()
	{
		//this.$root.hideV();
		RelativeOverlayClose();
	}
	
	this.CheckReady = function ()
	{
		this.$root = $("#ClubAccessSticker");
		
		if (this.$root.length == 0)
			return false;
		
		
		return true;
	}
	
	this.UpdateAccountBalance = function ()
	{
		if (!this.ajaxMaster)
		{
			this.ajaxMaster = new AjaxMaster({
				"success" 		: function(r) 
					{ 
						_this.$root.find("span[account_balance]").html(r.result.formatted);
					},
				"switchStates"	: "account_state:main,loading,main", 
				"switchRoot"		: _this.$root.find("[account_balance_switcher]")
			});
		}
		
		this.ajaxMaster.Send("/bill/ajax/account_balance");
	}
}

$$.ClubAccessSticker = new ClubAccessSticker();
/**
 * .disableTextSelect - Disable Text Select Plugin
 *
 * Version: 1.1
 * Updated: 2007-11-28
 *
 * Used to stop users from selecting text
 *
 * Copyright (c) 2007 James Dempster (letssurf@gmail.com, http://www.jdempster.com/category/jquery/disabletextselect/)
 *
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 **/

/**
 * Requirements:
 * - jQuery (John Resig, http://www.jquery.com/)
 **/
;(function($){if($.browser.mozilla){$.fn.disableTextSelect=function(){return this.each(function(){$(this).css({"MozUserSelect":"none"})})};$.fn.enableTextSelect=function(){return this.each(function(){$(this).css({"MozUserSelect":""})})}}else{if($.browser.msie){$.fn.disableTextSelect=function(){return this.each(function(){$(this).bind("selectstart.disableTextSelect",function(){return false})})};$.fn.enableTextSelect=function(){return this.each(function(){$(this).unbind("selectstart.disableTextSelect")})}}else{$.fn.disableTextSelect=function(){return this.each(function(){$(this).bind("mousedown.disableTextSelect",function(){return false})})};$.fn.enableTextSelect=function(){return this.each(function(){$(this).unbind("mousedown.disableTextSelect")})}}}})(jQuery);



/** Класс отправки файлов через ajax
@param mix $options - 
onProgress: function (progress){},
onComplete: function (data, status){}
@class
*/
function FileUploader (options)
{
	var me = this;

	this.progress = 0;
	this.uploaded = false;
	this.successful = false;
	this.lastError = false;
	this.files = [];
	this.postData = null;
	
	this.options = $.extend({
		onProgress: function (progress){},
		onComplete: function (data, status){}
	}, options);

	function InitXhrEvents(xhr)
	{
		xhr.upload.addEventListener("progress", function(e) {
			if (e.lengthComputable) {
				me.progress = (e.loaded * 100) / e.total;
				if(me.options.onProgress instanceof Function) {
					me.options.onProgress.call(me, Math.round(me.progress));
				}
			}
		}, false);

		xhr.upload.addEventListener("load", function(){
			me.progress = 100;
			me.uploaded = true;
		}, false);

		xhr.upload.addEventListener("error", function(){
			me.lastError = {
				code: 1,
				text: 'Error uploading on server'
			};
		}, false);

		xhr.onreadystatechange = function () {
			var callbackDefined = me.options.onComplete instanceof Function;
			if (this.readyState == 4)
			{
				me.options.onProgress(100);
				
				if(this.status == 200) {
					if(!me.uploaded) {
						if(callbackDefined) {
							me.options.onComplete.call(me, xhr, 'error');
						}
					} else {
						me.successful = true;
						if(callbackDefined) {
							me.options.onComplete.call(me, xhr, 'success', this.responseText);
						}
					}
				} else {
					me.lastError = {
						code: this.status,
						text: 'HTTP response code is not OK ('+this.status+')'
					};
					if(callbackDefined) {
						me.options.onComplete.call(me, xhr, 'error');
					}
				}
			}
		};
	}
	function SendWithFormData()
	{
		var xhr = new XMLHttpRequest();
		InitXhrEvents(xhr);
		
		//отправка
		var formData = new FormData();
		for (var i = 0; i < me.files.length; i++)
		{
			var item = me.files[i];
			formData.append('file[]', item.file);
		}
		if (me.postData)
		{
			for (var key in me.postData) {
				formData.append(key, me.postData[key]);
			}
		}
		me.options.onProgress(0);
		
		xhr.open("POST", me.url, true);
		xhr.send(formData);
	}
	function SendWithFileReader()
	{
		var xhr = new XMLHttpRequest();
		InitXhrEvents(xhr);

		//подготовка тела запроса
		var boundary = '------multipartformboundary' + (new Date).getTime();

		var body = '--' + boundary + '\r\n';

		for (var i = 0; i < me.files.length; i++)
		{
			var item = me.files[i];

			/* Generate headers. */
			body += 'Content-Disposition: form-data; name="' + item.name + '"';
			if (item.file.fileName) {
			  body += '; filename="' + encodeURI(item.file.fileName) + '"';
			}
			body += '\r\n';

			body += 'Content-Type: application/octet-stream\r\n\r\n';

			/* Append binary data. */
			body += (item.file.getAsBinary ? item.file.getAsBinary() : item.file.readAsBinary());
			body += '\r\n';

			/* Write boundary. */
			body += '--' + boundary + '\r\n';
		}
		if (me.postData)
		{
			for (var key in me.postData)
			{
				body += '--' + boundary + '\r\n';
				body += '--' + boundary + '\r\n' + 'Content-Disposition: form-data; name="'+ key +'"\r\n\r\n'+  me.postData[key] +'\r\n';				
			}
		}
		/* Mark end of the request. */
		body += '--' + boundary + '--\r\n';

		me.options.onProgress(0);
		//отправка
		xhr.open("POST", me.url);
		xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);
		xhr.setRequestHeader('Cache-Control', 'no-cache');

		xhr.sendAsBinary(body);
	}
	
	function SendWithForm()
	{
		var uid = Math.round(Math.random() * 1000000);
		me.$form_frame = $('<iframe id="fup_frame_'+ uid +'" name="fup_frame_'+ uid +'" width="100%" height="100" class="hidden"></iframe>');
		me.$form_frame.appendTo('body');
			
		me.$form_submit = $('<form action="'+ me.url +'" target="fup_frame_'+ uid +'" id="fup_form_'+ uid +'" method="post" enctype="multipart/form-data" class="hidden"></form>');
		me.$form_submit.appendTo('body');
		$('<input type="hidden" name="frame" value="1">').appendTo(me.$form_submit);	
		
		//post параметры
		if (me.postData)
		{
			for (var key in me.postData){
				$('<input type="hidden" name="' + key + '">').val(me.postData[key]).appendTo(me.$form_submit);				
			}
		}
		//фалы
		for (var i = 0; i < me.files.length; i++)
		{
			$item = $(me.files[i].input);
			me.files[i].parent = $item.parent();
			
			$item.detach().appendTo(me.$form_submit);			
		}		
		
		me.$form_frame.bind('load', function() 
		{
			me.options.onProgress.call(me, 100);
			me.options.onComplete.call(me, me.$form_frame.frameDocument(), 'success');
			
			//возвращаем на места input
			for (var i = 0; i < me.files.length; i++) {
				$(me.files[i].input).detach().appendTo(me.files[i].parent);
			}
			//удаляем временную форму и фрейм
			me.$form_frame.remove();
			me.$form_submit.remove();
		});
		
		me.options.onProgress(0);
		me.$form_submit.submit();			
	}
	
	this.AddFileInput = function(input)
	{
		if (!input) return;
		$(input).each(function ()
		{
			me.files.push({
				name: this.name,
				input: this,
				file: this.files && this.files[0] ? this.files[0]: null
			});
		});
	}
	
	this.AddDropFiles = function(files, name)
	{
		if (!name) name = 'file[]';
		
		for (var i = 0; i < files.length; i++)
		{
			me.files.push({name: name, file: files[i]});
		}
	}
	
	this.Send = function (url, data)
	{
		me.url = url;
		me.postData = data;
		
		if (!me.files) return;
		
		if (window.FormData)
		{
			me.type = 'ajax';
			SendWithFormData();
		}
		else if (me.files[0].file && me.files[0].file.getAsBinary)
		{
			me.type = 'ajax';
			SendWithFileReader();
		}
		else
		{
			me.type = 'frame';
			SendWithForm();
		}
	}
}

FileDrop = function(root, options)
{
	var me = this;

	me.options = $.extend({
		url:'',
		dragRoot: root,
		dropRoot: root,
		onDragEnter: function (e){},
		onDragLeave: function (e){},
		onBeforeUpload: function(e) { return true },
		onProgress: function (progress){},
		onComplete: function (data, status){}
	}, options);

	this.$dragRoot = $(me.options.dragRoot);
	this.$dropRoot = $(me.options.dropRoot);
	this.url = me.options.url;
	
	tLeave = null;
	
	function isFileDrag(e)
	{
		var dt = e.originalEvent.dataTransfer;
		if (!dt || !dt.types) return false;
		//FF
		if (dt.types.contains && !dt.types.contains("Files")) return false;
		//Chrome
		if (dt.types.indexOf && dt.types.indexOf("Files")==-1) return false;
		return true;
	}
	this._enter = function(e)
	{			
		if (!isFileDrag(e)) return false;
		
		me.options.onDragEnter.call(me, e);
		
		return false;
	}
	this._leave = function(e)
	{
		if (tLeave) clearTimeout(tLeave);
		
		tLeave = setTimeout(function () {
			me.options.onDragLeave.call(me, e);
		}, 50)
	}
	this._over = function(e)
	{	
		if (tLeave) clearTimeout(tLeave)
		
		if (!isFileDrag(e)) return;
		
		var dt = e.originalEvent.dataTransfer;
		if($.browser.webkit) dt.dropEffect = 'copy';
		
		return false;
	}
	this._drop = function(e)
	{
		e.stopPropagation();
		e.preventDefault();

		me.options.onDragLeave.call(me, e);

		var dt = e.originalEvent.dataTransfer;
		if(!dt && !dt.files) return;

		if(!me.options.onBeforeUpload.call(me, e))
			return false;

		var uploader = new FileUploader(me.options);
		uploader.AddDropFiles(dt.files); 
		uploader.Send(me.url);
		
		return false;
	}

	me.$dragRoot
		.bind('dragover', this._over)
		.bind('dragenter', this._enter)
		.bind('dragleave', this._leave)

	me.$dropRoot
		.bind('drop', this._drop);

	if (me.$dragRoot.get(0) != me.$dropRoot.get(0))
		me.$dragRoot.bind('drop', function (e) {
			e.stopPropagation();
			me.options.onDragLeave.call(me, e);
		});

	return me;
};

$.fn.filedrop = function (options){

	this.each(function() {
		var $item = $(this);
		if (!$item.data('FileDrop'))
			$item.data('FileDrop', new FileDrop(this, options));
	});

	return this;
};
/*
 * jQuery UI Sortable 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/Sortables
 *
 * Depends:
 *	jquery.ui.core.js
 *	jquery.ui.mouse.js
 *	jquery.ui.widget.js
 *
 *  FADix
 */
(function( $, undefined ) {

$.widget("ui.sortable", $.ui.mouse, {
	widgetEventPrefix: "sort",
	options: {
		appendTo: "parent",
		axis: false,
		connectWith: false,
		containment: false,
		cursor: 'auto',
		cursorAt: false,
		dropOnEmpty: true,
		forcePlaceholderSize: false,
		forceHelperSize: false,
		grid: false,
		handle: false,
		helper: "original",
		items: '> *',
		opacity: false,
		placeholder: false,
		revert: false,
		scroll: true,
		scrollSensitivity: 20,
		scrollSpeed: 20,
		scope: "default",
		tolerance: "intersect",
		zIndex: 1000
	},
	_create: function() {

		var o = this.options;
		this.containerCache = {};
		this.element.addClass("ui-sortable");

		//Get the items
		this.refresh();

		//Let's determine if the items are being displayed horizontally
		this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;

		//Let's determine the parent's offset
		this.offset = this.element.offset();

		//Initialize mouse events for interaction
		this._mouseInit();

	},

	destroy: function() {
		this.element
			.removeClass("ui-sortable ui-sortable-disabled")
			.removeData("sortable")
			.unbind(".sortable");
		this._mouseDestroy();

		for ( var i = this.items.length - 1; i >= 0; i-- )
			this.items[i].item.removeData("sortable-item");

		return this;
	},

	_setOption: function(key, value){
		if ( key === "disabled" ) {
			this.options[ key ] = value;
	
			this.widget()
				[ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" );
		} else {
			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
			$.Widget.prototype._setOption.apply(this, arguments);
		}
	},

	_mouseCapture: function(event, overrideHandle) {

		if (this.reverting) {
			return false;
		}

		if(this.options.disabled || this.options.type == 'static') return false;

		//We have to refresh the items data once first
		this._refreshItems(event);

		//Find out if the clicked node (or one of its parents) is a actual item in this.items
		var currentItem = null, self = this, nodes = $(event.target).parents().each(function() {
			if($.data(this, 'sortable-item') == self) {
				currentItem = $(this);
				return false;
			}
		});
		if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target);

		if(!currentItem) return false;
		if(this.options.handle && !overrideHandle) {
			var validHandle = false;

			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
			if(!validHandle) return false;
		}

		this.currentItem = currentItem;
		this._removeCurrentsFromItems();
		return true;

	},

	_mouseStart: function(event, overrideHandle, noActivation) {

		var o = this.options, self = this;
		this.currentContainer = this;

		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
		this.refreshPositions();

		//Create and append the visible helper
		this.helper = this._createHelper(event);

		//Cache the helper size
		this._cacheHelperProportions();

		/*
		 * - Position generation -
		 * This block generates everything position related - it's the core of draggables.
		 */

		//Cache the margins of the original element
		this._cacheMargins();

		//Get the next scrolling parent
		this.scrollParent = this.helper.scrollParent();

		//The element's absolute position on the page minus margins
		this.offset = this.currentItem.offset();
		this.offset = {
			top: this.offset.top - this.margins.top,
			left: this.offset.left - this.margins.left
		};

		// Only after we got the offset, we can change the helper's position to absolute
		// TODO: Still need to figure out a way to make relative sorting possible
		this.helper.css("position", "absolute");
		this.cssPosition = this.helper.css("position");

		$.extend(this.offset, {
			click: { //Where the click happened, relative to the element
				left: event.pageX - this.offset.left,
				top: event.pageY - this.offset.top
			},
			parent: this._getParentOffset(),
			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
		});

		//Generate the original position
		this.originalPosition = this._generatePosition(event);
		this.originalPageX = event.pageX;
		this.originalPageY = event.pageY;

		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));

		//Cache the former DOM position
		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };

		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
		if(this.helper[0] != this.currentItem[0]) {
			this.currentItem.hide();
		}

		//Create the placeholder
		this._createPlaceholder();

		//Set a containment if given in the options
		if(o.containment)
			this._setContainment();

		if(o.cursor) { // cursor option
			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
			$('body').css("cursor", o.cursor);
		}

		if(o.opacity) { // opacity option
			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
			this.helper.css("opacity", o.opacity);
		}

		if(o.zIndex) { // zIndex option
			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
			this.helper.css("zIndex", o.zIndex);
		}

		//Prepare scrolling
		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
			this.overflowOffset = this.scrollParent.offset();

		//Call callbacks
		this._trigger("start", event, this._uiHash());

		//Recache the helper size
		if(!this._preserveHelperProportions)
			this._cacheHelperProportions();


		//Post 'activate' events to possible containers
		if(!noActivation) {
			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); }
		}

		//Prepare possible droppables
		if($.ui.ddmanager)
			$.ui.ddmanager.current = this;

		if ($.ui.ddmanager && !o.dropBehaviour)
			$.ui.ddmanager.prepareOffsets(this, event);

		this.dragging = true;

		this.helper.addClass("ui-sortable-helper");
		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
		return true;

	},

	_mouseDrag: function(event) {

		//Compute the helpers position
		this.position = this._generatePosition(event);
		this.positionAbs = this._convertPositionTo("absolute");

		if (!this.lastPositionAbs) {
			this.lastPositionAbs = this.positionAbs;
		}

		//Do scrolling
		if(this.options.scroll) {
			var o = this.options, scrolled = false;
			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {

				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;

				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;

			} else {

				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);

				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);

			}

			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
				$.ui.ddmanager.prepareOffsets(this, event);
		}

		//Regenerate the absolute position used for position checks
		this.positionAbs = this._convertPositionTo("absolute");

		//Set the helper position
		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';

		//Rearrange
		for (var i = this.items.length - 1; i >= 0; i--) {

			//Cache variables and intersection, continue if no intersection
			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
			if (!intersection) continue;

			if(itemElement != this.currentItem[0] //cannot intersect with itself
				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
				&&	!$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
				&& (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true)
				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
			) {

				this.direction = intersection == 1 ? "down" : "up";

				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
					this._rearrange(event, item);
				} else {
					break;
				}

				this._trigger("change", event, this._uiHash());
				break;
			}
		}

		//Post events to containers
		this._contactContainers(event);

		//Interconnect with droppables
		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);

		//Call callbacks
		this._trigger('sort', event, this._uiHash());

		this.lastPositionAbs = this.positionAbs;
		return false;

	},

	_mouseStop: function(event, noPropagation) {

		if(!event) return;

		//If we are using droppables, inform the manager about the drop
		if ($.ui.ddmanager && !this.options.dropBehaviour)
			$.ui.ddmanager.drop(this, event);

		if(this.options.revert) {
			var self = this;
			var cur = self.placeholder.offset();

			self.reverting = true;

			$(this.helper).animate({
				left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
				top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
			}, parseInt(this.options.revert, 10) || 500, function() {
				self._clear(event);
			});
		} else {
			this._clear(event, noPropagation);
		}

		return false;

	},

	cancel: function() {

		var self = this;

		if(this.dragging) {

			this._mouseUp({ target: null });

			if(this.options.helper == "original")
				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
			else
				this.currentItem.show();

			//Post deactivating events to containers
			for (var i = this.containers.length - 1; i >= 0; i--){
				this.containers[i]._trigger("deactivate", null, self._uiHash(this));
				if(this.containers[i].containerCache.over) {
					this.containers[i]._trigger("out", null, self._uiHash(this));
					this.containers[i].containerCache.over = 0;
				}
			}

		}

		if (this.placeholder) {
			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();

			$.extend(this, {
				helper: null,
				dragging: false,
				reverting: false,
				_noFinalSort: null
			});

			if(this.domPosition.prev) {
				$(this.domPosition.prev).after(this.currentItem);
			} else {
				$(this.domPosition.parent).prepend(this.currentItem);
			}
		}

		return this;

	},

	serialize: function(o) {

		var items = this._getItemsAsjQuery(o && o.connected);
		var str = []; o = o || {};

		$(items).each(function() {
			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
		});

		if(!str.length && o.key) {
			str.push(o.key + '=');
		}

		return str.join('&');

	},

	toArray: function(o) {

		var items = this._getItemsAsjQuery(o && o.connected);
		var ret = []; o = o || {};

		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
		return ret;

	},

	/* Be careful with the following core functions */
	_intersectsWith: function(item) {

		var x1 = this.positionAbs.left,
			x2 = x1 + this.helperProportions.width,
			y1 = this.positionAbs.top,
			y2 = y1 + this.helperProportions.height;

		var l = item.left,
			r = l + item.width,
			t = item.top,
			b = t + item.height;

		var dyClick = this.offset.click.top,
			dxClick = this.offset.click.left;

		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;

		if(	   this.options.tolerance == "pointer"
			|| this.options.forcePointerForContainers
			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
		) {
			return isOverElement;
		} else {

			return (l < x1 + (this.helperProportions.width / 2) // Right Half
				&& x2 - (this.helperProportions.width / 2) < r // Left Half
				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half

		}
	},

	_intersectsWithPointer: function(item) {

		var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
			isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
			//fadix
			isOverElement = (isOverElementHeight || this.options.axis == "x") && (isOverElementWidth || this.options.axis == "y"),
			verticalDirection = this._getDragVerticalDirection(),
			horizontalDirection = this._getDragHorizontalDirection();

		if (!isOverElement)
			return false;

		return this.floating ?
			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );

	},

	_intersectsWithSides: function(item) {

		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
			verticalDirection = this._getDragVerticalDirection(),
			horizontalDirection = this._getDragHorizontalDirection();

		if (this.floating && horizontalDirection) {
			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
		} else {
			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
		}

	},

	_getDragVerticalDirection: function() {
		var delta = this.positionAbs.top - this.lastPositionAbs.top;
		return delta != 0 && (delta > 0 ? "down" : "up");
	},

	_getDragHorizontalDirection: function() {
		var delta = this.positionAbs.left - this.lastPositionAbs.left;
		return delta != 0 && (delta > 0 ? "right" : "left");
	},

	refresh: function(event) {
		this._refreshItems(event);
		this.refreshPositions();
		return this;
	},

	_connectWith: function() {
		var options = this.options;
		return options.connectWith.constructor == String
			? [options.connectWith]
			: options.connectWith;
	},
	
	_getItemsAsjQuery: function(connected) {

		var self = this;
		var items = [];
		var queries = [];
		var connectWith = this._connectWith();

		if(connectWith && connected) {
			for (var i = connectWith.length - 1; i >= 0; i--){
				var cur = $(connectWith[i]);
				for (var j = cur.length - 1; j >= 0; j--){
					var inst = $.data(cur[j], 'sortable');
					if(inst && inst != this && !inst.options.disabled) {
						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
					}
				};
			};
		}

		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);

		for (var i = queries.length - 1; i >= 0; i--){
			queries[i][0].each(function() {
				items.push(this);
			});
		};

		return $(items);

	},

	_removeCurrentsFromItems: function() {

		var list = this.currentItem.find(":data(sortable-item)");

		for (var i=0; i < this.items.length; i++) {

			for (var j=0; j < list.length; j++) {
				if(list[j] == this.items[i].item[0])
					this.items.splice(i,1);
			};

		};

	},

	_refreshItems: function(event) {

		this.items = [];
		this.containers = [this];
		var items = this.items;
		var self = this;
		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
		var connectWith = this._connectWith();

		if(connectWith) {
			for (var i = connectWith.length - 1; i >= 0; i--){
				var cur = $(connectWith[i]);
				for (var j = cur.length - 1; j >= 0; j--){
					var inst = $.data(cur[j], 'sortable');
					if(inst && inst != this && !inst.options.disabled) {
						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
						this.containers.push(inst);
					}
				};
			};
		}

		for (var i = queries.length - 1; i >= 0; i--) {
			var targetData = queries[i][1];
			var _queries = queries[i][0];

			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
				var item = $(_queries[j]);

				item.data('sortable-item', targetData); // Data for target checking (mouse manager)

				items.push({
					item: item,
					instance: targetData,
					width: 0, height: 0,
					left: 0, top: 0
				});
			};
		};

	},

	refreshPositions: function(fast) {

		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
		if(this.offsetParent && this.helper) {
			this.offset.parent = this._getParentOffset();
		}

		for (var i = this.items.length - 1; i >= 0; i--){
			var item = this.items[i];

			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;

			if (!fast) {
				item.width = t.outerWidth();
				item.height = t.outerHeight();
			}

			var p = t.offset();
			item.left = p.left;
			item.top = p.top;
		};

		if(this.options.custom && this.options.custom.refreshContainers) {
			this.options.custom.refreshContainers.call(this);
		} else {
			for (var i = this.containers.length - 1; i >= 0; i--){
				var p = this.containers[i].element.offset();
				this.containers[i].containerCache.left = p.left;
				this.containers[i].containerCache.top = p.top;
				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
			};
		}

		return this;
	},

	_createPlaceholder: function(that) {

		var self = that || this, o = self.options;

		if(!o.placeholder || o.placeholder.constructor == String) {
			var className = o.placeholder;
			o.placeholder = {
				element: function() {

					var el = $(document.createElement(self.currentItem[0].nodeName))
						.addClass(className || self.currentItem[0].className+" ui-sortable-placeholder")
						.removeClass("ui-sortable-helper")[0];

					if(!className)
						el.style.visibility = "hidden";

					return el;
				},
				update: function(container, p) {

					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
					if(className && !o.forcePlaceholderSize) return;

					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
					if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); };
					if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); };
				}
			};
		}

		//Create the placeholder
		self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem));

		//Append it after the actual current item
		self.currentItem.after(self.placeholder);

		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
		o.placeholder.update(self, self.placeholder);

	},

	_contactContainers: function(event) {
		
		// get innermost container that intersects with item 
		var innermostContainer = null, innermostIndex = null;		
		
		
		for (var i = this.containers.length - 1; i >= 0; i--){

			// never consider a container that's located within the item itself 
			if($.ui.contains(this.currentItem[0], this.containers[i].element[0]))
				continue;

			if(this._intersectsWith(this.containers[i].containerCache)) {

				// if we've already found a container and it's more "inner" than this, then continue 
				if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0]))
					continue;

				innermostContainer = this.containers[i]; 
				innermostIndex = i;
					
			} else {
				// container doesn't intersect. trigger "out" event if necessary 
				if(this.containers[i].containerCache.over) {
					this.containers[i]._trigger("out", event, this._uiHash(this));
					this.containers[i].containerCache.over = 0;
				}
			}

		}
		
		// if no intersecting containers found, return 
		if(!innermostContainer) return; 

		// move the item into the container if it's not there already
		if(this.containers.length === 1) {
			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
			this.containers[innermostIndex].containerCache.over = 1;
		} else if(this.currentContainer != this.containers[innermostIndex]) { 

			//When entering a new container, we will find the item with the least distance and append our item near it 
			var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; 
			for (var j = this.items.length - 1; j >= 0; j--) { 
				if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; 
				var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; 
				if(Math.abs(cur - base) < dist) { 
					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; 
				} 
			} 

			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled 
				return; 

			this.currentContainer = this.containers[innermostIndex]; 
			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); 
			this._trigger("change", event, this._uiHash()); 
			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); 

			//Update the placeholder 
			this.options.placeholder.update(this.currentContainer, this.placeholder); 
		
			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); 
			this.containers[innermostIndex].containerCache.over = 1;
		} 
	
		
	},

	_createHelper: function(event) {

		var o = this.options;
		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);

		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);

		if(helper[0] == this.currentItem[0])
			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };

		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());

		return helper;

	},

	_adjustOffsetFromHelper: function(obj) {
		if (typeof obj == 'string') {
			obj = obj.split(' ');
		}
		if ($.isArray(obj)) {
			obj = {left: +obj[0], top: +obj[1] || 0};
		}
		if ('left' in obj) {
			this.offset.click.left = obj.left + this.margins.left;
		}
		if ('right' in obj) {
			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
		}
		if ('top' in obj) {
			this.offset.click.top = obj.top + this.margins.top;
		}
		if ('bottom' in obj) {
			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
		}
	},

	_getParentOffset: function() {


		//Get the offsetParent and cache its position
		this.offsetParent = this.helper.offsetParent();
		var po = this.offsetParent.offset();

		// This is a special case where we need to modify a offset calculated on start, since the following happened:
		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
			po.left += this.scrollParent.scrollLeft();
			po.top += this.scrollParent.scrollTop();
		}

		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
			po = { top: 0, left: 0 };

		return {
			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
		};

	},

	_getRelativeOffset: function() {

		if(this.cssPosition == "relative") {
			var p = this.currentItem.position();
			return {
				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
			};
		} else {
			return { top: 0, left: 0 };
		}

	},

	_cacheMargins: function() {
		this.margins = {
			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
		};
	},

	_cacheHelperProportions: function() {
		this.helperProportions = {
			width: this.helper.outerWidth(),
			height: this.helper.outerHeight()
		};
	},

	_setContainment: function() {

		var o = this.options;
		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
		if(o.containment == 'document' || o.containment == 'window') this.containment = [
			0 - this.offset.relative.left - this.offset.parent.left,
			0 - this.offset.relative.top - this.offset.parent.top,
			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
		];

		if(!(/^(document|window|parent)$/).test(o.containment)) {
			var ce = $(o.containment)[0];
			var co = $(o.containment).offset();
			var over = ($(ce).css("overflow") != 'hidden');

			this.containment = [
				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
			];
		}

	},

	_convertPositionTo: function(d, pos) {

		if(!pos) pos = this.position;
		var mod = d == "absolute" ? 1 : -1;
		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		return {
			top: (
				pos.top																	// The absolute mouse position
				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
			),
			left: (
				pos.left																// The absolute mouse position
				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
				- ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
			)
		};

	},

	_generatePosition: function(event) {

		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);

		// This is another very weird special case that only happens for relative elements:
		// 1. If the css position is relative
		// 2. and the scroll parent is the document or similar to the offset parent
		// we have to refresh the relative offset during the scroll so there are no jumps
		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
			this.offset.relative = this._getRelativeOffset();
		}

		var pageX = event.pageX;
		var pageY = event.pageY;

		/*
		 * - Position constraining -
		 * Constrain the position to a mix of grid, containment.
		 */

		if(this.originalPosition) { //If we are not dragging yet, we won't check for options

			if(this.containment) {
				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
			}

			if(o.grid) {
				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;

				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
			}

		}

		return {
			top: (
				pageY																// The absolute mouse position
				- this.offset.click.top													// Click offset (relative to the element)
				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
			),
			left: (
				pageX																// The absolute mouse position
				- this.offset.click.left												// Click offset (relative to the element)
				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
				+ ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
			)
		};

	},

	_rearrange: function(event, i, a, hardRefresh) {

		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));

		//Various things done here to improve the performance:
		// 1. we create a setTimeout, that calls refreshPositions
		// 2. on the instance, we have a counter variable, that get's higher after every append
		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
		// 4. this lets only the last addition to the timeout stack through
		this.counter = this.counter ? ++this.counter : 1;
		var self = this, counter = this.counter;

		window.setTimeout(function() {
			if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
		},0);

	},

	_clear: function(event, noPropagation) {

		this.reverting = false;
		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
		// everything else normalized again
		var delayedTriggers = [], self = this;

		// We first have to update the dom position of the actual currentItem
		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
		if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem);
		this._noFinalSort = null;

		if(this.helper[0] == this.currentItem[0]) {
			for(var i in this._storedCSS) {
				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
			}
			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
		} else {
			this.currentItem.show();
		}

		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
		if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element
			if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
			for (var i = this.containers.length - 1; i >= 0; i--){
				if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) {
					delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
					delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.containers[i]));
				}
			};
		};

		//Post events to containers
		for (var i = this.containers.length - 1; i >= 0; i--){
			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
			if(this.containers[i].containerCache.over) {
				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
				this.containers[i].containerCache.over = 0;
			}
		}

		//Do what was originally in plugins
		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index

		this.dragging = false;
		if(this.cancelHelperRemoval) {
			if(!noPropagation) {
				this._trigger("beforeStop", event, this._uiHash());
				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
				this._trigger("stop", event, this._uiHash());
			}
			return false;
		}

		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());

		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);

		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;

		if(!noPropagation) {
			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
			this._trigger("stop", event, this._uiHash());
		}

		this.fromOutside = false;
		return true;

	},

	_trigger: function() {
		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
			this.cancel();
		}
	},

	_uiHash: function(inst) {
		var self = inst || this;
		return {
			helper: self.helper,
			placeholder: self.placeholder || $([]),
			position: self.position,
			originalPosition: self.originalPosition,
			offset: self.positionAbs,
			item: self.currentItem,
			sender: inst ? inst.element : null
		};
	}

});

$.extend($.ui.sortable, {
	version: "1.8.11"
});

})(jQuery);

/**
 * jQuery BASE64 functions
 * 
 * 	<code>
 * 		Encodes the given data with base64. 
 * 		String $.base64Encode ( String str )
 *		<br />
 * 		Decodes a base64 encoded data.
 * 		String $.base64Decode ( String str )
 * 	</code>
 * 
 * Encodes and Decodes the given data in base64.
 * This encoding is designed to make binary data survive transport through transport layers that are not 8-bit clean, such as mail bodies.
 * Base64-encoded data takes about 33% more space than the original data. 
 * This javascript code is used to encode / decode data using base64 (this encoding is designed to make binary data survive transport through transport layers that are not 8-bit clean). Script is fully compatible with UTF-8 encoding. You can use base64 encoded data as simple encryption mechanism.
 * If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag). 
 * This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin.
 * 
 * Example
 * 	Code
 * 		<code>
 * 			$.base64Encode("I'm Persian."); 
 * 		</code>
 * 	Result
 * 		<code>
 * 			"SSdtIFBlcnNpYW4u"
 * 		</code>
 * 	Code
 * 		<code>
 * 			$.base64Decode("SSdtIFBlcnNpYW4u");
 * 		</code>
 * 	Result
 * 		<code>
 * 			"I'm Persian."
 * 		</code>
 * 
 * @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com >
 * @link http://www.semnanweb.com/jquery-plugin/base64.html
 * @see http://www.webtoolkit.info/
 * @license http://www.gnu.org/licenses/gpl.html [GNU General Public License]
 * @param {jQuery} {base64Encode:function(input))
 * @param {jQuery} {base64Decode:function(input))
 * @return string
 */

;(function($){
	
	var keyString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	
	var uTF8Encode = function(string) {
		string = string.replace(/\x0d\x0a/g, "\x0a");
		var output = "";
		for (var n = 0; n < string.length; n++) {
			var c = string.charCodeAt(n);
			if (c < 128) {
				output += String.fromCharCode(c);
			} else if ((c > 127) && (c < 2048)) {
				output += String.fromCharCode((c >> 6) | 192);
				output += String.fromCharCode((c & 63) | 128);
			} else {
				output += String.fromCharCode((c >> 12) | 224);
				output += String.fromCharCode(((c >> 6) & 63) | 128);
				output += String.fromCharCode((c & 63) | 128);
			}
		}
		return output;
	};
	
	var uTF8Decode = function(input) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
		while ( i < input.length ) {
			c = input.charCodeAt(i);
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			} else if ((c > 191) && (c < 224)) {
				c2 = input.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			} else {
				c2 = input.charCodeAt(i+1);
				c3 = input.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
		}
		return string;
	}
	
	$.extend({
		base64Encode: function(input) {
			var output = "";
			var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
			var i = 0;
			input = uTF8Encode(input);
			while (i < input.length) {
				chr1 = input.charCodeAt(i++);
				chr2 = input.charCodeAt(i++);
				chr3 = input.charCodeAt(i++);
				enc1 = chr1 >> 2;
				enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
				enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
				enc4 = chr3 & 63;
				if (isNaN(chr2)) {
					enc3 = enc4 = 64;
				} else if (isNaN(chr3)) {
					enc4 = 64;
				}
				output = output + keyString.charAt(enc1) + keyString.charAt(enc2) + keyString.charAt(enc3) + keyString.charAt(enc4);
			}
			return output;
		},
		base64Decode: function(input) {
			var output = "";
			var chr1, chr2, chr3;
			var enc1, enc2, enc3, enc4;
			var i = 0;
			input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
			while (i < input.length) {
				enc1 = keyString.indexOf(input.charAt(i++));
				enc2 = keyString.indexOf(input.charAt(i++));
				enc3 = keyString.indexOf(input.charAt(i++));
				enc4 = keyString.indexOf(input.charAt(i++));
				chr1 = (enc1 << 2) | (enc2 >> 4);
				chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
				chr3 = ((enc3 & 3) << 6) | enc4;
				output = output + String.fromCharCode(chr1);
				if (enc3 != 64) {
					output = output + String.fromCharCode(chr2);
				}
				if (enc4 != 64) {
					output = output + String.fromCharCode(chr3);
				}
			}
			output = uTF8Decode(output);
			return output;
		}
	});
})(jQuery);
/*
  @author: remy sharp / http://remysharp.com
  @params:
    feedback - the selector for the element that gives the user feedback. Note that this will be relative to the form the plugin is run against.
    hardLimit - whether to stop the user being able to keep adding characters. Defaults to true.
    useInput - whether to look for a hidden input named 'maxlength' instead of the maxlength attribute. Defaults to false.
    words - limit by characters or words, set this to true to limit by words. Defaults to false.
  @license: Creative Commons License - ShareAlike http://creativecommons.org/licenses/by-sa/3.0/
  @version: 1.2
  @changes: code tidy via Ariel Flesler and fix when pasting over limit and including \t or \n
*/

;(function ($) {

$.fn.maxlength = function (settings) {

    if (typeof settings == 'string') {
        settings = { feedback : settings };
    }

    settings = $.extend({}, $.fn.maxlength.defaults, settings);

    function length(el) {
    	var parts = el.value;
    	if ( settings.words )
    		parts = el.value.length ? parts.split(/\s+/) : { length : 0 };
    	return parts.length;
    }
    
    return this.each(function () {
        var field = this,
        	$field = $(field),
        	$form = $(field.form),
        	limit = settings.useInput ? $form.find('input[name=maxlength]').val() : $field.attr('maxlength'),
        	$charsLeft = $form.find(settings.feedback);

    	function limitCheck(event) {
        	var len = length(this),
        	    exceeded = len >= limit,
        		code = event.keyCode;

        	if ( !exceeded )
        		return;

            switch (code) {
                case 8:  // allow delete
                case 9:
                case 17:
                case 36: // and cursor keys
                case 35:
                case 37: 
                case 38:
                case 39:
                case 40:
                case 46:
                case 65:
                    return;

                default:
                    return settings.words && code != 32 && code != 13 && len == limit;
            }
        }


        var updateCount = function () {
            var len = length(field),
            	diff = limit - len;

            $charsLeft.html( diff || "0" );

            // truncation code
            if (settings.hardLimit && diff < 0) {
            	field.value = settings.words ? 
            	    // split by white space, capturing it in the result, then glue them back
            		field.value.split(/(\s+)/, (limit*2)-1).join('') :
            		field.value.substr(0, limit);

                updateCount();
            }
        };

        $field.keyup(updateCount).change(updateCount);
        if (settings.hardLimit) {
            $field.keydown(limitCheck);
        }

        updateCount();
    });
};

$.fn.maxlength.defaults = {
    useInput : false,
    hardLimit : true,
    feedback : '.charsLeft',
    words : false
};

})(jQuery);
var RUZEE=window.RUZEE||{};RUZEE.ShadedBorder={create:function(_1){var _2=/msie/i.test(navigator.userAgent)&&!window.opera;var _3=_2&&!window.XMLHttpRequest;function _4(el,h){for(k in h){if(/ie_/.test(k)){if(_2){el.style[k.substr(3)]=h[k];}}else{el.style[k]=h[k];}}};function _5(h){var el=document.createElement("div");el.className="sb-gen";_4(el,h);return el;};function op(v){v=v<0?0:v;if(v>0.99999){return "";}return _2?" filter:alpha(opacity="+(v*100)+");":" opacity:"+v+";";};var sr=_1.shadow||0;var r=_1.corner||0;var _6=0;var _7=_1.border||0;var _8=_1.borderOpacity||1;var _9=sr!=0;var lw=r>sr?r:sr;var rw=lw;var th=lw;var bh=lw;if(_7>0){_6=r;r=r-_7;}var cx=r!=0&&_9?Math.round(lw/3):0;var cy=cx;var cs=Math.round(cx/2);var _a=r>0?"sb-inner":"sb-shadow";var _b="sb-shadow";var _c="sb-border";var _d=_1.edges||"trlb";if(!/t/i.test(_d)){th=0;}if(!/b/i.test(_d)){bh=0;}if(!/l/i.test(_d)){lw=0;}if(!/r/i.test(_d)){rw=0;}var p={position:"absolute",left:"0",top:"0",width:lw+"px",height:th+"px",ie_fontSize:"1px",overflow:"hidden",margin:"0",padding:"0"};var tl=_5(p);delete p.left;p.right="0";p.width=rw+"px";var tr=_5(p);delete p.top;p.bottom="0";p.height=bh+"px";var br=_5(p);delete p.right;p.left="0";p.width=lw+"px";var bl=_5(p);var tw=_5({position:"absolute",width:"100%",height:th+"px",ie_fontSize:"1px",top:"0",left:"0",overflow:"hidden",margin:"0",padding:"0"});var t=_5({position:"relative",height:th+"px",ie_fontSize:"1px",margin:"0 "+rw+"px 0 "+lw+"px",overflow:"hidden",padding:"0"});tw.appendChild(t);var bw=_5({position:"absolute",left:"0",bottom:"0",width:"100%",height:bh+"px",ie_fontSize:"1px",overflow:"hidden",margin:"0",padding:"0"});var b=_5({position:"relative",height:bh+"px",ie_fontSize:"1px",margin:"0 "+rw+"px 0 "+lw+"px",overflow:"hidden",padding:"0"});bw.appendChild(b);var mw=_5({position:"absolute",top:(-bh)+"px",left:"0",width:"100%",height:"100%",overflow:"hidden",ie_fontSize:"1px",padding:"0",margin:"0"});function _e(el,t,l){var w=l?lw:rw;var h=t?th:bh;var s=t?cs:-cs;var _f=[];var dsi=[];var dss=[];var xp=0;var xd=1;if(l){xp=w-1;xd=-1;}for(var x=0;x<w;++x){var yp=h-1;var yd=-1;if(t){yp=0;yd=1;}var _10=false;for(var y=h-1;y>=0&&!_10;--y){var div="<div style=\"position:absolute; top:"+yp+"px; left:"+xp+"px; "+"width:1px; height:1px; overflow:hidden; margin:0; padding:0;";var xc=x-cx;var yc=y-cy-s;var d=Math.sqrt(xc*xc+yc*yc);var _11=false;if(r>0){if(xc<0&&yc<_6&&yc>=r||yc<0&&xc<_6&&xc>=r){_f.push(div+op(_8)+"\" class=\""+_c+"\"></div>");}else{if(d<_6&&d>=r-1&&xc>=0&&yc>=0){var dd=div;if(d>=_6-1){dd+=op((_6-d)*_8);_11=true;}else{dd+=op(_8);}_f.push(dd+"\" class=\""+_c+"\"></div>");}}var dd=div+" z-index:2;"+(t?"background-position:0 -"+(r-yc-1)+"px;":"background-image:none;");var _12=function(){if(!t){dd=dd.replace(/top\:\d+px/,"top:0px");}dd=dd.replace(/height\:1px/,"height:"+(y+1)+"px");dsi.push(dd+"\" class=\""+_a+"\"></div>");_10=true;};if(xc<0&&yc<r||yc<0&&xc<r){_12();}else{if(d<r&&xc>=0&&yc>=0){if(d>=r-1){dd+=op(r-d);_11=true;dsi.push(dd+"\" class=\""+_a+"\"></div>");}else{_12();}}else{_11=true;}}}else{_11=true;}if(sr>0&&_11){d=Math.sqrt(x*x+y*y);if(d<sr){dss.push(div+" z-index:0; "+op(1-(d/sr))+"\" class=\""+_b+"\"></div>");}}yp+=yd;}xp+=xd;}el.innerHTML=dss.concat(_f.concat(dsi)).join("");};function mid(mw){var ds=[];ds.push("<div style=\"position:relative; top:"+(th+bh)+"px; height:2048px; "+" margin:0 "+(rw-r-cx)+"px 0 "+(lw-r-cx)+"px; "+" padding:0; overflow:hidden;"+" background-position:0 "+(th>0?-(r+cy+cs):"0")+"px;\""+" class=\""+_a+"\"></div>");var dd="<div style=\"position:absolute; width:1px;"+" top:"+(th+bh)+"px; height:2048px; padding:0; margin:0;";if(sr>0){for(var x=0;x<lw-r-cx;++x){ds.push(dd+" left:"+x+"px;"+op((x+1)/lw)+"\" class=\""+_b+"\"></div>");}for(var x=0;x<rw-r-cx;++x){ds.push(dd+" right:"+x+"px;"+op((x+1)/rw)+"\" class=\""+_b+"\"></div>");}}if(_7>0){var su=" width:"+_7+"px;"+op(_8)+"\" class=\""+_c+"\"></div>";ds.push(dd+" left:"+(lw-_6-cx)+"px;"+su);ds.push(dd+" right:"+(rw-_6-cx)+"px;"+su);}mw.innerHTML=ds.join("");};function tb(el,t){var ds=[];var h=t?th:bh;var dd="<div style=\"height:1px; overflow:hidden; position:absolute; margin:0; padding:0;"+" width:100%; left:0px; ";var s=t?cs:-cs;for(var y=0;y<h-s-cy-r;++y){if(sr>0){ds.push(dd+(t?"top:":"bottom:")+y+"px;"+op((y+1)*1/h)+"\" class=\""+_b+"\"></div>");}}if(y>=_7){ds.push(dd+(t?"top:":"bottom:")+(y-_7)+"px;"+op(_8)+" height:"+_7+"px;\" class=\""+_c+"\"></div>");}ds.push(dd+(t?"background-position-y:0; top:":"background-image:none; bottom:")+y+"px;"+" height:"+(r+cy+s)+"px;\" class=\""+_a+"\"></div>");el.innerHTML=ds.join("");};_e(tl,true,true);_e(tr,true,false);_e(bl,false,true);_e(br,false,false);mid(mw);tb(t,true);tb(b,false);needsCloning=false;return {render:function(el){if(typeof el=="string"){el=document.getElementById(el);}if(el.length!=undefined){for(var i=0;i<el.length;++i){this.render(el[i]);}return;}el.className+=" sb";_4(el,{position:"relative",background:"transparent"});var _13=el.firstChild;while(_13){var _14=_13.nextSibling;if(_13.nodeType==1&&_13.className=="sb-gen"){el.removeChild(_13);}_13=_14;}var iel=el.firstChild;var twc=needsCloning?tw.cloneNode(true):tw;var mwc=needsCloning?mw.cloneNode(true):mw;var bwc=needsCloning?bw.cloneNode(true):bw;var tlc=needsCloning?tl.cloneNode(true):tl;var trc=needsCloning?tr.cloneNode(true):tr;var blc=needsCloning?bl.cloneNode(true):bl;var brc=needsCloning?br.cloneNode(true):br;el.insertBefore(tlc,iel);el.insertBefore(trc,iel);el.insertBefore(blc,iel);el.insertBefore(brc,iel);el.insertBefore(twc,iel);el.insertBefore(mwc,iel);el.insertBefore(bwc,iel);if(_3){el.onmouseover=function(){this.className+=" hover";};el.onmouseout=function(){this.className=this.className.replace(/ hover/,"");};}if(_2){function _15(){twc.style.width=bwc.style.width=mwc.style.width=el.offsetWidth+"px";if(_3){mwc.firstChild.style.height=el.offsetHeight+"px";}else{for(var i=0;i<mwc.childNodes.length;++i){mwc.childNodes[i].style.height=(el.offsetHeight-bh-th)+"px";}}trc.style.right=brc.style.right=null;trc.style.left=brc.style.left=(el.offsetWidth-rw)+"px";};el.onresize=_15;_15();}needsCloning=true;}};}};document.write("  <style type=\"text/css\">  .sb, .sbi, .sb *, .sbi * { position:relative; z-index:1; }  * html .sb, * html .sbi { height:1%; }  .sbi { display:inline-block; }  .sb-inner { background:#ddd; }  .sb-shadow { background:#000; }  .sb-border { background:#bbb; }  </style>");
/*
 * jQuery history plugin
 * 
 * The MIT License
 * 
 * Copyright (c) 2006-2009 Taku Sano (Mikage Sawatari)
 * Copyright (c) 2010 Takayuki Miwa
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

(function($) {
    var locationWrapper = {
        put: function(hash, win) {
            (win || window).location.hash = this.encoder(hash);
        },
        get: function(win) {
            var hash = ((win || window).location.hash).replace(/^#/, '');
            try {
                return $.browser.mozilla ? hash : decodeURIComponent(hash);
            }
            catch (error) {
                return hash;
            }
        },
        encoder: encodeURIComponent
    };

    var iframeWrapper = {
        id: "__jQuery_history",
        init: function() {
            var html = '<iframe id="'+ this.id +'" style="display:none" src="javascript:false;" />';
            $("body").prepend(html);
            return this;
        },
        _document: function() {
            return $("#"+ this.id)[0].contentWindow.document;
        },
        put: function(hash) {
            var doc = this._document();
            doc.open();
            doc.close();
            locationWrapper.put(hash, doc);
        },
        get: function() {
            return locationWrapper.get(this._document());
        }
    };

    function initObjects(options) {
        options = $.extend({
                unescape: false
            }, options || {});

        locationWrapper.encoder = encoder(options.unescape);

        function encoder(unescape_) {
            if(unescape_ === true) {
                return function(hash){ return hash; };
            }
            if(typeof unescape_ == "string" &&
               (unescape_ = partialDecoder(unescape_.split("")))
               || typeof unescape_ == "function") {
                return function(hash) { return unescape_(encodeURIComponent(hash)); };
            }
            return encodeURIComponent;
        }

        function partialDecoder(chars) {
            var re = new RegExp($.map(chars, encodeURIComponent).join("|"), "ig");
            return function(enc) { return enc.replace(re, decodeURIComponent); };
        }
    }

    var implementations = {};

    implementations.base = {
        callback: undefined,
        type: undefined,

        check: function() {},
        load:  function(hash) {},
        init:  function(callback, options) {
            initObjects(options);
            self.callback = callback;
            self._options = options;
            self._init();
        },

        _init: function() {},
        _options: {}
    };

    implementations.timer = {
        _appState: undefined,
        _init: function() {
            var current_hash = locationWrapper.get();
            self._appState = current_hash;
            self.callback(current_hash);
            setInterval(self.check, 100);
        },
        check: function() {
            var current_hash = locationWrapper.get();
            if(current_hash != self._appState) {
                self._appState = current_hash;
                self.callback(current_hash);
            }
        },
        load: function(hash) {
            if(hash != self._appState) {
                locationWrapper.put(hash);
                self._appState = hash;
                self.callback(hash);
            }
        }
    };

    implementations.iframeTimer = {
        _appState: undefined,
        _init: function() {
            var current_hash = locationWrapper.get();
            self._appState = current_hash;
            iframeWrapper.init().put(current_hash);
            self.callback(current_hash);
            setInterval(self.check, 100);
        },
        check: function() {
            var iframe_hash = iframeWrapper.get(),
                location_hash = locationWrapper.get();

            if (location_hash != iframe_hash) {
                if (location_hash == self._appState) {    // user used Back or Forward button
                    self._appState = iframe_hash;
                    locationWrapper.put(iframe_hash);
                    self.callback(iframe_hash); 
                } else {                              // user loaded new bookmark
                    self._appState = location_hash;  
                    iframeWrapper.put(location_hash);
                    self.callback(location_hash);
                }
            }
        },
        load: function(hash) {
            if(hash != self._appState) {
                locationWrapper.put(hash);
                iframeWrapper.put(hash);
                self._appState = hash;
                self.callback(hash);
            }
        }
    };

    implementations.hashchangeEvent = {
        _init: function() {
            self.callback(locationWrapper.get());
            $(window).bind('hashchange', self.check);
        },
        check: function() {
            self.callback(locationWrapper.get());
        },
        load: function(hash) {
            locationWrapper.put(hash);
        }
    };

    var self = $.extend({}, implementations.base);

    if($.browser.msie && ($.browser.version < 8 || document.documentMode < 8)) {
        self.type = 'iframeTimer';
    } else if("onhashchange" in window) {
        self.type = 'hashchangeEvent';
    } else {
        self.type = 'timer';
    }

    $.extend(self, implementations[self.type]);
    $.history = self;
})(jQuery);

/*
 * jQuery plugin: fieldSelection - v0.1.0 - last change: 2006-12-16
 * (c) 2006 Alex Brem <alex@0xab.cd> - http://blog.0xab.cd
 */

;(function() {
    var fieldSelection = {
        getSelection: function() {
            var e = this.jquery ? this[0] : this;
            
            return (
                /* mozilla / dom 3.0 */
                ('selectionStart' in e && function() {
                    var l = e.selectionEnd - e.selectionStart;
                    return {
                        start: e.selectionStart,
                        end: e.selectionEnd,
                        length: l,
                        text: e.value.substr(e.selectionStart, l)};
                })
                
                /* exploder */
                || (document.selection && function() {
                    e.focus();
                    
                    var r = document.selection.createRange();
                    if (r == null) {
                        return {
                            start: 0,
                            end: e.value.length,
                            length: 0};
                    }
                    
                    var re = e.createTextRange();
                    var rc = re.duplicate();
                    re.moveToBookmark(r.getBookmark());
                    rc.setEndPoint('EndToStart', re);
                    
                    // IE bug - it counts newline as 2 symbols when getting selection coordinates,
                    //  but counts it as one symbol when setting selection
                    var rcLen = rc.text.length,
                        i;
                    for (i = 0; i < rcLen; i++) {
                        if (rc.text.charAt(i) == '\n') rcLen--;
                    }
                    var rLen = r.text.length;
                    for (i = 0; i < rLen; i++) {
                        if (r.text.charAt(i) == '\n') rLen--;
                    }
                    
                    return {
                        start: rcLen,
                        end: rcLen + rLen,
                        length: rLen,
                        text: r.text};
                })
                
                /* browser not supported */
                || function() {
                    return {
                        start: 0,
                        end: e.value.length,
                        length: 0};
                }

            )();

        },
        
        setSelection: function(start, end) {
            var e = document.getElementById($(this).attr('id')); // I don't know why... but $(this) don't want to work today :-/
            if (!e) {
                return $(this);
            } else if (e.setSelectionRange) { /* WebKit */ 
                e.focus(); e.setSelectionRange(start, end);
            } else if (e.createTextRange) { /* IE */
                var range = e.createTextRange();
                range.collapse(true);
                range.moveEnd('character', end);
                range.moveStart('character', start);
                range.select();
            } else if (e.selectionStart) { /* Others */
                e.selectionStart = start;
                e.selectionEnd = end;
            }
            
            return $(this);
        },
        
        replaceSelection: function() {
            var e = this.jquery ? this[0] : this;
            var text = arguments[0] || '';
            
            return (
                /* mozilla / dom 3.0 */
                ('selectionStart' in e && function() {
                    e.value = e.value.substr(0, e.selectionStart) + text + e.value.substr(e.selectionEnd, e.value.length);
                    return this;
                })
                
                /* exploder */
                || (document.selection && function() {
                    e.focus();
                    document.selection.createRange().text = text;
                    return this;
                })
                
                /* browser not supported */
                || function() {
                    e.value += text;
                    return this;
                }
            )();
        }
    };
    
    jQuery.each(fieldSelection, function(i) { jQuery.fn[i] = this; });

})();
jQuery.autocomplete = function(input, options) {
	// Create a link to self
	var me = this;

	// Create jQuery object for input element
	var $input = this.input = $(input).attr("autocomplete", "off");

	// Apply inputClass if necessary
	if (options.inputClass) $input.addClass(options.inputClass);

	// Create results
	var results = document.createElement("div");
	// Create jQuery object for results
	var $results = $(results);
	$results.hide().addClass(options.resultsClass).css("position", "absolute");
	if( options.width > 0 ) $results.css("width", options.width);

	// Add to body element
	$("body").append(results);

	input.autocompleter = me;

	var timeout = null;
	var prev = "";
	var active = -1;
	var cache = {};
	var keyb = false;
	var hasFocus = false;
	var lastKeyPressCode = null;
	
	var width_fix = GetInt($results.css("border-left-width")) + GetInt($results.css("border-right-width"));

	// flush cache
	function flushCache(){
		cache = {};
		cache.data = {};
		cache.length = 0;
	};

	// flush cache
	flushCache();

	// if there is a data array supplied
	if( options.data != null ){
		var sFirstChar = "", stMatchSets = {}, row = [];

		// no url was specified, we need to adjust the cache length to make sure it fits the local data store
		if( typeof options.url != "string" ) options.cacheLength = 1;

		// loop through the array and create a lookup structure
		for( var i=0; i < options.data.length; i++ ){
			// if row is a string, make an array otherwise just reference the array
			row = ((typeof options.data[i] == "string") ? [options.data[i]] : options.data[i]);

			// if the length is zero, don't add to list
			if( row[0].length > 0 ){
				// get the first character
				sFirstChar = row[0].substring(0, 1).toLowerCase();
				// if no lookup array for this character exists, look it up now
				if( !stMatchSets[sFirstChar] ) stMatchSets[sFirstChar] = [];
				// if the match is a string
				stMatchSets[sFirstChar].push(row);
			}
		}

		// add the data items to the cache
		for( var k in stMatchSets ){
			// increase the cache size
			options.cacheLength++;
			// add to the cache
			addToCache(k, stMatchSets[k]);
		}
	}

	$input
	.keydown(function(e) {
		// track last key pressed
		lastKeyPressCode = e.keyCode;
		switch(e.keyCode) {
			case 38: // up
				e.preventDefault();
				moveSelect(-1);
				break;
			case 40: // down
				e.preventDefault();
				moveSelect(1);
				break;
			case 9:  // tab
			case 13: // return
				if( selectCurrent() ){
					// make sure to blur off the current field
					$input.get(0).blur();
					e.preventDefault();
				}
				break;
			default:
				active = -1;
				if (timeout) clearTimeout(timeout);
				timeout = setTimeout(function(){onChange();}, options.delay);
				break;
		}
	})
	.focus(function(){
		// track whether the field has focus, we shouldn't process any results if the field no longer has focus
		hasFocus = true;
	})
	.blur(function() {
		// track whether the field has focus
		hasFocus = false;
		hideResults();
	});

	hideResultsNow();

	function onChange() {
		// ignore if the following keys are pressed: [del] [shift] [capslock]
		//if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
		if (lastKeyPressCode > 8 && lastKeyPressCode < 32) return $results.hide();
		var v = $input.val();
		if (v == prev) return;
		prev = v;
		if (v.length >= options.minChars) {
			$input.addClass(options.loadingClass);
			requestData(v);
		} else {
			$input.removeClass(options.loadingClass);
			$results.hide();
		}
	};

 	function moveSelect(step) {

		var lis = $("li", results);
		if (!lis) return;

		active += step;

		if (active < 0) {
			active = 0;
		} else if (active >= lis.size()) {
			active = lis.size() - 1;
		}

		lis.removeClass("ac_over");

		$(lis[active]).addClass("ac_over");

		// Weird behaviour in IE
		// if (lis[active] && lis[active].scrollIntoView) {
		// 	lis[active].scrollIntoView(false);
		// }

	};

	function selectCurrent() {
		var li = $("li.ac_over", results)[0];
		if (!li) {
			var $li = $("li", results);
			if (options.selectOnly) {
				if ($li.length == 1) li = $li[0];
			} else if (options.selectFirst) {
				li = $li[0];
			}
		}
		if (li) {
			selectItem(li);
			return true;
		} else {
			return false;
		}
	};

	function selectItem(li) {
		if (!li) {
			li = document.createElement("li");
			li.extra = [];
			li.selectValue = "";
		}
		var v = $.trim(li.selectValue ? li.selectValue : li.innerHTML);
		input.lastSelected = v;
		prev = v;
		$results.html("");
		$input.val(v);
		hideResultsNow();
		if (options.onItemSelect) setTimeout(function() { options.onItemSelect(li) }, 1);
	};

	// selects a portion of the input string
	function createSelection(start, end){
		// get a reference to the input element
		var field = $input.get(0);
		if( field.createTextRange ){
			var selRange = field.createTextRange();
			selRange.collapse(true);
			selRange.moveStart("character", start);
			selRange.moveEnd("character", end);
			selRange.select();
		} else if( field.setSelectionRange ){
			field.setSelectionRange(start, end);
		} else {
			if( field.selectionStart ){
				field.selectionStart = start;
				field.selectionEnd = end;
			}
		}
		field.focus();
	};

	// fills in the input box w/the first match (assumed to be the best match)
	function autoFill(data){
		// if the last user key pressed was backspace, don't autofill
		if( lastKeyPressCode != 8 ){
			var sValue = data[0];//fadix
			// fill in the value (keep the case the user has typed)
			$input.val($input.val() + sValue.substring(prev.length));
			// select the portion of the value not typed by the user (so the next character will erase)
			createSelection(prev.length, sValue.length);
			//fadix
			if (options.onAutoFill) options.onAutoFill(data);
		}
	};

	function showResults() {
		// get the position of the input field right now (in case the DOM is shifted)
		var pos = findPos(input);
		// either use the specified width, or autocalculate based on form element
		var iWidth = (options.width > 0) ? options.width : $input.outerWidth() - width_fix;
		// reposition
		
		if($('#overlay_bg').is(':visible')) pos.y += $('body').scrollTop() - $(input).closest('.overlay_layer').scrollTop();
		
		$results.css({
			width: parseInt(iWidth) + "px",
			top: (pos.y + input.offsetHeight) + "px",
			left: pos.x + "px"
		}).show();
	};

	function hideResults() {
		if (timeout) clearTimeout(timeout);
		timeout = setTimeout(hideResultsNow, 200);
	};

	function hideResultsNow(reason) {
		if (timeout) clearTimeout(timeout);
		$input.removeClass(options.loadingClass);
		if ($results.is(":visible")) {
			$results.hide();
		}
		if (options.mustMatch) {
			var v = $input.val();
			if (v != input.lastSelected) {
				selectItem(null);
			}
		}
		//fadix
		if (options.onHidePopup)
			options.onHidePopup(reason);
	};

	function receiveData(q, data) {
		if (data) {
			$input.removeClass(options.loadingClass);
			results.innerHTML = "";

			// if the field no longer has focus or if there are no matches, do not display the drop down
			if( !hasFocus || data.length == 0 ) return hideResultsNow(hasFocus ? 'NotFound' : 'LostFocus');

			if ($.browser.msie) {
				// we put a styled iframe behind the calendar so HTML SELECT elements don't show through
				$results.append(document.createElement('iframe'));
			}
			results.appendChild(dataToDom(data));
			// autofill in the complete box w/the first match as long as the user hasn't entered in more data
			if( options.autoFill && ($input.val().toLowerCase() == q.toLowerCase()) ) autoFill(data[0]);
			showResults();
		} else {
			hideResultsNow('NotFound');
		}
	};

	function parseData(data) {
		if (!data) return null;
		var parsed = [];
		var rows = data.split(options.lineSeparator);
		for (var i=0; i < rows.length; i++) {
			var row = $.trim(rows[i]);
			if (row) {
				parsed[parsed.length] = row.split(options.cellSeparator);
			}
		}
		return parsed;
	};

	function dataToDom(data) {
		var ul = document.createElement("ul");
		var num = data.length;

		// limited results to a max number
		if( (options.maxItemsToShow > 0) && (options.maxItemsToShow < num) ) num = options.maxItemsToShow;

		for (var i=0; i < num; i++) {
			var row = data[i];
			if (!row) continue;
			var li = document.createElement("li");
			if (options.formatItem) {
				li.innerHTML = options.formatItem(row, i, num);
				li.selectValue = row[0];
			} else {
				li.innerHTML = row[0];
				li.selectValue = row[0];
			}
			var extra = null;
			if (row.length > 1) {
				extra = [];
				for (var j=1; j < row.length; j++) {
					extra[extra.length] = row[j];
				}
			}
			li.extra = extra;
			ul.appendChild(li);
			$(li).hover(
				function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); active = $("li", ul).indexOf($(this).get(0)); },
				function() { $(this).removeClass("ac_over"); }
			).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this) });
		}
		return ul;
	};

	function requestData(q) {
		if (!options.matchCase) q = q.toLowerCase();
		var data = options.cacheLength ? loadFromCache(q) : null;
		// recieve the cached data
		if (data) {
			receiveData(q, data);
		// if an AJAX url has been supplied, try loading the data now
		} else if( (typeof options.url == "string") && (options.url.length > 0) ){
			$.get(makeUrl(q), function(data) {
				data = parseData(data);
				addToCache(q, data);
				receiveData(q, data);
			});
		// if there's been no data found, remove the loading class
		} else {
			$input.removeClass(options.loadingClass);
		}
	};

	function makeUrl(q) {
		var url = options.url + "?q=" + encodeURI(q);
		for (var i in options.extraParams) {
			url += "&" + i + "=" + encodeURI(options.extraParams[i]);
		}
		return url;
	};

	function loadFromCache(q) {
		if (!q) return null;
		if (cache.data[q]) return cache.data[q];
		if (options.matchSubset) {
			for (var i = q.length - 1; i >= options.minChars; i--) {
				var qs = q.substr(0, i);
				var c = cache.data[qs];
				if (c) {
					var csub = [];
					for (var j = 0; j < c.length; j++) {
						var x = c[j];
						var x0 = x[0];
						if (matchSubset(x0, q)) {
							csub[csub.length] = x;
						}
					}
					return csub;
				}
			}
		}
		return null;
	};

	function matchSubset(s, sub) {
		if (!options.matchCase) s = s.toLowerCase();
		var i = s.indexOf(sub);
		if (i == -1) return false;
		return i == 0 || options.matchContains;
	};

	this.flushCache = function() {
		flushCache();
	};

	this.setExtraParams = function(p) {
		options.extraParams = p;
	};

	this.findValue = function(){
		var q = $input.val();

		if (!options.matchCase) q = q.toLowerCase();
		var data = options.cacheLength ? loadFromCache(q) : null;
		if (data) {
			findValueCallback(q, data);
		} else if( (typeof options.url == "string") && (options.url.length > 0) ){
			$.get(makeUrl(q), function(data) {
				data = parseData(data)
				addToCache(q, data);
				findValueCallback(q, data);
			});
		} else {
			// no matches
			findValueCallback(q, null);
		}
	}

	function findValueCallback(q, data){
		if (data) $input.removeClass(options.loadingClass);

		var num = (data) ? data.length : 0;
		var li = null;

		for (var i=0; i < num; i++) {
			var row = data[i];

			if( row[0].toLowerCase() == q.toLowerCase() ){
				li = document.createElement("li");
				if (options.formatItem) {
					li.innerHTML = options.formatItem(row, i, num);
					li.selectValue = row[0];
				} else {
					li.innerHTML = row[0];
					li.selectValue = row[0];
				}
				var extra = null;
				if( row.length > 1 ){
					extra = [];
					for (var j=1; j < row.length; j++) {
						extra[extra.length] = row[j];
					}
				}
				li.extra = extra;
			}
		}

		if( options.onFindValue ) setTimeout(function() { options.onFindValue(li) }, 1);
	}

	function addToCache(q, data) {
		if (!data || !q || !options.cacheLength) return;
		if (!cache.length || cache.length > options.cacheLength) {
			flushCache();
			cache.length++;
		} else if (!cache[q]) {
			cache.length++;
		}
		cache.data[q] = data;
	};

	function findPos(obj) {
		var curleft = obj.offsetLeft || 0;
		var curtop = obj.offsetTop || 0;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
		
		return {x:curleft,y:curtop};
	}
}

jQuery.fn.autocomplete = function(url, options, data) {
	// Make sure options exists
	options = options || {};
	// Set url as option
	options.url = url;
	// set some bulk local data
	options.data = ((typeof data == "object") && (data.constructor == Array)) ? data : null;

	// Set default values for required options
	options.inputClass = options.inputClass || "ac_input";
	options.resultsClass = options.resultsClass || "ac_results";
	options.lineSeparator = options.lineSeparator || "\n";
	options.cellSeparator = options.cellSeparator || "|";
	options.minChars = options.minChars || 1;
	options.delay = options.delay || 400;
	options.matchCase = options.matchCase || 0;
	options.matchSubset = options.matchSubset;// || 1;
	options.matchContains = options.matchContains || 0;
	options.cacheLength = options.cacheLength || 1;
	options.mustMatch = options.mustMatch || 0;
	options.extraParams = options.extraParams || {};
	options.loadingClass = options.loadingClass || "ac_loading";
	options.selectFirst = options.selectFirst || false;
	options.selectOnly = options.selectOnly || false;
	options.maxItemsToShow = options.maxItemsToShow || -1;
	options.autoFill = options.autoFill || false;
	options.width = parseInt(options.width, 10) || 0;

	this.each(function() {
		var input = this;
		new jQuery.autocomplete(input, options);
	});

	// Don't break the chain
	return this;
}

jQuery.fn.autocompleteArray = function(data, options) {
	return this.autocomplete(null, options, data);
}

jQuery.fn.indexOf = function(e){
	for( var i=0; i<this.length; i++ ){
		if( this[i] == e ) return i;
	}
	return -1;
};

/*
 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
 *
 * Uses the built in easing capabilities added In jQuery 1.1
 * to offer multiple easing options
 *
 * TERMS OF USE - jQuery Easing
 * 
 * Open source under the BSD License. 
 * 
 * Copyright  2008 George McGinley Smith
 * All rights reserved.
*/
jQuery.easing.jswing=jQuery.easing.swing;
jQuery.extend(jQuery.easing,{def:"easeOutQuad",swing:function(e,a,c,b,d){return jQuery.easing[jQuery.easing.def](e,a,c,b,d)},easeInQuad:function(e,a,c,b,d){return b*(a/=d)*a+c},easeOutQuad:function(e,a,c,b,d){return-b*(a/=d)*(a-2)+c},easeInOutQuad:function(e,a,c,b,d){if((a/=d/2)<1)return b/2*a*a+c;return-b/2*(--a*(a-2)-1)+c},easeInCubic:function(e,a,c,b,d){return b*(a/=d)*a*a+c},easeOutCubic:function(e,a,c,b,d){return b*((a=a/d-1)*a*a+1)+c},easeInOutCubic:function(e,a,c,b,d){if((a/=d/2)<1)return b/
2*a*a*a+c;return b/2*((a-=2)*a*a+2)+c},easeInQuart:function(e,a,c,b,d){return b*(a/=d)*a*a*a+c},easeOutQuart:function(e,a,c,b,d){return-b*((a=a/d-1)*a*a*a-1)+c},easeInOutQuart:function(e,a,c,b,d){if((a/=d/2)<1)return b/2*a*a*a*a+c;return-b/2*((a-=2)*a*a*a-2)+c},easeInQuint:function(e,a,c,b,d){return b*(a/=d)*a*a*a*a+c},easeOutQuint:function(e,a,c,b,d){return b*((a=a/d-1)*a*a*a*a+1)+c},easeInOutQuint:function(e,a,c,b,d){if((a/=d/2)<1)return b/2*a*a*a*a*a+c;return b/2*((a-=2)*a*a*a*a+2)+c},easeInSine:function(e,
a,c,b,d){return-b*Math.cos(a/d*(Math.PI/2))+b+c},easeOutSine:function(e,a,c,b,d){return b*Math.sin(a/d*(Math.PI/2))+c},easeInOutSine:function(e,a,c,b,d){return-b/2*(Math.cos(Math.PI*a/d)-1)+c},easeInExpo:function(e,a,c,b,d){return a==0?c:b*Math.pow(2,10*(a/d-1))+c},easeOutExpo:function(e,a,c,b,d){return a==d?c+b:b*(-Math.pow(2,-10*a/d)+1)+c},easeInOutExpo:function(e,a,c,b,d){if(a==0)return c;if(a==d)return c+b;if((a/=d/2)<1)return b/2*Math.pow(2,10*(a-1))+c;return b/2*(-Math.pow(2,-10*--a)+2)+c},
easeInCirc:function(e,a,c,b,d){return-b*(Math.sqrt(1-(a/=d)*a)-1)+c},easeOutCirc:function(e,a,c,b,d){return b*Math.sqrt(1-(a=a/d-1)*a)+c},easeInOutCirc:function(e,a,c,b,d){if((a/=d/2)<1)return-b/2*(Math.sqrt(1-a*a)-1)+c;return b/2*(Math.sqrt(1-(a-=2)*a)+1)+c},easeInElastic:function(e,a,c,b,d){var e=1.70158,f=0,g=b;if(a==0)return c;if((a/=d)==1)return c+b;f||(f=d*0.3);g<Math.abs(b)?(g=b,e=f/4):e=f/(2*Math.PI)*Math.asin(b/g);return-(g*Math.pow(2,10*(a-=1))*Math.sin((a*d-e)*2*Math.PI/f))+c},easeOutElastic:function(e,
a,c,b,d){var e=1.70158,f=0,g=b;if(a==0)return c;if((a/=d)==1)return c+b;f||(f=d*0.3);g<Math.abs(b)?(g=b,e=f/4):e=f/(2*Math.PI)*Math.asin(b/g);return g*Math.pow(2,-10*a)*Math.sin((a*d-e)*2*Math.PI/f)+b+c},easeInOutElastic:function(e,a,c,b,d){var e=1.70158,f=0,g=b;if(a==0)return c;if((a/=d/2)==2)return c+b;f||(f=d*0.3*1.5);g<Math.abs(b)?(g=b,e=f/4):e=f/(2*Math.PI)*Math.asin(b/g);if(a<1)return-0.5*g*Math.pow(2,10*(a-=1))*Math.sin((a*d-e)*2*Math.PI/f)+c;return g*Math.pow(2,-10*(a-=1))*Math.sin((a*d-e)*
2*Math.PI/f)*0.5+b+c},easeInBack:function(e,a,c,b,d,f){f==void 0&&(f=1.70158);return b*(a/=d)*a*((f+1)*a-f)+c},easeOutBack:function(e,a,c,b,d,f){f==void 0&&(f=1.70158);return b*((a=a/d-1)*a*((f+1)*a+f)+1)+c},easeInOutBack:function(e,a,c,b,d,f){f==void 0&&(f=1.70158);if((a/=d/2)<1)return b/2*a*a*(((f*=1.525)+1)*a-f)+c;return b/2*((a-=2)*a*(((f*=1.525)+1)*a+f)+2)+c},easeInBounce:function(e,a,c,b,d){return b-jQuery.easing.easeOutBounce(e,d-a,0,b,d)+c},easeOutBounce:function(e,a,c,b,d){return(a/=d)<1/
2.75?b*7.5625*a*a+c:a<2/2.75?b*(7.5625*(a-=1.5/2.75)*a+0.75)+c:a<2.5/2.75?b*(7.5625*(a-=2.25/2.75)*a+0.9375)+c:b*(7.5625*(a-=2.625/2.75)*a+0.984375)+c},easeInOutBounce:function(e,a,c,b,d){if(a<d/2)return jQuery.easing.easeInBounce(e,a*2,0,b,d)*0.5+c;return jQuery.easing.easeOutBounce(e,a*2-d,0,b,d)*0.5+b*0.5+c}});
;(function($) {

	/*
	 * Auto-growing textareas; technique ripped from Facebook
	 */
	$.fn.autogrow = function(_options) {

		var options = _options || { };
		
		var update = function()
		{
			var times = function(string, number) {
				for (var i = 0, r = ''; i < number; i ++) r += string;
				return r;
			};
			
			var shadow = $(this).data('_autogrow');

			var val = this.value.replace(/</g, '&lt;')
									.replace(/>/g, '&gt;')
									.replace(/&/g, '&amp;')
									.replace(/\n$/, '<br/>&nbsp;')
									.replace(/\n/g, '<br/>')
									.replace(/ {2,}/g, function(space) { return times('&nbsp;', space.length -1) + ' ' });

			shadow.html(val);
			var h = Math.max(shadow.outerHeight() + shadow.borderFix + 15, shadow.minHeight);
			if(shadow.maxHeight && h > shadow.maxHeight) h = shadow.maxHeight;
			$(this).css('height', h);

		}
		
		this.filter('textarea').each(function() {

			var $this = $(this);
			
			if(!$this.data('_autogrow') || options.force)
			{
				var shadow = $('<div></div>').css({
					position:   'absolute',
					top:		-10000,
					left:	   -10000,
					width:	  $(this).width(),
					fontSize:   $this.css('fontSize'),
					fontFamily: $this.css('fontFamily'),
					lineHeight: $this.css('lineHeight'),
					paddingTop: $this.css('paddingTop'),
					paddingBottom: $this.css('paddingBottom'),
					resize:	 'none'
				}).appendTo(document.body);
				
				shadow.minHeight = $this.outerHeight();
				shadow.borderFix = parseInt($this.css('border-top-width')) + parseInt($this.css('border-bottom-width'));
				shadow.maxHeight = options.max_height;
				
				$this.data('_autogrow', shadow);
				
				$(this).change(update).keyup(update).keydown(update);
			}

			update.apply(this);
		});

		return this;
	}
})(jQuery);
;(function($) {
	$.modal_window = function(content,title, options) 
	{
		options = $.extend({},$.modal_window.defaults,options);
		$.modal_window.currentPrefix = options.prefix;

		var ie6		= ($.browser.msie && $.browser.version < 10);
		var $body	= $(document.body);
		var $window	= $(window);

		
		var msgbox = '<div class="'+ options.prefix +'box" id="'+ options.prefix +'box">';
		if(options.useiframe && (($('object, applet').length > 0) || ie6)) {
			msgbox += '<iframe src="javascript:;" class="'+ options.prefix +'fade" id="'+ options.prefix +'fade"></iframe>';
		} else {
			if(ie6) {
				$('select').css('visibility','hidden');
			}
			msgbox +='<div class="'+ options.prefix +'fade" id="'+ options.prefix +'fade"></div>';
		}
			msgbox += '<div class="'+ options.prefix +'" id="'+ options.prefix +'">';
			
		if(options.closeButton)
			msgbox += '<div class="' + options.prefix + 'close">X</div>';
			
			msgbox += '<div class="'+ options.prefix +'container">';		
			msgbox += '<div id="'+ options.prefix +'states"></div>';
			msgbox += '</div>';
			msgbox += '<div align="center" class="filestitle">'+title+'</div>';
			msgbox += '</div></div>';
	
		var $jqib	= $(msgbox).appendTo($body);
		var $jqi	= $jqib.children('#'+ options.prefix);
		var $jqif	= $jqib.children('#'+ options.prefix +'fade');

		
		if(content.constructor == String){
			content = {
				state0: {
					html: content,
				 	buttons: options.buttons,
				 	focus: options.focus,
				 	submit: options.submit
			 	}
		 	};
		}

	
		var states = "";

		$.each(content,function(statename,stateobj){
			stateobj = $.extend({},$.modal_window.defaults.state,stateobj);
			content[statename] = stateobj;

			states += '<div id="'+ options.prefix +'_state_'+ statename +'" class="'+ options.prefix + '_state" style="display:none;"><div class="'+ options.prefix +'content">' + stateobj.html +'</div><div class="'+ options.prefix +'buttons">';
			$.each(stateobj.buttons, function(k, v){
				states += '<button name="' + options.prefix + '_' + statename + '_button' + k + '" id="' + options.prefix +	'_' + statename + '_button' + k + '" value="' + v + '">' + k + '</button>';
			});
			states += '</div></div>';
		});

		
		$jqi.find('#'+ options.prefix +'states').html(states).children('.'+ options.prefix +'_state:first').css('display','block');
		$jqi.find('.'+ options.prefix +'buttons:empty').css('display','none');
		
		
		$.each(content,function(statename,stateobj){
			var $state = $jqi.find('#'+ options.prefix +'_state_'+ statename);

			$state.children('.'+ options.prefix +'buttons').children('button').click(function(){
				var msg = $state.children('.'+ options.prefix +'content');
				var clicked = stateobj.buttons[$(this).text()];
				var forminputs = {};

				
				$.each($jqi.find('#'+ options.prefix +'states :input').serializeArray(),function(i,obj){
					if (forminputs[obj.name] === undefined) {
						forminputs[obj.name] = obj.value;
					} else if (typeof forminputs[obj.name] == Array) {
						forminputs[obj.name].push(obj.value);
					} else {
						forminputs[obj.name] = [forminputs[obj.name],obj.value];	
					} 
				});

				var close = stateobj.submit(clicked,msg,forminputs);
				if(close === undefined || close) {
					removeModal_window(true,clicked,msg,forminputs);
				}
			});
			$state.find('.'+ options.prefix +'buttons button:eq('+ stateobj.focus +')').addClass(options.prefix +'defaultbutton');

		});

		var ie6scroll = function(){
			$jqib.css({ top: $window.scrollTop() });
		};

		var fadeClicked = function(){
			if(options.persistent){
				var i = 0;
				$jqib.addClass(options.prefix +'warning');
				var intervalid = setInterval(function(){
					$jqib.toggleClass(options.prefix +'warning');
					if(i++ > 1){
						clearInterval(intervalid);
						$jqib.removeClass(options.prefix +'warning');
					}
				}, 100);
			}
			else {
				removeModal_window();
			}
		};

		var escapeKeyCloseModal_window = function(e){
			var key = (window.event) ? event.keyCode : e.keyCode; // MSIE or Firefox
			if(key==27) {
				removeModal_window();	
			}
		};

		var positionModal_window = function(){
			$jqib.css({
				position: (ie6) ? "absolute" : "fixed",
				height: $window.height(),
				width: "100%",
				top: (ie6)? $window.scrollTop() : 0,
				left: 0,
				right: 0,
				bottom: 0
			});
			$jqif.css({
				position: "absolute",
				height: $window.height(),
				width: "100%",
				top: 0,
				left: 0,
				right: 0,
				bottom: 0
			});
			$jqi.css({
				position: "absolute",
				top: options.top,
				left: "50%",
				marginLeft: (($jqi.outerWidth()/2)*-1)
			});
		};

		var styleModal_window = function(){
			$jqif.css({
				zIndex: options.zIndex,
				display: "none",
				opacity: options.opacity
			});
			$jqi.css({
				zIndex: options.zIndex+1,
				display: "none"
			});
			$jqib.css({
				zIndex: options.zIndex
			});
		};

		var removeModal_window = function(callCallback, clicked, msg, formvals){
			$jqi.remove();
			//ie6, remove the scroll event
			if(ie6) {
				$body.unbind('scroll',ie6scroll);
			}
			$window.unbind('resize',positionModal_window);
			$jqif.fadeOut(options.overlayspeed,function(){
				$jqif.unbind('click',fadeClicked);
				$jqif.remove();
				if(callCallback) {
					options.callback(clicked,msg,formvals);
				}
				$jqib.unbind('keypress',escapeKeyCloseModal_window);
				$jqib.remove();
				if(ie6 && !options.useiframe) {
					$('select').css('visibility','visible');
				}
			});
		};

		positionModal_window();
		styleModal_window();
		
		//ie6, add a scroll event to fix position:fixed
		if(ie6) {
			$window.scroll(ie6scroll);
		}
		$jqif.click(fadeClicked);
		$window.resize(positionModal_window);
		$jqib.keypress(escapeKeyCloseModal_window);
		$jqi.find('.'+ options.prefix +'close').click(removeModal_window);

		//Show it
		$jqif.fadeIn(options.overlayspeed);
		//$jqi[options.show](options.speed,options.loaded);
		$jqif.css('display', '');
		$jqi.css('display', '');
		$jqi.find('#'+ options.prefix +'states .'+ options.prefix +'_state:first .'+ options.prefix +'defaultbutton').focus();

		return $jqib;
	};
	
	$.modal_window.defaults = {
		prefix:'jqi',
		buttons: {
			Ok: true
		},
	 	loaded: function(){

	 	},
	  	submit: function(){
	  		return true;
		},
	 	callback: function(){

	 	},
		opacity: 0.6,
	 	zIndex: 999,
	  	overlayspeed: 'slow',
	   	speed: 'fast',
   		show: 'fadeIn',
	   	focus: 0,
	   	useiframe: false,
	 	top: "15%",
	  	persistent: true,
	  	state: {
			html: '',
		 	buttons: {
		 		Ok: true
		 	},
		  	focus: 0,
		   	submit: function(){
		   		return true;
		   }
	  	}
	};
	
	$.modal_window.currentPrefix = $.modal_window.defaults.prefix;

	$.modal_window.setDefaults = function(o) {
		$.modal_window.defaults = $.extend({}, $.modal_window.defaults, o);
	};
	
	$.modal_window.setStateDefaults = function(o) {
		$.modal_window.defaults.state = $.extend({}, $.modal_window.defaults.state, o);
	};
	
	$.modal_window.getStateContent = function(state) {
		return $('#'+ $.modal_window.currentPrefix +'_state_'+ state);
	};
	
	$.modal_window.goToState = function(state) {
		$('.'+ $.modal_window.currentPrefix +'_state').slideUp('slow');
		$('#'+ $.modal_window.currentPrefix +'_state_'+ state).slideDown('slow',function(){
			$(this).find('.'+ $.modal_window.currentPrefix +'defaultbutton').focus();
		});
	};
	
	$.modal_window.nextState = function() {
		var $next = $('.'+ $.modal_window.currentPrefix +'_state:visible').next();

		$('.'+ $.modal_window.currentPrefix +'_state').slideUp('slow');
		
		$next.slideDown('slow',function(){
			$next.find('.'+ $.modal_window.currentPrefix +'defaultbutton').focus();
		});
	};
	
	$.modal_window.prevState = function() {
		var $next = $('.'+ $.modal_window.currentPrefix +'_state:visible').prev();

		$('.'+ $.modal_window.currentPrefix +'_state').slideUp('slow');
		
		$next.slideDown('slow',function(){
			$next.find('.'+ $.modal_window.currentPrefix +'defaultbutton').focus();
		});
	};
	
	$.modal_window.close = function() {
		/*$('#'+ $.modal_window.currentPrefix +'box').fadeOut('fast',function(){
        		$(this).remove();
		});*/
		$('#'+ $.modal_window.currentPrefix +'box').remove();
	};
	
})(jQuery);

