/*******************************
*   COMMON functions
********************************/

var isMSIE = (navigator.appName == "Microsoft Internet Explorer");
var isOpera = (navigator.userAgent.indexOf("Opera") != -1);
var isNetscape = (navigator.appName == "Netscape");


// Change object size
// cmd (1 - Increase, 2 - Decrease)
// direction (1 - width, 2 - height, 3 - both)
// pref - preffix for the cookies
// obj - object
function FrmChangeSize(cmd, direction, pref, obj, step, minw, maxw, minh, maxh)
{
	if(!(cmd==1 || cmd==2)) return false;
	if(!(direction==1 || direction==2 || direction==3) ) return false;
	if(!step) step=50;
	if(!minh || !minw || !maxh || !maxw) return false;
	var obj = document.getElementById(obj);
	if(!obj) return false;
	if(!pref) pref = "pref_";

	var w=parseInt(obj.style.width);
	var h=parseInt(obj.style.height);

	if(cmd==1)
	{
		if( (direction == 1) || (direction == 3) )
		{
			if( (w + step) <= maxw ) w = w + step;
		}
		if( (direction == 2) || (direction == 3) )
		{
			if( (h + step) <= maxh ) h = h + step;
		}
	}
	if(cmd==2)
	{
		if( (direction == 1) || (direction == 3) )
		{
			if( (w - step) >= minw ) w = w - step;
		}
		if( (direction == 2) || (direction == 3) )
		{
			if( (h - step) >= minh ) h = h - step;
		}
	}

	obj.style.width = w+'px';
	obj.style.height = h+'px';
	var expDate = new Date;
	expDate.setTime (expDate.getTime() + (600*24*60*60*1000));
	SetCookie(pref + "w", w, expDate, "/");
	SetCookie(pref + "h", h, expDate, "/");
}

/**
* Устанавливаем Cookie
*/
function SetCookie(name,value,expires,path,domain,secure) {
	document.cookie = name + "=" + escape(value)
  + ((expires) ? "; expires=" + expires.toGMTString() : "")
  + ((path) ? "; path=" + path : "")
  + ((domain) ? "; domain=" + domain : "")
  + ((secure) ? "; secure" : "");
}

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);
}

/**
* Открываем всплывающее окно
* @param
* url - ссылка
* imgname - название окна
* w, h - ширина, высота
*/
function OpenWindow(url, imgname, w, h){
	var features='left=0,top=0,resizable=1,menubar=0,location=0,status=0,toolbar=0';
	wm=window.screen.width-10;hm=window.screen.height-60;
	if(w>wm || h>hm){features=features+',scrollbars=1';}else{features=features+',scrollbars=0';}
	if(w>wm){features=features+',width='+wm;}else{features=features+',width='+w;}
	if(h>hm){features=features+',height='+hm;}else{features=features+',height='+h;}
	window.open(url, imgname, features, true);
}

/**
* найти объект по ID
*/
function getElem(div) {
	return document.getElementById ? document.getElementById(div) : document.all[div]
}


/**
* Проверка Email
*/
function isEmail(email)
{
	var arr1 = email.split("@");
	if (arr1.length != 2) return false;
	else if (arr1[0].length < 1) return false;
	var arr2 = arr1[1].split(".");
	if (arr2.length < 2) return false;
	else if (arr2[0].length < 1) return false;
	return true;
}


/**
* Проверка строки на пустоту
*/
function isEmpty (txt)
{
	var ch;
	if (txt == "") return true;
	for (var i=0; i<txt.length; i++){
		ch = txt.charAt(i);
		if (ch!=" " && ch!="\n" && ch!="\t" && ch!="\r") return false;
	}
	return true;
}

/**
* Показать/Спрятать элемент
* @param
* name - name of object
* value - show/hide/
*/
function ShowHideElement(name, value) {
	var obj = getElem(name);
	if(typeof(obj)!='undefined')
	{
		if(obj.style.display == 'block' || value == 'hide')
			obj.style.display = 'none';
		else if(obj.style.display == 'none' || value == 'show')
			obj.style.display = 'block';
	}
}

function delaybanner(){
	if (timerID) clearTimeout(timerID);
	self.focus();
}

function pup(Url,width,height){
	if (width!=''){
		test_width=parseInt(width);
		if (isNaN(test_width)) width=240;
	}else{
		width=screen.width - 10;
	}
	if (height!=''){
		test_height=parseInt(height);
		if (isNaN(test_height)) height=400;
	}else{
		height=screen.height - 60;
	}
	open(Url, 'popup_autochel', 'titlebar=no,height='+height+',width='+width+',scrollbars=no');
	timerID=setTimeout('delaybanner()',8000);
}


var block_width = 200; //в CSS для блока (стиль footnote_popup) должна быть указана такая же длина (width)!

// получение координат курсора мыши
function GetCoords(event) {
	var x = y = 0;
	
	if (document.attachEvent != null) // Internet Explorer & Opera
	{
		x = window.event.clientX +
			(document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
		y = window.event.clientY + 
			(document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	}
	else if (!document.attachEvent && document.addEventListener) // Gecko
	{
		x = event.clientX + window.scrollX;
		y = event.clientY + window.scrollY;
	} else {}
	
	return {x:x, y:y};
}

// показ блока в месте клика (по полученным координатам)
function ShowFootnote(event, id) {
	var event = event || window.event;
	
	var ss = ScreenSize(); // получение размеров клиентской части окна - координаты блока рассчитываются таким образом, чтоб блок не выползал за рабочую область
	var x = GetCoords(event).x;
	var x_delta = ss.w - block_width;
	var dx = 30; // дизайнерский отступ "для красоты" :) по абсциссе
	var dy = 5;  // дизайнерский отступ "для красоты" :) по ординате
	
	document.getElementById(id).style.left = (x > x_delta ? x_delta - dx : (x < 0 ? dx : x));
	document.getElementById(id).style.top = GetCoords(event).y + dy;
	document.getElementById(id).style.display = 'block';
}

// получение размера клиентской части окна
function ScreenSize() {
	var w, h; // w - длина клинетской области, h - высота клинетской области
	
	w = (window.innerWidth ? window.innerWidth :
			(document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth)
		);
	h = (window.innerHeight ? window.innerHeight :
			(document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight)
		);
			
	return {w:w, h:h};
}

// установить/снять все флажки checkbox
// checks	- имя набора чекбоксов (например, ids[])
// val		- значение, которое нужно установить (1 || 0)
function SetChecks(checks, val, id_div)
{
	elts = document.getElementsByName(checks);
	for(i=0; i<elts.length; i++)
	{
		elts[i].checked = val;
	}

	// скрытие всех объектов класса
	divs = document.getElementsByTagName('div');
	for(i=0; i<divs.length; i++)
	{
		if(divs[i].className == 's_divs')
			divs[i].style.display = 'none';
	}
		
	// показ нужного объекта
	document.getElementById(id_div).style.display = 'block';
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
};
/**
 * Copyright (c) "IG 74", LTD
 * Content: Functions to make money
 */

/**
 * Money postloader
 */

function sb_loader(){
	this.domain = '';
	this.place_tag = 'div'; // тэг для баннерных мест
	this.place_class = 'surbis_banner'; // опознавательный класс для баннерных мест
	this.place_params_tag = 'p'; // тэг для параметров баннерных мест
	this.default_b_type = 'multi'; // как запрашивать (multi - пачками, single - по одному)
	this.default_prog = 'http://www.surbis.ru/cgi-bin/banjs_inner.cgi';
	this.default_multi_prog = 'http://www.surbis.ru/cgi-bin/banjs_inner.cgi';
	this.multi_max = 32;
	this.rule = [[3, 1, 1, 3, ''],[3, 3, 1, 3, ''],[3, 2, 2, 4, ''],[2, 0, 0, 1, "-/."],[3, 2, 1, 2, ''],[3, 3, 1, 4, ''],[3, 1, 2, 3, ''],[3, 2, 1, 3, ''],[2, 0, 1, 1, "/"],[2, 0, 1, 1, "strx"],[3, 3, 3, 5, ''],[2, 0, 1, 1, "/"]];
	this.rule_multi = [[3, 1, 1, 3, ''],[3, 3, 1, 3, ''],[3, 2, 2, 4, ''],[2, 0, 0, 1, "-/."],[3, 2, 1, 2, ''],[3, 3, 1, 4, ''],[3, 1, 2, 3, ''],[3, 2, 1, 3, ''],[2, 0, 1, 1, "/"],[2, 0, 1, 1, "imva"],[3, 3, 3, 5, ''],[2, 0, 1, 1, "/"]];
	this.t = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";
}

sb_loader.prototype.rand = function(a, b){
	if(a > b){var t = a;a = b;b = t;}
	return Math.floor(Math.random() * (b - a + 1) + a);
}

sb_loader.prototype.randstr = function(rule){
	var scnt, cnt, buf = '', symb = '';
	for(var i in rule){
		switch(rule[i][0]){
		case 1: break;
		case 2: 
			if(rule[i][3] != rule[i][2]) cnt = this.rand(rule[i][2], rule[i][3]);
			else cnt = rule[i][3];
			scnt = rule[i][4].length - 1;
			for(var j = 0; j < cnt; j++) buf+= rule[i][4].charAt(this.rand(0, scnt));
			break;
		case 3:
			if(rule[i][3] != rule[i][2]) cnt = this.rand(rule[i][2], rule[i][3]);
			else cnt = rule[i][3];
			scnt = -1;
			if(rule[i][1] & 1) scnt+= 26;
			if(rule[i][1] & 2) scnt+= 10;
			if(scnt == 0 || cnt == 0) break;
			for(var j = 0; j < cnt; j++){
				symb = this.rand(0, scnt) + 48;
				if(!(rule[i][1] & 2) && rule[i][1] & 1) symb+= 49;
				else if(rule[i][1] & 2 && rule[i][1] & 1 && symb > 57) symb+= 39;
				buf+= String.fromCharCode(symb);
			}
			break;
		}
	}
	return buf;
}

sb_loader.prototype.init = function(f_load){
	this.default_prog = '/'+this.randstr(this.rule);
	this.default_multi_prog = '/'+this.randstr(this.rule_multi);

	this.addEvent(window, 'load', f_load, false);
	this.getDomain();
};

sb_loader.prototype.getElementsByClass = function(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
};

sb_loader.prototype.addEvent = function(elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	}
	else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	}
	else {
		elm['on' + evType] = fn;
	}
};

sb_loader.prototype.getDomain = function(){
	this.domain = window.location.hostname;
	if(this.domain.substr(0, 4) == 'www.') this.domain = this.domain.substr(4);
};

sb_loader.prototype.show = function(){
	var multi_banners = {};
	var surbis_banners = this.getElementsByClass(this.place_class, null, this.place_tag);
	if(surbis_banners.length==0) return false;
	var surbis_bannersLen = surbis_banners.length;
	for (var i = 0; i < surbis_bannersLen; i++) {
		var prog = this.default_prog;
		var multi_prog = this.default_multi_prog;
		var b_type = this.default_b_type;
		var params = {
			'p': this.domain
		};
		var els = surbis_banners[i].getElementsByTagName(this.place_params_tag);
		var elsLen = els.length;
		for(var j = 0; j < elsLen; j++) {
			if( els[j].className == '' ) continue;
			if( els[j].className == 'prog' ){
				prog = els[j].innerHTML;
				multi_prog = els[j].innerHTML;
				continue;
			}
			if( els[j].className == 'type' ){
				b_type = els[j].innerHTML;
				continue;
			}
			params[els[j].className] = els[j].innerHTML;
		}
		var query = '';
		for(var par in params){
			if(typeof params[par] == 'string'){
				query += '&' + par + '=' + escape(params[par]);
			}
		}
		if(b_type == 'single')
		{
			this.putScript(prog, surbis_banners[i].id.substr(3), params.p);
		}
		else
		{
			if(typeof multi_banners[multi_prog] == 'undefined'){ multi_banners[multi_prog] = {};}
			if(typeof multi_banners[multi_prog][query] == 'undefined'){ multi_banners[multi_prog][query] = new Array;}
			multi_banners[multi_prog][query].push(surbis_banners[i].id.substr(3));
		}
	}
	// выгребаем баннеры пачками
	for(var bans in multi_banners){
		if(typeof multi_banners[bans] == 'object'){
			for(var bans2 in multi_banners[bans]){
				if(typeof multi_banners[bans][bans2] == "object" )
				{
					while( multi_banners[bans][bans2].length > this.multi_max ){
						var bbb = multi_banners[bans][bans2].slice(0, this.multi_max);
						this.putScript(bans, bbb.join(","), params.p);
						multi_banners[bans][bans2] = multi_banners[bans][bans2].slice(this.multi_max)
					}
					if(multi_banners[bans][bans2].length > 0){
						this.putScript(bans, multi_banners[bans][bans2].join(","), params.p);
					}
				}
			}
		}
	}
};

sb_loader.prototype.putScript = function(prog, id, query){
	var js = document.createElement('SCRIPT');
	js.type = 'text/javascript';
	js.language = 'javascript';
	js.src = prog + this.encode(id) + '/' + this.encode(query) + '/';
	document.body.appendChild(js);
};

sb_loader.prototype.encode = function(s){
	var p = 0;var l = s.length;var d = '';
	while(true){
		d+= this.t.charAt(s.charCodeAt(p) >> 2);
		if(l == 1){
			d+= this.t.charAt((s.charCodeAt(p) & 3) << 4);
			break;}
		d+= this.t.charAt((s.charCodeAt(p + 1) >> 4) + ((s.charCodeAt(p) & 3) << 4));
		if(l == 2){
			d+= this.t.charAt((s.charCodeAt(p + 1) & 15) << 2);
			break;}
		d+= this.t.charAt((s.charCodeAt(p + 2) >> 6) + ((s.charCodeAt(p + 1) & 15) << 2));
		d+= this.t.charAt(s.charCodeAt(p + 2) & 63);

		if(l <= 3)break;
		l-= 3;p+= 3;}
	return d;
};

sb_loader.prototype.decode = function(s){
	var p = 0;var l = s.length;var d = '';var c0,c1,c2,c3;
	while(true){
		if(l >= 1) c0 = this.t.indexOf(s.charAt(p));		else c0 = 0;
		if(l >= 2) c1 = this.t.indexOf(s.charAt(p + 1));	else c1 = 0;
		if(l >= 3) c2 = this.t.indexOf(s.charAt(p + 2));	else c2 = 0;
		if(l >= 4) c3 = this.t.indexOf(s.charAt(p + 3));	else c3 = 0;
		if(l == 1){
			d+= String.fromCharCode((c0 << 2) & 255);
			break;}
		d+= String.fromCharCode(((c1 >> 4) + (c0 << 2)) & 255);
		if(l == 2){
			d+= String.fromCharCode((c1 << 4) & 255);
			break;}
		d+= String.fromCharCode(((c1 << 4) + (c2 >> 2)) & 255);
		if(l == 3){
			d+= String.fromCharCode((c2 << 6) & 255);
			break;}
		d+= String.fromCharCode(((c2 << 6) + c3) & 255);

		if(l <= 4)break;
		l-= 4;p+= 4;}
	return d;
};

var sb_loader_ex = new sb_loader();
sb_loader_ex.init(function(){sb_loader_ex.show();});


/**
 * Richmedia functions
 */

function sc_rich_loader(name){
	this.banners = new Array();
	this.bans = null;
	this.showed = new Array();
	this.tohide = new Array();
	this.is_popupscript=1;
}

sc_rich_loader.prototype.showPopupBunner = function(a)
{
	obj = (a) ? a.target : event.srcElement;
	sc_rich_loader_ex.bans = obj;
	setTimeout('sc_rich_loader_ex.showPopupBunner_()', 200);
};

sc_rich_loader.prototype.showPopupBunner_ = function()
{
	if(this.bans != null)
	{
		obj = document.getElementById(this.bans.id+'_big');
		obj.style.display='block';
		this.showed[this.bans.id] = true;
		this.tohide[this.bans.id] = false;
	}
};

sc_rich_loader.prototype.hidePopupBunner = function(a)
{
	obj = (a) ? a.target : event.srcElement;
	sc_rich_loader_ex.bans = sc_rich_loader_ex.banners[obj.id];
	sc_rich_loader_ex.tohide[sc_rich_loader_ex.bans] = true;
	setTimeout('sc_rich_loader_ex.hidePopupBunner_(\''+sc_rich_loader_ex.bans+'\')', 1000);
};

sc_rich_loader.prototype.hidePopupBunner_ = function(name)
{
	if(this.showed[name] == true && this.tohide[name] == true)
	{
		obj = document.getElementById(name+'_big');
		obj.style.display='none';
		this.bans = null;
		this.showed[name] = false;
		this.tohide[name] = false;
	}
};

sc_rich_loader.prototype.popupMouseMove = function(a)
{
	obj = (a) ? a.target : event.srcElement;
	if(sc_rich_loader_ex.bans != null && sc_rich_loader_ex.showed[sc_rich_loader_ex.bans.id] == false)
	{
		if(obj != sc_rich_loader_ex.bans)
			sc_rich_loader_ex.bans = null;
	}
	if(sc_rich_loader_ex.bans != null && sc_rich_loader_ex.showed[sc_rich_loader_ex.bans.id] == true && sc_rich_loader_ex.tohide[sc_rich_loader_ex.bans.id] == false)
	{
		if(obj.id != sc_rich_loader_ex.bans.id+'_hide')
		{
			sc_rich_loader_ex.tohide[sc_rich_loader_ex.bans.id] = true;
			sc_rich_loader_ex.bans = sc_rich_loader_ex.bans.id;
			setTimeout('sc_rich_loader_ex.hidePopupBunner_(\''+sc_rich_loader_ex.bans+'\')', 1000);
		}			
	}
};

sc_rich_loader.prototype.addPopupBanner = function(name,doc)
{
	this.banners[name+'_hide'] = name;
	doc.getElementById(name).onmouseover = this.showPopupBunner;
	doc.getElementById(name+'_hide').onmouseout = this.hidePopupBunner;
	doc.body.onmousemove = this.popupMouseMove;
	this.showed[name] = false;
	this.tohide[name] = false;
};

var sc_rich_loader_ex = new sc_rich_loader();;
/*
 * jQuery 1.2.6 - New Wave Javascript
 *
 * Copyright (c) 2008 John Resig (jquery.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
 * $Rev: 5685 $
 */
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(H(){J w=1b.4M,3m$=1b.$;J D=1b.4M=1b.$=H(a,b){I 2B D.17.5j(a,b)};J u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/,62=/^.[^:#\\[\\.]*$/,12;D.17=D.44={5j:H(d,b){d=d||S;G(d.16){7[0]=d;7.K=1;I 7}G(1j d=="23"){J c=u.2D(d);G(c&&(c[1]||!b)){G(c[1])d=D.4h([c[1]],b);N{J a=S.61(c[3]);G(a){G(a.2v!=c[3])I D().2q(d);I D(a)}d=[]}}N I D(b).2q(d)}N G(D.1D(d))I D(S)[D.17.27?"27":"43"](d);I 7.6Y(D.2d(d))},5w:"1.2.6",8G:H(){I 7.K},K:0,3p:H(a){I a==12?D.2d(7):7[a]},2I:H(b){J a=D(b);a.5n=7;I a},6Y:H(a){7.K=0;2p.44.1p.1w(7,a);I 7},P:H(a,b){I D.P(7,a,b)},5i:H(b){J a=-1;I D.2L(b&&b.5w?b[0]:b,7)},1K:H(c,a,b){J d=c;G(c.1q==56)G(a===12)I 7[0]&&D[b||"1K"](7[0],c);N{d={};d[c]=a}I 7.P(H(i){R(c 1n d)D.1K(b?7.V:7,c,D.1i(7,d[c],b,i,c))})},1g:H(b,a){G((b==\'2h\'||b==\'1Z\')&&3d(a)<0)a=12;I 7.1K(b,a,"2a")},1r:H(b){G(1j b!="49"&&b!=U)I 7.4E().3v((7[0]&&7[0].2z||S).5F(b));J a="";D.P(b||7,H(){D.P(7.3t,H(){G(7.16!=8)a+=7.16!=1?7.76:D.17.1r([7])})});I a},5z:H(b){G(7[0])D(b,7[0].2z).5y().39(7[0]).2l(H(){J a=7;1B(a.1x)a=a.1x;I a}).3v(7);I 7},8Y:H(a){I 7.P(H(){D(7).6Q().5z(a)})},8R:H(a){I 7.P(H(){D(7).5z(a)})},3v:H(){I 7.3W(19,M,Q,H(a){G(7.16==1)7.3U(a)})},6F:H(){I 7.3W(19,M,M,H(a){G(7.16==1)7.39(a,7.1x)})},6E:H(){I 7.3W(19,Q,Q,H(a){7.1d.39(a,7)})},5q:H(){I 7.3W(19,Q,M,H(a){7.1d.39(a,7.2H)})},3l:H(){I 7.5n||D([])},2q:H(b){J c=D.2l(7,H(a){I D.2q(b,a)});I 7.2I(/[^+>] [^+>]/.11(b)||b.1h("..")>-1?D.4r(c):c)},5y:H(e){J f=7.2l(H(){G(D.14.1f&&!D.4n(7)){J a=7.6o(M),5h=S.3h("1v");5h.3U(a);I D.4h([5h.4H])[0]}N I 7.6o(M)});J d=f.2q("*").5c().P(H(){G(7[E]!=12)7[E]=U});G(e===M)7.2q("*").5c().P(H(i){G(7.16==3)I;J c=D.L(7,"3w");R(J a 1n c)R(J b 1n c[a])D.W.1e(d[i],a,c[a][b],c[a][b].L)});I f},1E:H(b){I 7.2I(D.1D(b)&&D.3C(7,H(a,i){I b.1k(a,i)})||D.3g(b,7))},4Y:H(b){G(b.1q==56)G(62.11(b))I 7.2I(D.3g(b,7,M));N b=D.3g(b,7);J a=b.K&&b[b.K-1]!==12&&!b.16;I 7.1E(H(){I a?D.2L(7,b)<0:7!=b})},1e:H(a){I 7.2I(D.4r(D.2R(7.3p(),1j a==\'23\'?D(a):D.2d(a))))},3F:H(a){I!!a&&D.3g(a,7).K>0},7T:H(a){I 7.3F("."+a)},6e:H(b){G(b==12){G(7.K){J c=7[0];G(D.Y(c,"2A")){J e=c.64,63=[],15=c.15,2V=c.O=="2A-2V";G(e<0)I U;R(J i=2V?e:0,2f=2V?e+1:15.K;i<2f;i++){J d=15[i];G(d.2W){b=D.14.1f&&!d.at.2x.an?d.1r:d.2x;G(2V)I b;63.1p(b)}}I 63}N I(7[0].2x||"").1o(/\\r/g,"")}I 12}G(b.1q==4L)b+=\'\';I 7.P(H(){G(7.16!=1)I;G(b.1q==2p&&/5O|5L/.11(7.O))7.4J=(D.2L(7.2x,b)>=0||D.2L(7.34,b)>=0);N G(D.Y(7,"2A")){J a=D.2d(b);D("9R",7).P(H(){7.2W=(D.2L(7.2x,a)>=0||D.2L(7.1r,a)>=0)});G(!a.K)7.64=-1}N 7.2x=b})},2K:H(a){I a==12?(7[0]?7[0].4H:U):7.4E().3v(a)},7b:H(a){I 7.5q(a).21()},79:H(i){I 7.3s(i,i+1)},3s:H(){I 7.2I(2p.44.3s.1w(7,19))},2l:H(b){I 7.2I(D.2l(7,H(a,i){I b.1k(a,i,a)}))},5c:H(){I 7.1e(7.5n)},L:H(d,b){J a=d.1R(".");a[1]=a[1]?"."+a[1]:"";G(b===12){J c=7.5C("9z"+a[1]+"!",[a[0]]);G(c===12&&7.K)c=D.L(7[0],d);I c===12&&a[1]?7.L(a[0]):c}N I 7.1P("9u"+a[1]+"!",[a[0],b]).P(H(){D.L(7,d,b)})},3b:H(a){I 7.P(H(){D.3b(7,a)})},3W:H(g,f,h,d){J e=7.K>1,3x;I 7.P(H(){G(!3x){3x=D.4h(g,7.2z);G(h)3x.9o()}J b=7;G(f&&D.Y(7,"1T")&&D.Y(3x[0],"4F"))b=7.3H("22")[0]||7.3U(7.2z.3h("22"));J c=D([]);D.P(3x,H(){J a=e?D(7).5y(M)[0]:7;G(D.Y(a,"1m"))c=c.1e(a);N{G(a.16==1)c=c.1e(D("1m",a).21());d.1k(b,a)}});c.P(6T)})}};D.17.5j.44=D.17;H 6T(i,a){G(a.4d)D.3Y({1a:a.4d,31:Q,1O:"1m"});N D.5u(a.1r||a.6O||a.4H||"");G(a.1d)a.1d.37(a)}H 1z(){I+2B 8J}D.1l=D.17.1l=H(){J b=19[0]||{},i=1,K=19.K,4x=Q,15;G(b.1q==8I){4x=b;b=19[1]||{};i=2}G(1j b!="49"&&1j b!="H")b={};G(K==i){b=7;--i}R(;i<K;i++)G((15=19[i])!=U)R(J c 1n 15){J a=b[c],2w=15[c];G(b===2w)6M;G(4x&&2w&&1j 2w=="49"&&!2w.16)b[c]=D.1l(4x,a||(2w.K!=U?[]:{}),2w);N G(2w!==12)b[c]=2w}I b};J E="4M"+1z(),6K=0,5r={},6G=/z-?5i|8B-?8A|1y|6B|8v-?1Z/i,3P=S.3P||{};D.1l({8u:H(a){1b.$=3m$;G(a)1b.4M=w;I D},1D:H(a){I!!a&&1j a!="23"&&!a.Y&&a.1q!=2p&&/^[\\s[]?H/.11(a+"")},4n:H(a){I a.1C&&!a.1c||a.2j&&a.2z&&!a.2z.1c},5u:H(a){a=D.3k(a);G(a){J b=S.3H("6w")[0]||S.1C,1m=S.3h("1m");1m.O="1r/4t";G(D.14.1f)1m.1r=a;N 1m.3U(S.5F(a));b.39(1m,b.1x);b.37(1m)}},Y:H(b,a){I b.Y&&b.Y.2r()==a.2r()},1Y:{},L:H(c,d,b){c=c==1b?5r:c;J a=c[E];G(!a)a=c[E]=++6K;G(d&&!D.1Y[a])D.1Y[a]={};G(b!==12)D.1Y[a][d]=b;I d?D.1Y[a][d]:a},3b:H(c,b){c=c==1b?5r:c;J a=c[E];G(b){G(D.1Y[a]){2U D.1Y[a][b];b="";R(b 1n D.1Y[a])1X;G(!b)D.3b(c)}}N{1U{2U c[E]}1V(e){G(c.5l)c.5l(E)}2U D.1Y[a]}},P:H(d,a,c){J e,i=0,K=d.K;G(c){G(K==12){R(e 1n d)G(a.1w(d[e],c)===Q)1X}N R(;i<K;)G(a.1w(d[i++],c)===Q)1X}N{G(K==12){R(e 1n d)G(a.1k(d[e],e,d[e])===Q)1X}N R(J b=d[0];i<K&&a.1k(b,i,b)!==Q;b=d[++i]){}}I d},1i:H(b,a,c,i,d){G(D.1D(a))a=a.1k(b,i);I a&&a.1q==4L&&c=="2a"&&!6G.11(d)?a+"2X":a},1F:{1e:H(c,b){D.P((b||"").1R(/\\s+/),H(i,a){G(c.16==1&&!D.1F.3T(c.1F,a))c.1F+=(c.1F?" ":"")+a})},21:H(c,b){G(c.16==1)c.1F=b!=12?D.3C(c.1F.1R(/\\s+/),H(a){I!D.1F.3T(b,a)}).6s(" "):""},3T:H(b,a){I D.2L(a,(b.1F||b).6r().1R(/\\s+/))>-1}},6q:H(b,c,a){J e={};R(J d 1n c){e[d]=b.V[d];b.V[d]=c[d]}a.1k(b);R(J d 1n c)b.V[d]=e[d]},1g:H(d,e,c){G(e=="2h"||e=="1Z"){J b,3X={30:"5x",5g:"1G",18:"3I"},35=e=="2h"?["5e","6k"]:["5G","6i"];H 5b(){b=e=="2h"?d.8f:d.8c;J a=0,2C=0;D.P(35,H(){a+=3d(D.2a(d,"57"+7,M))||0;2C+=3d(D.2a(d,"2C"+7+"4b",M))||0});b-=29.83(a+2C)}G(D(d).3F(":4j"))5b();N D.6q(d,3X,5b);I 29.2f(0,b)}I D.2a(d,e,c)},2a:H(f,l,k){J e,V=f.V;H 3E(b){G(!D.14.2k)I Q;J a=3P.54(b,U);I!a||a.52("3E")==""}G(l=="1y"&&D.14.1f){e=D.1K(V,"1y");I e==""?"1":e}G(D.14.2G&&l=="18"){J d=V.50;V.50="0 7Y 7W";V.50=d}G(l.1I(/4i/i))l=y;G(!k&&V&&V[l])e=V[l];N G(3P.54){G(l.1I(/4i/i))l="4i";l=l.1o(/([A-Z])/g,"-$1").3y();J c=3P.54(f,U);G(c&&!3E(f))e=c.52(l);N{J g=[],2E=[],a=f,i=0;R(;a&&3E(a);a=a.1d)2E.6h(a);R(;i<2E.K;i++)G(3E(2E[i])){g[i]=2E[i].V.18;2E[i].V.18="3I"}e=l=="18"&&g[2E.K-1]!=U?"2F":(c&&c.52(l))||"";R(i=0;i<g.K;i++)G(g[i]!=U)2E[i].V.18=g[i]}G(l=="1y"&&e=="")e="1"}N G(f.4g){J h=l.1o(/\\-(\\w)/g,H(a,b){I b.2r()});e=f.4g[l]||f.4g[h];G(!/^\\d+(2X)?$/i.11(e)&&/^\\d/.11(e)){J j=V.1A,66=f.65.1A;f.65.1A=f.4g.1A;V.1A=e||0;e=V.aM+"2X";V.1A=j;f.65.1A=66}}I e},4h:H(l,h){J k=[];h=h||S;G(1j h.3h==\'12\')h=h.2z||h[0]&&h[0].2z||S;D.P(l,H(i,d){G(!d)I;G(d.1q==4L)d+=\'\';G(1j d=="23"){d=d.1o(/(<(\\w+)[^>]*?)\\/>/g,H(b,a,c){I c.1I(/^(aK|4f|7E|aG|4T|7A|aB|3n|az|ay|av)$/i)?b:a+"></"+c+">"});J f=D.3k(d).3y(),1v=h.3h("1v");J e=!f.1h("<au")&&[1,"<2A 7w=\'7w\'>","</2A>"]||!f.1h("<ar")&&[1,"<7v>","</7v>"]||f.1I(/^<(aq|22|am|ak|ai)/)&&[1,"<1T>","</1T>"]||!f.1h("<4F")&&[2,"<1T><22>","</22></1T>"]||(!f.1h("<af")||!f.1h("<ad"))&&[3,"<1T><22><4F>","</4F></22></1T>"]||!f.1h("<7E")&&[2,"<1T><22></22><7q>","</7q></1T>"]||D.14.1f&&[1,"1v<1v>","</1v>"]||[0,"",""];1v.4H=e[1]+d+e[2];1B(e[0]--)1v=1v.5T;G(D.14.1f){J g=!f.1h("<1T")&&f.1h("<22")<0?1v.1x&&1v.1x.3t:e[1]=="<1T>"&&f.1h("<22")<0?1v.3t:[];R(J j=g.K-1;j>=0;--j)G(D.Y(g[j],"22")&&!g[j].3t.K)g[j].1d.37(g[j]);G(/^\\s/.11(d))1v.39(h.5F(d.1I(/^\\s*/)[0]),1v.1x)}d=D.2d(1v.3t)}G(d.K===0&&(!D.Y(d,"3V")&&!D.Y(d,"2A")))I;G(d[0]==12||D.Y(d,"3V")||d.15)k.1p(d);N k=D.2R(k,d)});I k},1K:H(d,f,c){G(!d||d.16==3||d.16==8)I 12;J e=!D.4n(d),40=c!==12,1f=D.14.1f;f=e&&D.3X[f]||f;G(d.2j){J g=/5Q|4d|V/.11(f);G(f=="2W"&&D.14.2k)d.1d.64;G(f 1n d&&e&&!g){G(40){G(f=="O"&&D.Y(d,"4T")&&d.1d)7p"O a3 a1\'t 9V 9U";d[f]=c}G(D.Y(d,"3V")&&d.7i(f))I d.7i(f).76;I d[f]}G(1f&&e&&f=="V")I D.1K(d.V,"9T",c);G(40)d.9Q(f,""+c);J h=1f&&e&&g?d.4G(f,2):d.4G(f);I h===U?12:h}G(1f&&f=="1y"){G(40){d.6B=1;d.1E=(d.1E||"").1o(/7f\\([^)]*\\)/,"")+(3r(c)+\'\'=="9L"?"":"7f(1y="+c*7a+")")}I d.1E&&d.1E.1h("1y=")>=0?(3d(d.1E.1I(/1y=([^)]*)/)[1])/7a)+\'\':""}f=f.1o(/-([a-z])/9H,H(a,b){I b.2r()});G(40)d[f]=c;I d[f]},3k:H(a){I(a||"").1o(/^\\s+|\\s+$/g,"")},2d:H(b){J a=[];G(b!=U){J i=b.K;G(i==U||b.1R||b.4I||b.1k)a[0]=b;N 1B(i)a[--i]=b[i]}I a},2L:H(b,a){R(J i=0,K=a.K;i<K;i++)G(a[i]===b)I i;I-1},2R:H(a,b){J i=0,T,2S=a.K;G(D.14.1f){1B(T=b[i++])G(T.16!=8)a[2S++]=T}N 1B(T=b[i++])a[2S++]=T;I a},4r:H(a){J c=[],2o={};1U{R(J i=0,K=a.K;i<K;i++){J b=D.L(a[i]);G(!2o[b]){2o[b]=M;c.1p(a[i])}}}1V(e){c=a}I c},3C:H(c,a,d){J b=[];R(J i=0,K=c.K;i<K;i++)G(!d!=!a(c[i],i))b.1p(c[i]);I b},2l:H(d,a){J c=[];R(J i=0,K=d.K;i<K;i++){J b=a(d[i],i);G(b!=U)c[c.K]=b}I c.7d.1w([],c)}});J v=9B.9A.3y();D.14={5B:(v.1I(/.+(?:9y|9x|9w|9v)[\\/: ]([\\d.]+)/)||[])[1],2k:/75/.11(v),2G:/2G/.11(v),1f:/1f/.11(v)&&!/2G/.11(v),42:/42/.11(v)&&!/(9s|75)/.11(v)};J y=D.14.1f?"7o":"72";D.1l({71:!D.14.1f||S.70=="6Z",3X:{"R":"9n","9k":"1F","4i":y,72:y,7o:y,9h:"9f",9e:"9d",9b:"99"}});D.P({6W:H(a){I a.1d},97:H(a){I D.4S(a,"1d")},95:H(a){I D.3a(a,2,"2H")},91:H(a){I D.3a(a,2,"4l")},8Z:H(a){I D.4S(a,"2H")},8X:H(a){I D.4S(a,"4l")},8W:H(a){I D.5v(a.1d.1x,a)},8V:H(a){I D.5v(a.1x)},6Q:H(a){I D.Y(a,"8U")?a.8T||a.8S.S:D.2d(a.3t)}},H(c,d){D.17[c]=H(b){J a=D.2l(7,d);G(b&&1j b=="23")a=D.3g(b,a);I 7.2I(D.4r(a))}});D.P({6P:"3v",8Q:"6F",39:"6E",8P:"5q",8O:"7b"},H(c,b){D.17[c]=H(){J a=19;I 7.P(H(){R(J i=0,K=a.K;i<K;i++)D(a[i])[b](7)})}});D.P({8N:H(a){D.1K(7,a,"");G(7.16==1)7.5l(a)},8M:H(a){D.1F.1e(7,a)},8L:H(a){D.1F.21(7,a)},8K:H(a){D.1F[D.1F.3T(7,a)?"21":"1e"](7,a)},21:H(a){G(!a||D.1E(a,[7]).r.K){D("*",7).1e(7).P(H(){D.W.21(7);D.3b(7)});G(7.1d)7.1d.37(7)}},4E:H(){D(">*",7).21();1B(7.1x)7.37(7.1x)}},H(a,b){D.17[a]=H(){I 7.P(b,19)}});D.P(["6N","4b"],H(i,c){J b=c.3y();D.17[b]=H(a){I 7[0]==1b?D.14.2G&&S.1c["5t"+c]||D.14.2k&&1b["5s"+c]||S.70=="6Z"&&S.1C["5t"+c]||S.1c["5t"+c]:7[0]==S?29.2f(29.2f(S.1c["4y"+c],S.1C["4y"+c]),29.2f(S.1c["2i"+c],S.1C["2i"+c])):a==12?(7.K?D.1g(7[0],b):U):7.1g(b,a.1q==56?a:a+"2X")}});H 25(a,b){I a[0]&&3r(D.2a(a[0],b,M),10)||0}J C=D.14.2k&&3r(D.14.5B)<8H?"(?:[\\\\w*3m-]|\\\\\\\\.)":"(?:[\\\\w\\8F-\\8E*3m-]|\\\\\\\\.)",6L=2B 4v("^>\\\\s*("+C+"+)"),6J=2B 4v("^("+C+"+)(#)("+C+"+)"),6I=2B 4v("^([#.]?)("+C+"*)");D.1l({6H:{"":H(a,i,m){I m[2]=="*"||D.Y(a,m[2])},"#":H(a,i,m){I a.4G("2v")==m[2]},":":{8D:H(a,i,m){I i<m[3]-0},8C:H(a,i,m){I i>m[3]-0},3a:H(a,i,m){I m[3]-0==i},79:H(a,i,m){I m[3]-0==i},3o:H(a,i){I i==0},3S:H(a,i,m,r){I i==r.K-1},6D:H(a,i){I i%2==0},6C:H(a,i){I i%2},"3o-4u":H(a){I a.1d.3H("*")[0]==a},"3S-4u":H(a){I D.3a(a.1d.5T,1,"4l")==a},"8z-4u":H(a){I!D.3a(a.1d.5T,2,"4l")},6W:H(a){I a.1x},4E:H(a){I!a.1x},8y:H(a,i,m){I(a.6O||a.8x||D(a).1r()||"").1h(m[3])>=0},4j:H(a){I"1G"!=a.O&&D.1g(a,"18")!="2F"&&D.1g(a,"5g")!="1G"},1G:H(a){I"1G"==a.O||D.1g(a,"18")=="2F"||D.1g(a,"5g")=="1G"},8w:H(a){I!a.3R},3R:H(a){I a.3R},4J:H(a){I a.4J},2W:H(a){I a.2W||D.1K(a,"2W")},1r:H(a){I"1r"==a.O},5O:H(a){I"5O"==a.O},5L:H(a){I"5L"==a.O},5p:H(a){I"5p"==a.O},3Q:H(a){I"3Q"==a.O},5o:H(a){I"5o"==a.O},6A:H(a){I"6A"==a.O},6z:H(a){I"6z"==a.O},2s:H(a){I"2s"==a.O||D.Y(a,"2s")},4T:H(a){I/4T|2A|6y|2s/i.11(a.Y)},3T:H(a,i,m){I D.2q(m[3],a).K},8t:H(a){I/h\\d/i.11(a.Y)},8s:H(a){I D.3C(D.3O,H(b){I a==b.T}).K}}},6x:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,2B 4v("^([:.#]*)("+C+"+)")],3g:H(a,c,b){J d,1t=[];1B(a&&a!=d){d=a;J f=D.1E(a,c,b);a=f.t.1o(/^\\s*,\\s*/,"");1t=b?c=f.r:D.2R(1t,f.r)}I 1t},2q:H(t,o){G(1j t!="23")I[t];G(o&&o.16!=1&&o.16!=9)I[];o=o||S;J d=[o],2o=[],3S,Y;1B(t&&3S!=t){J r=[];3S=t;t=D.3k(t);J l=Q,3j=6L,m=3j.2D(t);G(m){Y=m[1].2r();R(J i=0;d[i];i++)R(J c=d[i].1x;c;c=c.2H)G(c.16==1&&(Y=="*"||c.Y.2r()==Y))r.1p(c);d=r;t=t.1o(3j,"");G(t.1h(" ")==0)6M;l=M}N{3j=/^([>+~])\\s*(\\w*)/i;G((m=3j.2D(t))!=U){r=[];J k={};Y=m[2].2r();m=m[1];R(J j=0,3i=d.K;j<3i;j++){J n=m=="~"||m=="+"?d[j].2H:d[j].1x;R(;n;n=n.2H)G(n.16==1){J g=D.L(n);G(m=="~"&&k[g])1X;G(!Y||n.Y.2r()==Y){G(m=="~")k[g]=M;r.1p(n)}G(m=="+")1X}}d=r;t=D.3k(t.1o(3j,""));l=M}}G(t&&!l){G(!t.1h(",")){G(o==d[0])d.4s();2o=D.2R(2o,d);r=d=[o];t=" "+t.6v(1,t.K)}N{J h=6J;J m=h.2D(t);G(m){m=[0,m[2],m[3],m[1]]}N{h=6I;m=h.2D(t)}m[2]=m[2].1o(/\\\\/g,"");J f=d[d.K-1];G(m[1]=="#"&&f&&f.61&&!D.4n(f)){J p=f.61(m[2]);G((D.14.1f||D.14.2G)&&p&&1j p.2v=="23"&&p.2v!=m[2])p=D(\'[@2v="\'+m[2]+\'"]\',f)[0];d=r=p&&(!m[3]||D.Y(p,m[3]))?[p]:[]}N{R(J i=0;d[i];i++){J a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];G(a=="*"&&d[i].Y.3y()=="49")a="3n";r=D.2R(r,d[i].3H(a))}G(m[1]==".")r=D.5m(r,m[2]);G(m[1]=="#"){J e=[];R(J i=0;r[i];i++)G(r[i].4G("2v")==m[2]){e=[r[i]];1X}r=e}d=r}t=t.1o(h,"")}}G(t){J b=D.1E(t,r);d=r=b.r;t=D.3k(b.t)}}G(t)d=[];G(d&&o==d[0])d.4s();2o=D.2R(2o,d);I 2o},5m:H(r,m,a){m=" "+m+" ";J c=[];R(J i=0;r[i];i++){J b=(" "+r[i].1F+" ").1h(m)>=0;G(!a&&b||a&&!b)c.1p(r[i])}I c},1E:H(t,r,h){J d;1B(t&&t!=d){d=t;J p=D.6x,m;R(J i=0;p[i];i++){m=p[i].2D(t);G(m){t=t.8r(m[0].K);m[2]=m[2].1o(/\\\\/g,"");1X}}G(!m)1X;G(m[1]==":"&&m[2]=="4Y")r=62.11(m[3])?D.1E(m[3],r,M).r:D(r).4Y(m[3]);N G(m[1]==".")r=D.5m(r,m[2],h);N G(m[1]=="["){J g=[],O=m[3];R(J i=0,3i=r.K;i<3i;i++){J a=r[i],z=a[D.3X[m[2]]||m[2]];G(z==U||/5Q|4d|2W/.11(m[2]))z=D.1K(a,m[2])||\'\';G((O==""&&!!z||O=="="&&z==m[5]||O=="!="&&z!=m[5]||O=="^="&&z&&!z.1h(m[5])||O=="$="&&z.6v(z.K-m[5].K)==m[5]||(O=="*="||O=="~=")&&z.1h(m[5])>=0)^h)g.1p(a)}r=g}N G(m[1]==":"&&m[2]=="3a-4u"){J e={},g=[],11=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2D(m[3]=="6D"&&"2n"||m[3]=="6C"&&"2n+1"||!/\\D/.11(m[3])&&"8q+"+m[3]||m[3]),3o=(11[1]+(11[2]||1))-0,d=11[3]-0;R(J i=0,3i=r.K;i<3i;i++){J j=r[i],1d=j.1d,2v=D.L(1d);G(!e[2v]){J c=1;R(J n=1d.1x;n;n=n.2H)G(n.16==1)n.4q=c++;e[2v]=M}J b=Q;G(3o==0){G(j.4q==d)b=M}N G((j.4q-d)%3o==0&&(j.4q-d)/3o>=0)b=M;G(b^h)g.1p(j)}r=g}N{J f=D.6H[m[1]];G(1j f=="49")f=f[m[2]];G(1j f=="23")f=6u("Q||H(a,i){I "+f+";}");r=D.3C(r,H(a,i){I f(a,i,m,r)},h)}}I{r:r,t:t}},4S:H(b,c){J a=[],1t=b[c];1B(1t&&1t!=S){G(1t.16==1)a.1p(1t);1t=1t[c]}I a},3a:H(a,e,c,b){e=e||1;J d=0;R(;a;a=a[c])G(a.16==1&&++d==e)1X;I a},5v:H(n,a){J r=[];R(;n;n=n.2H){G(n.16==1&&n!=a)r.1p(n)}I r}});D.W={1e:H(f,i,g,e){G(f.16==3||f.16==8)I;G(D.14.1f&&f.4I)f=1b;G(!g.24)g.24=7.24++;G(e!=12){J h=g;g=7.3M(h,H(){I h.1w(7,19)});g.L=e}J j=D.L(f,"3w")||D.L(f,"3w",{}),1H=D.L(f,"1H")||D.L(f,"1H",H(){G(1j D!="12"&&!D.W.5k)I D.W.1H.1w(19.3L.T,19)});1H.T=f;D.P(i.1R(/\\s+/),H(c,b){J a=b.1R(".");b=a[0];g.O=a[1];J d=j[b];G(!d){d=j[b]={};G(!D.W.2t[b]||D.W.2t[b].4p.1k(f)===Q){G(f.3K)f.3K(b,1H,Q);N G(f.6t)f.6t("4o"+b,1H)}}d[g.24]=g;D.W.26[b]=M});f=U},24:1,26:{},21:H(e,h,f){G(e.16==3||e.16==8)I;J i=D.L(e,"3w"),1L,5i;G(i){G(h==12||(1j h=="23"&&h.8p(0)=="."))R(J g 1n i)7.21(e,g+(h||""));N{G(h.O){f=h.2y;h=h.O}D.P(h.1R(/\\s+/),H(b,a){J c=a.1R(".");a=c[0];G(i[a]){G(f)2U i[a][f.24];N R(f 1n i[a])G(!c[1]||i[a][f].O==c[1])2U i[a][f];R(1L 1n i[a])1X;G(!1L){G(!D.W.2t[a]||D.W.2t[a].4A.1k(e)===Q){G(e.6p)e.6p(a,D.L(e,"1H"),Q);N G(e.6n)e.6n("4o"+a,D.L(e,"1H"))}1L=U;2U i[a]}}})}R(1L 1n i)1X;G(!1L){J d=D.L(e,"1H");G(d)d.T=U;D.3b(e,"3w");D.3b(e,"1H")}}},1P:H(h,c,f,g,i){c=D.2d(c);G(h.1h("!")>=0){h=h.3s(0,-1);J a=M}G(!f){G(7.26[h])D("*").1e([1b,S]).1P(h,c)}N{G(f.16==3||f.16==8)I 12;J b,1L,17=D.1D(f[h]||U),W=!c[0]||!c[0].32;G(W){c.6h({O:h,2J:f,32:H(){},3J:H(){},4C:1z()});c[0][E]=M}c[0].O=h;G(a)c[0].6m=M;J d=D.L(f,"1H");G(d)b=d.1w(f,c);G((!17||(D.Y(f,\'a\')&&h=="4V"))&&f["4o"+h]&&f["4o"+h].1w(f,c)===Q)b=Q;G(W)c.4s();G(i&&D.1D(i)){1L=i.1w(f,b==U?c:c.7d(b));G(1L!==12)b=1L}G(17&&g!==Q&&b!==Q&&!(D.Y(f,\'a\')&&h=="4V")){7.5k=M;1U{f[h]()}1V(e){}}7.5k=Q}I b},1H:H(b){J a,1L,38,5f,4m;b=19[0]=D.W.6l(b||1b.W);38=b.O.1R(".");b.O=38[0];38=38[1];5f=!38&&!b.6m;4m=(D.L(7,"3w")||{})[b.O];R(J j 1n 4m){J c=4m[j];G(5f||c.O==38){b.2y=c;b.L=c.L;1L=c.1w(7,19);G(a!==Q)a=1L;G(1L===Q){b.32();b.3J()}}}I a},6l:H(b){G(b[E]==M)I b;J d=b;b={8o:d};J c="8n 8m 8l 8k 2s 8j 47 5d 6j 5E 8i L 8h 8g 4K 2y 5a 59 8e 8b 58 6f 8a 88 4k 87 86 84 6d 2J 4C 6c O 82 81 35".1R(" ");R(J i=c.K;i;i--)b[c[i]]=d[c[i]];b[E]=M;b.32=H(){G(d.32)d.32();d.80=Q};b.3J=H(){G(d.3J)d.3J();d.7Z=M};b.4C=b.4C||1z();G(!b.2J)b.2J=b.6d||S;G(b.2J.16==3)b.2J=b.2J.1d;G(!b.4k&&b.4K)b.4k=b.4K==b.2J?b.6c:b.4K;G(b.58==U&&b.5d!=U){J a=S.1C,1c=S.1c;b.58=b.5d+(a&&a.2e||1c&&1c.2e||0)-(a.6b||0);b.6f=b.6j+(a&&a.2c||1c&&1c.2c||0)-(a.6a||0)}G(!b.35&&((b.47||b.47===0)?b.47:b.5a))b.35=b.47||b.5a;G(!b.59&&b.5E)b.59=b.5E;G(!b.35&&b.2s)b.35=(b.2s&1?1:(b.2s&2?3:(b.2s&4?2:0)));I b},3M:H(a,b){b.24=a.24=a.24||b.24||7.24++;I b},2t:{27:{4p:H(){55();I},4A:H(){I}},3D:{4p:H(){G(D.14.1f)I Q;D(7).2O("53",D.W.2t.3D.2y);I M},4A:H(){G(D.14.1f)I Q;D(7).4e("53",D.W.2t.3D.2y);I M},2y:H(a){G(F(a,7))I M;a.O="3D";I D.W.1H.1w(7,19)}},3N:{4p:H(){G(D.14.1f)I Q;D(7).2O("51",D.W.2t.3N.2y);I M},4A:H(){G(D.14.1f)I Q;D(7).4e("51",D.W.2t.3N.2y);I M},2y:H(a){G(F(a,7))I M;a.O="3N";I D.W.1H.1w(7,19)}}}};D.17.1l({2O:H(c,a,b){I c=="4X"?7.2V(c,a,b):7.P(H(){D.W.1e(7,c,b||a,b&&a)})},2V:H(d,b,c){J e=D.W.3M(c||b,H(a){D(7).4e(a,e);I(c||b).1w(7,19)});I 7.P(H(){D.W.1e(7,d,e,c&&b)})},4e:H(a,b){I 7.P(H(){D.W.21(7,a,b)})},1P:H(c,a,b){I 7.P(H(){D.W.1P(c,a,7,M,b)})},5C:H(c,a,b){I 7[0]&&D.W.1P(c,a,7[0],Q,b)},2m:H(b){J c=19,i=1;1B(i<c.K)D.W.3M(b,c[i++]);I 7.4V(D.W.3M(b,H(a){7.4Z=(7.4Z||0)%i;a.32();I c[7.4Z++].1w(7,19)||Q}))},7X:H(a,b){I 7.2O(\'3D\',a).2O(\'3N\',b)},27:H(a){55();G(D.2Q)a.1k(S,D);N D.3A.1p(H(){I a.1k(7,D)});I 7}});D.1l({2Q:Q,3A:[],27:H(){G(!D.2Q){D.2Q=M;G(D.3A){D.P(D.3A,H(){7.1k(S)});D.3A=U}D(S).5C("27")}}});J x=Q;H 55(){G(x)I;x=M;G(S.3K&&!D.14.2G)S.3K("69",D.27,Q);G(D.14.1f&&1b==1S)(H(){G(D.2Q)I;1U{S.1C.7V("1A")}1V(3e){3B(19.3L,0);I}D.27()})();G(D.14.2G)S.3K("69",H(){G(D.2Q)I;R(J i=0;i<S.4W.K;i++)G(S.4W[i].3R){3B(19.3L,0);I}D.27()},Q);G(D.14.2k){J a;(H(){G(D.2Q)I;G(S.3f!="68"&&S.3f!="1J"){3B(19.3L,0);I}G(a===12)a=D("V, 7A[7U=7S]").K;G(S.4W.K!=a){3B(19.3L,0);I}D.27()})()}D.W.1e(1b,"43",D.27)}D.P(("7R,7Q,43,85,4y,4X,4V,7P,"+"7O,7N,89,53,51,7M,2A,"+"5o,7L,7K,8d,3e").1R(","),H(i,b){D.17[b]=H(a){I a?7.2O(b,a):7.1P(b)}});J F=H(a,c){J b=a.4k;1B(b&&b!=c)1U{b=b.1d}1V(3e){b=c}I b==c};D(1b).2O("4X",H(){D("*").1e(S).4e()});D.17.1l({67:D.17.43,43:H(g,d,c){G(1j g!=\'23\')I 7.67(g);J e=g.1h(" ");G(e>=0){J i=g.3s(e,g.K);g=g.3s(0,e)}c=c||H(){};J f="2P";G(d)G(D.1D(d)){c=d;d=U}N{d=D.3n(d);f="6g"}J h=7;D.3Y({1a:g,O:f,1O:"2K",L:d,1J:H(a,b){G(b=="1W"||b=="7J")h.2K(i?D("<1v/>").3v(a.4U.1o(/<1m(.|\\s)*?\\/1m>/g,"")).2q(i):a.4U);h.P(c,[a.4U,b,a])}});I 7},aL:H(){I D.3n(7.7I())},7I:H(){I 7.2l(H(){I D.Y(7,"3V")?D.2d(7.aH):7}).1E(H(){I 7.34&&!7.3R&&(7.4J||/2A|6y/i.11(7.Y)||/1r|1G|3Q/i.11(7.O))}).2l(H(i,c){J b=D(7).6e();I b==U?U:b.1q==2p?D.2l(b,H(a,i){I{34:c.34,2x:a}}):{34:c.34,2x:b}}).3p()}});D.P("7H,7G,7F,7D,7C,7B".1R(","),H(i,o){D.17[o]=H(f){I 7.2O(o,f)}});J B=1z();D.1l({3p:H(d,b,a,c){G(D.1D(b)){a=b;b=U}I D.3Y({O:"2P",1a:d,L:b,1W:a,1O:c})},aE:H(b,a){I D.3p(b,U,a,"1m")},aD:H(c,b,a){I D.3p(c,b,a,"3z")},aC:H(d,b,a,c){G(D.1D(b)){a=b;b={}}I D.3Y({O:"6g",1a:d,L:b,1W:a,1O:c})},aA:H(a){D.1l(D.60,a)},60:{1a:5Z.5Q,26:M,O:"2P",2T:0,7z:"4R/x-ax-3V-aw",7x:M,31:M,L:U,5Y:U,3Q:U,4Q:{2N:"4R/2N, 1r/2N",2K:"1r/2K",1m:"1r/4t, 4R/4t",3z:"4R/3z, 1r/4t",1r:"1r/as",4w:"*/*"}},4z:{},3Y:H(s){s=D.1l(M,s,D.1l(M,{},D.60,s));J g,2Z=/=\\?(&|$)/g,1u,L,O=s.O.2r();G(s.L&&s.7x&&1j s.L!="23")s.L=D.3n(s.L);G(s.1O=="4P"){G(O=="2P"){G(!s.1a.1I(2Z))s.1a+=(s.1a.1I(/\\?/)?"&":"?")+(s.4P||"7u")+"=?"}N G(!s.L||!s.L.1I(2Z))s.L=(s.L?s.L+"&":"")+(s.4P||"7u")+"=?";s.1O="3z"}G(s.1O=="3z"&&(s.L&&s.L.1I(2Z)||s.1a.1I(2Z))){g="4P"+B++;G(s.L)s.L=(s.L+"").1o(2Z,"="+g+"$1");s.1a=s.1a.1o(2Z,"="+g+"$1");s.1O="1m";1b[g]=H(a){L=a;1W();1J();1b[g]=12;1U{2U 1b[g]}1V(e){}G(i)i.37(h)}}G(s.1O=="1m"&&s.1Y==U)s.1Y=Q;G(s.1Y===Q&&O=="2P"){J j=1z();J k=s.1a.1o(/(\\?|&)3m=.*?(&|$)/,"$ap="+j+"$2");s.1a=k+((k==s.1a)?(s.1a.1I(/\\?/)?"&":"?")+"3m="+j:"")}G(s.L&&O=="2P"){s.1a+=(s.1a.1I(/\\?/)?"&":"?")+s.L;s.L=U}G(s.26&&!D.4O++)D.W.1P("7H");J n=/^(?:\\w+:)?\\/\\/([^\\/?#]+)/;G(s.1O=="1m"&&O=="2P"&&n.11(s.1a)&&n.2D(s.1a)[1]!=5Z.al){J i=S.3H("6w")[0];J h=S.3h("1m");h.4d=s.1a;G(s.7t)h.aj=s.7t;G(!g){J l=Q;h.ah=h.ag=H(){G(!l&&(!7.3f||7.3f=="68"||7.3f=="1J")){l=M;1W();1J();i.37(h)}}}i.3U(h);I 12}J m=Q;J c=1b.7s?2B 7s("ae.ac"):2B 7r();G(s.5Y)c.6R(O,s.1a,s.31,s.5Y,s.3Q);N c.6R(O,s.1a,s.31);1U{G(s.L)c.4B("ab-aa",s.7z);G(s.5S)c.4B("a9-5R-a8",D.4z[s.1a]||"a7, a6 a5 a4 5N:5N:5N a2");c.4B("X-9Z-9Y","7r");c.4B("9W",s.1O&&s.4Q[s.1O]?s.4Q[s.1O]+", */*":s.4Q.4w)}1V(e){}G(s.7m&&s.7m(c,s)===Q){s.26&&D.4O--;c.7l();I Q}G(s.26)D.W.1P("7B",[c,s]);J d=H(a){G(!m&&c&&(c.3f==4||a=="2T")){m=M;G(f){7k(f);f=U}1u=a=="2T"&&"2T"||!D.7j(c)&&"3e"||s.5S&&D.7h(c,s.1a)&&"7J"||"1W";G(1u=="1W"){1U{L=D.6X(c,s.1O,s.9S)}1V(e){1u="5J"}}G(1u=="1W"){J b;1U{b=c.5I("7g-5R")}1V(e){}G(s.5S&&b)D.4z[s.1a]=b;G(!g)1W()}N D.5H(s,c,1u);1J();G(s.31)c=U}};G(s.31){J f=4I(d,13);G(s.2T>0)3B(H(){G(c){c.7l();G(!m)d("2T")}},s.2T)}1U{c.9P(s.L)}1V(e){D.5H(s,c,U,e)}G(!s.31)d();H 1W(){G(s.1W)s.1W(L,1u);G(s.26)D.W.1P("7C",[c,s])}H 1J(){G(s.1J)s.1J(c,1u);G(s.26)D.W.1P("7F",[c,s]);G(s.26&&!--D.4O)D.W.1P("7G")}I c},5H:H(s,a,b,e){G(s.3e)s.3e(a,b,e);G(s.26)D.W.1P("7D",[a,s,e])},4O:0,7j:H(a){1U{I!a.1u&&5Z.9O=="5p:"||(a.1u>=7e&&a.1u<9N)||a.1u==7c||a.1u==9K||D.14.2k&&a.1u==12}1V(e){}I Q},7h:H(a,c){1U{J b=a.5I("7g-5R");I a.1u==7c||b==D.4z[c]||D.14.2k&&a.1u==12}1V(e){}I Q},6X:H(a,c,b){J d=a.5I("9J-O"),2N=c=="2N"||!c&&d&&d.1h("2N")>=0,L=2N?a.9I:a.4U;G(2N&&L.1C.2j=="5J")7p"5J";G(b)L=b(L,c);G(c=="1m")D.5u(L);G(c=="3z")L=6u("("+L+")");I L},3n:H(a){J s=[];G(a.1q==2p||a.5w)D.P(a,H(){s.1p(3u(7.34)+"="+3u(7.2x))});N R(J j 1n a)G(a[j]&&a[j].1q==2p)D.P(a[j],H(){s.1p(3u(j)+"="+3u(7))});N s.1p(3u(j)+"="+3u(D.1D(a[j])?a[j]():a[j]));I s.6s("&").1o(/%20/g,"+")}});D.17.1l({1N:H(c,b){I c?7.2g({1Z:"1N",2h:"1N",1y:"1N"},c,b):7.1E(":1G").P(H(){7.V.18=7.5D||"";G(D.1g(7,"18")=="2F"){J a=D("<"+7.2j+" />").6P("1c");7.V.18=a.1g("18");G(7.V.18=="2F")7.V.18="3I";a.21()}}).3l()},1M:H(b,a){I b?7.2g({1Z:"1M",2h:"1M",1y:"1M"},b,a):7.1E(":4j").P(H(){7.5D=7.5D||D.1g(7,"18");7.V.18="2F"}).3l()},78:D.17.2m,2m:H(a,b){I D.1D(a)&&D.1D(b)?7.78.1w(7,19):a?7.2g({1Z:"2m",2h:"2m",1y:"2m"},a,b):7.P(H(){D(7)[D(7).3F(":1G")?"1N":"1M"]()})},9G:H(b,a){I 7.2g({1Z:"1N"},b,a)},9F:H(b,a){I 7.2g({1Z:"1M"},b,a)},9E:H(b,a){I 7.2g({1Z:"2m"},b,a)},9D:H(b,a){I 7.2g({1y:"1N"},b,a)},9M:H(b,a){I 7.2g({1y:"1M"},b,a)},9C:H(c,a,b){I 7.2g({1y:a},c,b)},2g:H(k,j,i,g){J h=D.77(j,i,g);I 7[h.36===Q?"P":"36"](H(){G(7.16!=1)I Q;J f=D.1l({},h),p,1G=D(7).3F(":1G"),46=7;R(p 1n k){G(k[p]=="1M"&&1G||k[p]=="1N"&&!1G)I f.1J.1k(7);G(p=="1Z"||p=="2h"){f.18=D.1g(7,"18");f.33=7.V.33}}G(f.33!=U)7.V.33="1G";f.45=D.1l({},k);D.P(k,H(c,a){J e=2B D.28(46,f,c);G(/2m|1N|1M/.11(a))e[a=="2m"?1G?"1N":"1M":a](k);N{J b=a.6r().1I(/^([+-]=)?([\\d+-.]+)(.*)$/),2b=e.1t(M)||0;G(b){J d=3d(b[2]),2M=b[3]||"2X";G(2M!="2X"){46.V[c]=(d||1)+2M;2b=((d||1)/e.1t(M))*2b;46.V[c]=2b+2M}G(b[1])d=((b[1]=="-="?-1:1)*d)+2b;e.3G(2b,d,2M)}N e.3G(2b,a,"")}});I M})},36:H(a,b){G(D.1D(a)||(a&&a.1q==2p)){b=a;a="28"}G(!a||(1j a=="23"&&!b))I A(7[0],a);I 7.P(H(){G(b.1q==2p)A(7,a,b);N{A(7,a).1p(b);G(A(7,a).K==1)b.1k(7)}})},9X:H(b,c){J a=D.3O;G(b)7.36([]);7.P(H(){R(J i=a.K-1;i>=0;i--)G(a[i].T==7){G(c)a[i](M);a.7n(i,1)}});G(!c)7.5A();I 7}});J A=H(b,c,a){G(b){c=c||"28";J q=D.L(b,c+"36");G(!q||a)q=D.L(b,c+"36",D.2d(a))}I q};D.17.5A=H(a){a=a||"28";I 7.P(H(){J q=A(7,a);q.4s();G(q.K)q[0].1k(7)})};D.1l({77:H(b,a,c){J d=b&&b.1q==a0?b:{1J:c||!c&&a||D.1D(b)&&b,2u:b,41:c&&a||a&&a.1q!=9t&&a};d.2u=(d.2u&&d.2u.1q==4L?d.2u:D.28.5K[d.2u])||D.28.5K.74;d.5M=d.1J;d.1J=H(){G(d.36!==Q)D(7).5A();G(D.1D(d.5M))d.5M.1k(7)};I d},41:{73:H(p,n,b,a){I b+a*p},5P:H(p,n,b,a){I((-29.9r(p*29.9q)/2)+0.5)*a+b}},3O:[],48:U,28:H(b,c,a){7.15=c;7.T=b;7.1i=a;G(!c.3Z)c.3Z={}}});D.28.44={4D:H(){G(7.15.2Y)7.15.2Y.1k(7.T,7.1z,7);(D.28.2Y[7.1i]||D.28.2Y.4w)(7);G(7.1i=="1Z"||7.1i=="2h")7.T.V.18="3I"},1t:H(a){G(7.T[7.1i]!=U&&7.T.V[7.1i]==U)I 7.T[7.1i];J r=3d(D.1g(7.T,7.1i,a));I r&&r>-9p?r:3d(D.2a(7.T,7.1i))||0},3G:H(c,b,d){7.5V=1z();7.2b=c;7.3l=b;7.2M=d||7.2M||"2X";7.1z=7.2b;7.2S=7.4N=0;7.4D();J e=7;H t(a){I e.2Y(a)}t.T=7.T;D.3O.1p(t);G(D.48==U){D.48=4I(H(){J a=D.3O;R(J i=0;i<a.K;i++)G(!a[i]())a.7n(i--,1);G(!a.K){7k(D.48);D.48=U}},13)}},1N:H(){7.15.3Z[7.1i]=D.1K(7.T.V,7.1i);7.15.1N=M;7.3G(0,7.1t());G(7.1i=="2h"||7.1i=="1Z")7.T.V[7.1i]="9m";D(7.T).1N()},1M:H(){7.15.3Z[7.1i]=D.1K(7.T.V,7.1i);7.15.1M=M;7.3G(7.1t(),0)},2Y:H(a){J t=1z();G(a||t>7.15.2u+7.5V){7.1z=7.3l;7.2S=7.4N=1;7.4D();7.15.45[7.1i]=M;J b=M;R(J i 1n 7.15.45)G(7.15.45[i]!==M)b=Q;G(b){G(7.15.18!=U){7.T.V.33=7.15.33;7.T.V.18=7.15.18;G(D.1g(7.T,"18")=="2F")7.T.V.18="3I"}G(7.15.1M)7.T.V.18="2F";G(7.15.1M||7.15.1N)R(J p 1n 7.15.45)D.1K(7.T.V,p,7.15.3Z[p])}G(b)7.15.1J.1k(7.T);I Q}N{J n=t-7.5V;7.4N=n/7.15.2u;7.2S=D.41[7.15.41||(D.41.5P?"5P":"73")](7.4N,n,0,1,7.15.2u);7.1z=7.2b+((7.3l-7.2b)*7.2S);7.4D()}I M}};D.1l(D.28,{5K:{9l:9j,9i:7e,74:9g},2Y:{2e:H(a){a.T.2e=a.1z},2c:H(a){a.T.2c=a.1z},1y:H(a){D.1K(a.T.V,"1y",a.1z)},4w:H(a){a.T.V[a.1i]=a.1z+a.2M}}});D.17.2i=H(){J b=0,1S=0,T=7[0],3q;G(T)ao(D.14){J d=T.1d,4a=T,1s=T.1s,1Q=T.2z,5U=2k&&3r(5B)<9c&&!/9a/i.11(v),1g=D.2a,3c=1g(T,"30")=="3c";G(T.7y){J c=T.7y();1e(c.1A+29.2f(1Q.1C.2e,1Q.1c.2e),c.1S+29.2f(1Q.1C.2c,1Q.1c.2c));1e(-1Q.1C.6b,-1Q.1C.6a)}N{1e(T.5X,T.5W);1B(1s){1e(1s.5X,1s.5W);G(42&&!/^t(98|d|h)$/i.11(1s.2j)||2k&&!5U)2C(1s);G(!3c&&1g(1s,"30")=="3c")3c=M;4a=/^1c$/i.11(1s.2j)?4a:1s;1s=1s.1s}1B(d&&d.2j&&!/^1c|2K$/i.11(d.2j)){G(!/^96|1T.*$/i.11(1g(d,"18")))1e(-d.2e,-d.2c);G(42&&1g(d,"33")!="4j")2C(d);d=d.1d}G((5U&&(3c||1g(4a,"30")=="5x"))||(42&&1g(4a,"30")!="5x"))1e(-1Q.1c.5X,-1Q.1c.5W);G(3c)1e(29.2f(1Q.1C.2e,1Q.1c.2e),29.2f(1Q.1C.2c,1Q.1c.2c))}3q={1S:1S,1A:b}}H 2C(a){1e(D.2a(a,"6V",M),D.2a(a,"6U",M))}H 1e(l,t){b+=3r(l,10)||0;1S+=3r(t,10)||0}I 3q};D.17.1l({30:H(){J a=0,1S=0,3q;G(7[0]){J b=7.1s(),2i=7.2i(),4c=/^1c|2K$/i.11(b[0].2j)?{1S:0,1A:0}:b.2i();2i.1S-=25(7,\'94\');2i.1A-=25(7,\'aF\');4c.1S+=25(b,\'6U\');4c.1A+=25(b,\'6V\');3q={1S:2i.1S-4c.1S,1A:2i.1A-4c.1A}}I 3q},1s:H(){J a=7[0].1s;1B(a&&(!/^1c|2K$/i.11(a.2j)&&D.1g(a,\'30\')==\'93\'))a=a.1s;I D(a)}});D.P([\'5e\',\'5G\'],H(i,b){J c=\'4y\'+b;D.17[c]=H(a){G(!7[0])I;I a!=12?7.P(H(){7==1b||7==S?1b.92(!i?a:D(1b).2e(),i?a:D(1b).2c()):7[c]=a}):7[0]==1b||7[0]==S?46[i?\'aI\':\'aJ\']||D.71&&S.1C[c]||S.1c[c]:7[0][c]}});D.P(["6N","4b"],H(i,b){J c=i?"5e":"5G",4f=i?"6k":"6i";D.17["5s"+b]=H(){I 7[b.3y()]()+25(7,"57"+c)+25(7,"57"+4f)};D.17["90"+b]=H(a){I 7["5s"+b]()+25(7,"2C"+c+"4b")+25(7,"2C"+4f+"4b")+(a?25(7,"6S"+c)+25(7,"6S"+4f):0)}})})();',62,669,'|||||||this|||||||||||||||||||||||||||||||||||if|function|return|var|length|data|true|else|type|each|false|for|document|elem|null|style|event||nodeName|||test|undefined||browser|options|nodeType|fn|display|arguments|url|window|body|parentNode|add|msie|css|indexOf|prop|typeof|call|extend|script|in|replace|push|constructor|text|offsetParent|cur|status|div|apply|firstChild|opacity|now|left|while|documentElement|isFunction|filter|className|hidden|handle|match|complete|attr|ret|hide|show|dataType|trigger|doc|split|top|table|try|catch|success|break|cache|height||remove|tbody|string|guid|num|global|ready|fx|Math|curCSS|start|scrollTop|makeArray|scrollLeft|max|animate|width|offset|tagName|safari|map|toggle||done|Array|find|toUpperCase|button|special|duration|id|copy|value|handler|ownerDocument|select|new|border|exec|stack|none|opera|nextSibling|pushStack|target|html|inArray|unit|xml|bind|GET|isReady|merge|pos|timeout|delete|one|selected|px|step|jsre|position|async|preventDefault|overflow|name|which|queue|removeChild|namespace|insertBefore|nth|removeData|fixed|parseFloat|error|readyState|multiFilter|createElement|rl|re|trim|end|_|param|first|get|results|parseInt|slice|childNodes|encodeURIComponent|append|events|elems|toLowerCase|json|readyList|setTimeout|grep|mouseenter|color|is|custom|getElementsByTagName|block|stopPropagation|addEventListener|callee|proxy|mouseleave|timers|defaultView|password|disabled|last|has|appendChild|form|domManip|props|ajax|orig|set|easing|mozilla|load|prototype|curAnim|self|charCode|timerId|object|offsetChild|Width|parentOffset|src|unbind|br|currentStyle|clean|float|visible|relatedTarget|previousSibling|handlers|isXMLDoc|on|setup|nodeIndex|unique|shift|javascript|child|RegExp|_default|deep|scroll|lastModified|teardown|setRequestHeader|timeStamp|update|empty|tr|getAttribute|innerHTML|setInterval|checked|fromElement|Number|jQuery|state|active|jsonp|accepts|application|dir|input|responseText|click|styleSheets|unload|not|lastToggle|outline|mouseout|getPropertyValue|mouseover|getComputedStyle|bindReady|String|padding|pageX|metaKey|keyCode|getWH|andSelf|clientX|Left|all|visibility|container|index|init|triggered|removeAttribute|classFilter|prevObject|submit|file|after|windowData|inner|client|globalEval|sibling|jquery|absolute|clone|wrapAll|dequeue|version|triggerHandler|oldblock|ctrlKey|createTextNode|Top|handleError|getResponseHeader|parsererror|speeds|checkbox|old|00|radio|swing|href|Modified|ifModified|lastChild|safari2|startTime|offsetTop|offsetLeft|username|location|ajaxSettings|getElementById|isSimple|values|selectedIndex|runtimeStyle|rsLeft|_load|loaded|DOMContentLoaded|clientTop|clientLeft|toElement|srcElement|val|pageY|POST|unshift|Bottom|clientY|Right|fix|exclusive|detachEvent|cloneNode|removeEventListener|swap|toString|join|attachEvent|eval|substr|head|parse|textarea|reset|image|zoom|odd|even|before|prepend|exclude|expr|quickClass|quickID|uuid|quickChild|continue|Height|textContent|appendTo|contents|open|margin|evalScript|borderTopWidth|borderLeftWidth|parent|httpData|setArray|CSS1Compat|compatMode|boxModel|cssFloat|linear|def|webkit|nodeValue|speed|_toggle|eq|100|replaceWith|304|concat|200|alpha|Last|httpNotModified|getAttributeNode|httpSuccess|clearInterval|abort|beforeSend|splice|styleFloat|throw|colgroup|XMLHttpRequest|ActiveXObject|scriptCharset|callback|fieldset|multiple|processData|getBoundingClientRect|contentType|link|ajaxSend|ajaxSuccess|ajaxError|col|ajaxComplete|ajaxStop|ajaxStart|serializeArray|notmodified|keypress|keydown|change|mouseup|mousedown|dblclick|focus|blur|stylesheet|hasClass|rel|doScroll|black|hover|solid|cancelBubble|returnValue|wheelDelta|view|round|shiftKey|resize|screenY|screenX|relatedNode|mousemove|prevValue|originalTarget|offsetHeight|keyup|newValue|offsetWidth|eventPhase|detail|currentTarget|cancelable|bubbles|attrName|attrChange|altKey|originalEvent|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|font|gt|lt|uFFFF|u0128|size|417|Boolean|Date|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|wrap|contentWindow|contentDocument|iframe|children|siblings|prevAll|wrapInner|nextAll|outer|prev|scrollTo|static|marginTop|next|inline|parents|able|cellSpacing|adobeair|cellspacing|522|maxLength|maxlength|readOnly|400|readonly|fast|600|class|slow|1px|htmlFor|reverse|10000|PI|cos|compatible|Function|setData|ie|ra|it|rv|getData|userAgent|navigator|fadeTo|fadeIn|slideToggle|slideUp|slideDown|ig|responseXML|content|1223|NaN|fadeOut|300|protocol|send|setAttribute|option|dataFilter|cssText|changed|be|Accept|stop|With|Requested|Object|can|GMT|property|1970|Jan|01|Thu|Since|If|Type|Content|XMLHTTP|th|Microsoft|td|onreadystatechange|onload|cap|charset|colg|host|tfoot|specified|with|1_|thead|leg|plain|attributes|opt|embed|urlencoded|www|area|hr|ajaxSetup|meta|post|getJSON|getScript|marginLeft|img|elements|pageYOffset|pageXOffset|abbr|serialize|pixelLeft'.split('|'),0,{}));
var mod_passport_im_loader = 
{
	params: {
		user_id: 0,
		obj: 0,
		type: 0,
		title: 0,
		url: 0,
		reload: 0
	},
	
	stack: null,
	size: 0,
	tags : {
		B: 0,
		I: 0,
		U: 0,
		S: 0,
		QUOTE: 0,
		SMALL: 0,
		URL: 0,
		EMAIL: 0,
		LIST: 0,
		CENTER: 0,
		LEFT: 0,
		RIGHT: 0,
		JUSTIFY: 0,
		MEDIA: 0
	},

	push: function(val)
	{
		if(this.stack == null)
			this.stack = new Array(1000);
		this.stack[this.size++] = val;
	},

	pop: function()
	{
		if(this.stack == null)
			this.stack = new Array(1000);
		return this.stack[--this.size];
	},

	insertsmile: function(val)
	{
		this.showsmiles(false);
		this.appendEditor(val);
		this.focusEditor();
	},

	inserttag: function(tag)
	{
	    if(tag=='URL')
	        return this.inserturl();
	    if(tag=='EMAIL')
	        return this.insertemail();
	    if(tag=='MEDIA')
	        return this.insertmedia();
		if(tag=='QUOTE')
			return this.quote();
		ta = $('#im_form_text').get(0);
		var cltag = '';
		if(tag == 'B' || tag == 'I' || tag == 'U' || tag == 'S' || tag == 'QUOTE' ||
		    tag == 'SMALL' || tag == 'URL' || tag == 'EMAIL' || tag == 'LIST' || tag == 'CENTER' ||
		    tag == 'LEFT' || tag == 'RIGHT' || tag == 'JUSTIFY')
			cltag = '/'+tag;
		var single = true;
		if (document.selection && document.selection.createRange)
		{
			ta.focus();
			sel1 = ta.value.substr(0, ta.selectionStart);

			var sel = document.selection;
			var text = '';
			var rng = sel.createRange();

			rng.colapse;

			if ( (sel.type == "Text" || sel.type == "None") && rng != null )
			{			
				if ( cltag != "" && rng.text.length > 0)
				{
					text = '['+tag+']' + rng.text + '[/'+tag+']';
					single = false;
				}
					
				rng.text = text;
			}
		}
		if(single == true)
		{
			if(this.tags[tag] == 0)
			{
				this.appendEditor('['+tag+']');
				this.push(tag);
				this.tags[tag] = 1;
			}
			else
			{
				var tag2;
				do
				{
					tag2 = this.pop();
					this.appendEditor('[/'+tag2+']');
					this.tags[tag2] = 0;
				}while(tag2 != tag);
			}
		}
		this.focusEditor();
	},

	quote: function()
	{
		txt = '';
		if (document.getSelection) { txt = document.getSelection(); } else if (document.selection) { txt = document.selection.createRange().text; }
		if ( txt ) txt='[QUOTE]'+txt+'[/QUOTE]\n';
		this.appendEditor(txt);
		this.focusSubmit();
		this.focusEditor();
	},

	appendEditor: function(val)
	{
		$('#im_form_text').get(0).value = $('#im_form_text').get(0).value + val;
	},
	focusEditor: function()
	{
		$('#im_form_text').focus();
	},

	inserturl: function()
	{
	    var url = window.prompt('Введите адрес сайта', '');
	    if(url == '' || url == null)
	        return;
	        
	    var inserted = false;
	    
		ta = $('#im_form_text').get(0);
	    
	    if (document.selection && document.selection.createRange)
		{
			ta.focus();
			sel1 = ta.value.substr(0, ta.selectionStart);

			var sel = document.selection;
			var text = '';
			var rng = sel.createRange();

			rng.colapse;

			if ( (sel.type == "Text" || sel.type == "None") && rng != null )
			{			
				if (rng.text.length > 0)
				{
		            inserted = true;
					text = rng.text;
					rng.text = '[URL='+url+']'+text+'[/URL]';
				}
			}
		}
		if(inserted == false)
		{
	        text = window.prompt('Введите текст ссылки', '');
	        if(text == '' || text == null)
	            text = url;
	        this.appendEditor('[URL='+url+']'+text+'[/URL]');
	    }    
	},

	insertemail: function()
	{
	    var url = window.prompt('Введите адрес электронного почтового ящика', '');
	    if(url == '' || url == null)
	        return;
	    
	    var inserted = false;
	    
		ta = $('#im_form_text').get(0);
	    
	    if (document.selection && document.selection.createRange)
		{
			ta.focus();
			sel1 = ta.value.substr(0, ta.selectionStart);

			var sel = document.selection;
			var text = '';
			var rng = sel.createRange();

			rng.colapse;

			if ( (sel.type == "Text" || sel.type == "None") && rng != null )
			{
				if (rng.text.length > 0)
				{
				    inserted = true;
					text = rng.text;
				    rng.text = '[EMAIL='+url+']'+text+'[/EMAIL]';
				}
			}
		}
		if(inserted == false)
		{
	        text = window.prompt('Введите описание ссылки', '');
	        if(text == '' || text == null)
	            text = url;
	        this.appendEditor('[EMAIL='+url+']'+text+'[/EMAIL]');
	    }    
	},

	insertmedia: function()
	{
	    var url = window.prompt('Введите адрес страницы видеоролика', '');
	    if(url == '' || url == null)
	        return;
	        
	    var inserted = false;
	    
		ta = $('#im_form_text').get(0);
	    
	    if (document.selection && document.selection.createRange)
		{
			ta.focus();
			sel1 = ta.value.substr(0, ta.selectionStart);

			var sel = document.selection;
			var text = '';
			var rng = sel.createRange();

			rng.colapse;

			if ( (sel.type == "Text" || sel.type == "None") && rng != null )
			{			
				if (rng.text.length > 0)
					url = rng.text;				
		        inserted = true;
				rng.text = '[MEDIA]'+url+'[/MEDIA]';
			}
		}
		if(inserted == false)
		{
	        this.appendEditor('[MEDIA]'+url+'[/MEDIA]');
	    }    
	},
	
	showgallery: function(url, container) {

		var input = $(container);
		var cont = input[0].value;

		/*input.insertAtCaretPos('[UGALLERY='+'5'+']');
		
return true;
		input[0].value+=' ';
		if (cont != input[0].value)
			input[0].value = cont;*/
		
		//window.open('http://dvp.ufa1.ru/user/1/gallery/popup/album/8672.php?nomo=12&nocache=34','_blank', 'width=650,height=450,directories=1,location=1,menubar=1,resizable=1,toolbar=1,scrollbars=1').focus();
		window.open(url,'_blank', 'width=650,height=450,directories=1,location=1,menubar=1,resizable=1,toolbar=1,scrollbars=1');
		window.getUserGalleryContainer = function() {
			return container;
		}
		return false;
	},
	
	showsmiles: function(show)
	{
		if(show != false)
		{
			$("#im_form_smiles").show();
			$("#im_form_smiles").bind("mouseleave", function(e){
				$("#im_form_smiles").unbind();
		        $("#im_form_smiles").hide();
		    });
		}
		else
			$("#im_form_smiles").hide();
	},

	load: function(user_id, obj, type, title, url, reload)
	{	
		reload = ( !reload ) ? 0 : 1;
		
		mod_passport_im_loader.params.user_id	= user_id;
		mod_passport_im_loader.params.obj		= obj;
		mod_passport_im_loader.params.type		= type;
		mod_passport_im_loader.params.title		= title;
		mod_passport_im_loader.params.url		= url;
		mod_passport_im_loader.params.reload	= reload;
		
		$.ajax({
			url: '/passport/im/ajax_new.php',
			dataType: 'json',
			data: {
				to:user_id,
				m:obj, 
				type: type,
				url: url,
				title: title,
				rand:Math.random()},
			success: function(data){mod_passport_im_loader.success_loaded(data, type, title, url, reload)},
			type: 'GET'});	
	},
	
	makeread: function(obj)
	{
		$.ajax({
			url: '/passport/im/ajax_new.php',
			dataType: 'json',
			data: {
				to:0,
				m:obj, 
				type: '',
				url: '',
				title: '',
				rand:Math.random()},
			success: function(data){location.href=location.href;},
			type: 'GET'});
	},
	
	success_loaded: function(data, type, title, url, reload)
	{
		if(data.status == 'ok' || data.status == 'login')
		{
			/*var params = '<input type="hidden" id="im_type" value="'+type+'">'+
						 '<input type="hidden" id="im_url" value="'+url+'">'+
						 '<input type="hidden" id="im_title" value="'+title+'">'+
						 '<input type="hidden" id="im_reload" value="'+reload+'">';*/
		    $.fn.nyroModalManual({
				modal: true,				
				type: 'manual',
				content: '<div id="im_form_container" style="opacity: 0;filter: alpha(opacity=0);">' + data.data + '</div>',
				endShowContent: mod_passport_im_loader.rendered,
				hideContent: mod_passport_im_loader.hideContent,
				endRemove: function(){if(reload)location.href=location.href;}
		    });			
			
			if ( data.status == 'ok' ) 
			{
				//$('.nyroModalSend').click(this.send);
				
				$('#im_form_itype').val(type);
				$('#im_form_ititle').val(title);
				$('#im_form_iurl').val(url);
				
				$('#im_form').ajaxForm({
			        beforeSubmit: function(a,f,o) {
						$('#imSendButton').attr('disabled', true);
			        },
			        success: function(data){
						if(data.substr(0,1) != '{')
							data = {status: 'error', data: 'Не удалось отправить сообщение, возможно вы прикрепили слишком большой файл!'};
						else
							data = eval('('+data+')'); // jquery.form не разбирает пришедшие данные
						mod_passport_im_loader.success_loaded(data, type, url, title, reload)
					}
			    });
				
			}
			else
				$('.nyroModalSend').click(this.login);
		}
		else if(data.status == 'added')
		{
			$.nyroModalRemove();
			if(reload==1)
				location.href=location.href;
		}
		else if(data.status == 'error')
		{
			$('#imSendButton').attr('disabled', false);
			alert(data.data);
		}
	},
	
	hideContent: function(elts, settings, callback)
	{
		elts.contentWrapper.hide();
		if ($.isFunction(callback))
			callback();
	},
	
	send: function()
	{
		$('#imSendButton').attr('disabled', true);
		$.ajax({
			url: '/passport/im/ajax_new.php',
			dataType: 'json',
			data: {
				action:	'im_ajax_new',
				to:		$('#im_form_to').val(),
				text:	$('#im_form_text').val(),
				itype:	mod_passport_im_loader.params.type,
				ititle:	mod_passport_im_loader.params.title,
				iurl:	mod_passport_im_loader.params.url,
				rand:Math.random()
			},
			success: function(data){mod_passport_im_loader.success_loaded(data, mod_passport_im_loader.params.type, mod_passport_im_loader.params.url, mod_passport_im_loader.params.title, mod_passport_im_loader.params.reload)},
			type: 'POST'});	
	},
	
	login: function()
	{	
		$('#imSendButton').attr('disabled', true);
		$.ajax({
			url: '/passport/login.php',
			dataType: 'json',
			data: {
				action:		'login_ajax',
				email:		$('#ajax_email').val(),
				password:	$('#ajax_password').val(),
				remember:	$('#ajax_remember').get(0).checked ? 1 : 0,
				to:			mod_passport_im_loader.params.user_id,
				m:			mod_passport_im_loader.params.obj, 
				type:		mod_passport_im_loader.params.type,
				url:		mod_passport_im_loader.params.url,
				title:		mod_passport_im_loader.params.title,
				rand:		Math.random() 
			},
			success: function(data){mod_passport_im_loader.success_loaded(data, mod_passport_im_loader.params.type, mod_passport_im_loader.params.url, mod_passport_im_loader.params.title, mod_passport_im_loader.params.reload)},
			type: 'POST'});	
	},
	
	rendered: function()
	{
		var h = $.nyroModalSize.height;
		var hc = $('#im_message_text').height();
		var hc2 = $('#im_form_container').height();

		//alert('wrapper '+h+' im_message_text '+hc+' im_form_container '+hc2);
		if(hc2 > h)
		{
			$('#im_message_text').css({
				overflow: 'auto',
				height: (hc - (hc2 - h)) + 'px'
			});
		}
		$('#im_form_container').css({
			opacity: 1,
			filter: 'alpha(opacity=100)'
		});
		mod_passport_im_loader.focusEditor();
		

	},
	
	black_list: function(user_id, type)
	{
		$.ajax({
			url: '/passport/',
			dataType: 'json',
			data: {
				action:	'black_list',
				user_id: user_id,
				type: type
			},
			success: function(data)
			{
				if (data.status == 'ok')
				{
					$("#blacklist_"+user_id).hide();
					$("#blacklist_del_"+user_id).show();
				}
				else if (data.status == 'ok_add')
				{
					$(".blacklist_"+user_id).hide();
					$(".blacklist_add_"+user_id).show();
				}
				else if (data.status == 'error')
				{
					alert('Ошибка удаления пользователя из черного списка.');
				}
			},
			type: 'POST'
		});
	}
};
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('5h(c($){b 24=($.1Z.4F&&3z($.1Z.3K.4C(0,1))<7);b 1V=($.1Z.4F&&3z($.1Z.3K.4C(0,1))==7);b 2i=n;b 14=$(\'14\');b 3;b 21=n;b 1G;b 2g;b 4={1k:n,17:n,P:n,1h:n,13:n,1i:n,1I:D,V:D,C:D,g:D,k:D,A:D,u:D,2S:2t 3G()};b 1l={6:n,8:n};$.3m={};$.1W.1t=c(f){5(!G)r n;r G.3F(c(){5(G.2V.3e()==\'1H\'){$(G).5i(c(e){5(G.4g==\'4i/1H-H\'){1q($.M(f,{l:G}));r y}e.1z();1q($.M(f,{l:G}));r n})}q{$(G).1m(c(e){e.1z();1q($.M(f,{l:G}));r n})}})};$.1W.1X=c(f){5(!G.U)1q(f);r G.3F(c(){1q($.M(f,{l:G}))})};$.1X=c(f){1q(f)};$.5f=c(f,1v,2p){S(f,1v,2p);5(!1v&&4.1k){5(f.2s)3.2F(4,3,c(){});5((4.17&&!4.P&&!4.13)&&(f.6||f.8)){2T(y);5(21)4.k.j({X:\'\'});3.2G(4,3,c(){5(21)4.k.j({X:\'2x\'});5($.1P(3.3i))3.3i(4,3)})}}};$.5g=c(){1w()};$.2e=c(){5(3.t==\'E\'){b E=$(\'[1s="\'+3.l.1s+\'"]\');b 11=E.3u(3.l);5(11<E.U-1){r E.1D(11+1).1X(3)}}r n};$.2y=c(){5(3.t==\'E\'){b E=$(\'[1s="\'+3.l.1s+\'"]\');b 11=E.3u(3.l);5(11>0){r E.1D(11-1).1X(3)}}r n};$.1W.1t.f={v:n,4:n,t:\'\',l:\'\',2m:\'\',3h:D,2D:\'5l\',2J:\'1t\',k:D,2s:\'#5m\',1p:{},6:D,8:D,4u:4S,4v:4S,1T:4R,1R:4R,5j:y,3n:y,1a:20,4h:\'5k|59|5a|57|58|5d\',3b:\'3k\',4x:y,j:{V:{34:1K,X:\'2x\',30:0,2X:0,8:\'1K%\',6:\'1K%\'},A:{34:5e,X:\'2x\',30:\'50%\',2X:\'50%\'},29:{},k:{1e:\'1r\'},C:{34:5b,X:\'2x\',30:\'50%\',2X:\'50%\',L:\'-2E\',K:\'-2E\'}},2v:{m:\'<m T="A"></m>\',1p:\'<m T="A"></m>\',1H:\'<m T="A"></m>\',3f:\'<m T="A"></m>\',1x:\'<m T="45"></m>\',E:\'<m T="45"><a J="#" T="2y">5c</a><a J="#"  T="2e">5n</a></m>\',1U:\'<m T="5y"></m>\',Q:\'<m T="5z"></m>\',42:\'<m T="A"></m>\'},4A:\'<a J="#" T="2H" 1g="5w" 1F="5x">4d</a>\',3v:\'.1t\',2U:\'.2H\',4y:\'<a J="#" T="2H">5C</a>\',4M:\'1i\',4P:\'5D 5A k 5B 5q 5r.<3H />5o 5p 5u 5v.<3H /><a J="#" T="2H">4d</a>\',3l:D,2Z:2Z,2o:2o,3s:D,2C:2C,1O:D,2A:2A,2L:2L,2K:2K,2B:2B,2r:2r,2G:2G,3i:D,2F:2F,1N:D};c 1q(f){5(4.1h||4.13||4.P)r;v(\'1q\');5((24||1V)&&10.1L){b 48=10.1L.23;1C.4c(0,1);b 3T=10.1L.23;1C.4c(0,-1);5(3T-48!=0)2i=y}3g(f);4.1i=n;4.17=n;4.2S=2t 3G();3.t=4l();5($.1P(3.3h))3.3h(3);l=3.l;5(3.t==\'1U\'){3.3p=n;3.k=\'<4Q 51="4Z:53-4V-4W-4X-52" 6="\'+3.6+\'" 8="\'+3.8+\'"><2N Z="55" 1Q="\'+3.z+\'"></2N><2N Z="4I" 1Q="4H"></2N><4J 1E="\'+3.z+\'" t="54/x-4U-4T" 4I="4H" 6="\'+3.6+\'" 8="\'+3.8+\'"></4J></4Q>\'}5(l){5(3.t==\'1H\'){3.O=2w(l.19);b z=l.19.1c(0,l.19.U-3.O.U);b H=$(l).4Y();H.2P({Z:3.2J,1Q:1});5(3.O)H.2P({Z:3.2D,1Q:3.O.1c(1)});$.1p($.M({},3.1p,{z:z,H:H,t:l.56,4L:3P,1i:18}));v(\'4z 4K 2q: \'+l.19);1d()}q 5(3.t==\'3f\'){1n();l.3L=\'3j\';3.O=2w(l.19);b z=l.19.1c(0,l.19.U-3.O.U);l.19=z;$(l).2Y(\'<3M t="1r" Z="\'+3.2J+\'" 1Q="1" />\');5(3.O)$(l).2Y(\'<3M t="1r" Z="\'+3.2D+\'" 1Q="\'+3.O.1c(1)+\'" />\');4.g.I(\'<Q 4s="0" 4t="0" Z="3j"></Q>\');$(\'Q\',4.g).j({6:3.6,8:3.8}).1i(18).2I(3N);v(\'4z 6a 2q: \'+l.19);1d();12()}q 5(3.t==\'1x\'||3.t==\'E\'){b 1F=l.1F||3.3b;1n();4.g.I(\'<2c 1g="4p" 3a="\'+1F+\'" />\');v(\'3k 2q: \'+l.J);$(\'2c\',4.g).1i(18).2I(c(){v(\'3k 69: \'+G.1E);$(G).3w(\'2I\');b w=4.g.6();b h=4.g.8();S({6:w,8:h,33:w,32:h});4.17=y;5(4.1h||4.13)12()}).1o(\'1E\',l.J);1d()}q 5(3.t==\'Q\'){1n();4.g.I(\'<Q 4s="0" 4t="0" 1E="\'+l.J+\'" Z="3j"></Q>\');v(\'6d 2q: \'+l.J);$(\'Q\',4.g).1D(0).j({6:\'1K%\',8:\'1K%\'});3.3n=n;4.17=y;1d()}q 5(3.t){v(\'4N: \'+3.t);1n();4.g.I(3.k);b w=4.g.6();b h=4.g.8();b m=$(3.t);5(m.U){S({t:\'m\'});w=m.6();h=m.8();5(1G)2g=1G;1G=m;4.g.1u(m.1M())}S({6:w,8:h});5(4.g.I())4.17=y;q 18();1d();12()}q{v(\'4K 2q: \'+3.z);S({t:\'1p\'});b H={};5(3.O){H=3.1p.H||{};H[3.2D]=3.O.1c(1)}$.1p($.M({},3.1p,{z:3.z.1c(0,3.z.U-3.O.U),4L:3P,1i:18,H:H}));1d()}}q 5(3.k){v(\'4N: \'+3.t);S({t:\'42\'});1n();4.g.I($(\'<m/>\').I(3.k).1M());5(4.g.I())4.17=y;q 18();1d()}q{}}c 3g(f){v(\'3g\');3=$.M({},$.1W.1t.f,f);3.O=\'\',3.36=0,3.3O=0,3.3p=y;3R()}c S(f,1v,2p){5(1v&&2p){$.M(3[1v][2p],f)}q 5(1v){$.M(3[1v],f)}q{$.M(3,f)}}c 3W(){5(24||1V){5(2i){3.1y=10.1L.3S;3.1B=10.1L.23}q{3.1y=10.14.3S;3.1B=10.14.23}}q{3.1y=0;3.1B=0}}c 3R(){3W();3.K=-(3.6+3.36)/2+3.1y;3.L=-(3.8+3.3O)/2+3.1B}c 1n(){v(\'1n\');5(!4.1I){5(3.v)S({65:\'6l\'},\'j\',\'V\');b 3c=\'\';5(24||1V){$(\'I\').j({1e:\'1r\'});14.j({8:\'1K%\',6:\'1K%\',X:\'6n\'});5(2i)10.1L.3B.1e=\'1r\';q $(\'14\').j({1e:\'1r\'});S({X:\'3d\',8:\'4j%\',6:\'4j%\',30:3.1B+\'p\',2X:3.1y+\'p\'},\'j\',\'V\');S({X:\'3d\'},\'j\',\'C\');S({X:\'3d\'},\'j\',\'A\');3c=$(\'<Q 1g="6f"></Q>\').j($.M({},3.j.V,{1f:0,34:50,16:\'6i\'}))}14.1u($(\'<m 1g="3Y"><m 1g="3V"></m><m 1g="4a"><m 1g="47"></m></m><m 1g="4e"></m><m 1g="4k"></m></m>\').Y());4.1I=$(\'#3Y\').1J();4.V=$(\'#3V\').j($.M({2M:3.2s},3.j.V)).6h(3c);5(!3.4)4.V.1m(1w);4.C=$(\'#4k\').j(3.j.C).Y();4.u=$(\'#4a\').j(3.j.A).Y();4.k=$(\'#47\');4.g=$(\'#4e\').Y();5($.1P($.1W.4b)){4.k.4b(c(e,d){b 2n=4.k.41(0);5((d>0&&2n.23==0)||(d<0&&2n.6j-2n.23==2n.5K)){e.1z();e.5P()}})}$(10).4o(3x);4.k.j({6:\'1A\',8:\'1A\'});4.u.j({6:\'1A\',8:\'1A\'})}}c 1d(){v(\'1d\');5(!4.1k){1n();4.P=y;3.2Z(4,3,3I)}q{4.P=y;4.13=y;3.2L(4,3,c(){2z();4.P=n;12()})}}c 3x(e){5(e.2k==27){1w()}q 5(3.t==\'E\'&&4.1k&&4.17&&!4.P&&!4.13){5(e.2k==39||e.2k==40){e.1z();$(\'.2e\',4.k).1D(0).4m(\'1m\');r n}q 5(e.2k==37||e.2k==38){e.1z();$(\'.2y\',4.k).1D(0).4m(\'1m\');r n}}}c 4l(){b l=3.l;b z=3.z;5(l&&l.2V){5(l.2V.3e()==\'1H\'){5(l.4g==\'4i/1H-H\')r\'3f\';r\'1H\'}5(l.5X==\'4\')3.4=y;b 1x=2t 3U(\'[^\\.]\\.(\'+3.4h+\')\\s*$\',\'i\');5(1x.3X(l.J)){5(l.1s)r\'E\';q r\'1x\'}b 1U=2t 3U(\'[^\\.]\\.(1U)\\s*$\',\'i\');5(1U.3X(l.J))r\'1U\';5(l.3L.3e()==\'5S\'||(l.44.3D(/:\\d*$/,\'\')!=1C.2O.44.3D(/:\\d*$/,\'\')))r\'Q\';z=l.J}5(z){5(l)3.z=z;q 3.l=y;b 2m=2w(z);b 46=2w(1C.2O.J);b 3Z=1C.2O.J.1c(0,1C.2O.J.U-46.U);b 43=z.1c(0,z.U-2m.U);5(43==3Z)r 2m;q 3.O=2m}}c 18(){v(\'18\');4.1i=y;5(!4.1k)r;5($.1P(3.3l))3.3l(4,3);4.C.5U(3.4M).I(3.4P);$(3.2U,4.C).1m(1w)}c 2Q(){v(\'2Q\');5(!4.g.I())r;4.k.I(4.g.1M());4.g.3C();3r();5($.1P(3.3s))3.3s(4,3);4.k.1u(4.2S);b 2W=$.M({},3);5(1l.6)2W.6=D;5(1l.8)2W.8=D;$(3.2U,4.u).1m(1w);$(3.3v,4.u).1t(2W)}c 3r(){v(\'3r\');b 2v=$(3.2v[3.t]);4.k.1u(2v.3Q().2h());4.u.61(2v);5(3.t==\'E\'){b E=$(\'[1s="\'+3.l.1s+\'"]\');b 11=E.3u(3.l);5(11>0){b 3t=E.1D(11-1);$(\'.2y\',4.u).1o(\'J\',3t.1o(\'J\')).1m(c(e){e.1z();3t.1X(3);r n})}q{$(\'.2y\',4.u).2h()}5(11<E.U-1){b 3q=E.1D(11+1);$(\'.2e\',4.u).1o(\'J\',3q.1o(\'J\')).1m(c(e){e.1z();3q.1X(3);r n})}q{$(\'.2e\',4.u).2h()}}2T()}c 2T(4G){v(\'2T\');5(!4.A)4.A=4.u.3Q(\':6g\');1l.6=n;1l.8=n;5(3.3n&&(!3.6||!3.8)){4.u.j({1f:0}).1J();b g={6:\'1A\',8:\'1A\'};5(3.6)g.6=3.6;5(3.8)g.8=3.8;4.k.j(g);5(!3.6){3.6=4.k.6();1l.6=y}5(!3.8){3.8=4.k.8();1l.8=y}4.u.Y().j({1f:1})}3.6=1j.4w(3.6,3.4u);3.8=1j.4w(3.8,3.4v);3.6=1j.26(3.6,3.1T);3.8=1j.26(3.8,3.1R);$.3m.6=3.6;$.3m.8=3.8;b 2j=2l(4.u);b 28=2l(4.A);b 1b=2l(4.k);b g={k:{6:3.6,8:3.8},29:{6:3.6+1b.w.R,8:3.8+1b.h.R},A:{6:3.6+1b.w.R+28.w.R,8:3.8+1b.h.R+28.h.R}};5(3.3p){b 1R=$(1C).8()-3.1a*2-2j.h.16-(g.A.8-3.8);b 1T=$(1C).6()-3.1a*2-2j.w.16-(g.A.6-3.6);5(g.k.8>1R||g.k.6>1T){5(3.t==\'1x\'||3.t==\'E\'){b 2f=g.k.6-3.33;b 2a=g.k.8-3.32;5(2a<0)2a=0;5(2f<0)2f=0;b 2b=1R-2a;b 2d=1T-2f;b 3o=1j.26(2b/3.32,2d/3.33);2b=1j.4n(3.32*3o);2d=1j.4n(3.33*3o);$(\'2c#4p\',4.k).j({8:2b+\'p\',6:2d+\'p\'});g.k.8=2b+2a;g.k.6=2d+2f}q{g.k.8=1j.26(g.k.8,1R);g.k.6=1j.26(g.k.6,1T)}g.29={6:g.k.6+1b.w.R,8:g.k.8+1b.h.R};g.A={6:g.k.6+1b.w.R+28.w.R,8:g.k.8+1b.h.R+28.h.R}}}4.k.j($.M({},g.k,3.j.k));4.A.j($.M({},g.29,3.j.29));5(!4G){4.u.j($.M({},g.A,3.j.A));5(3.t==\'1x\'||3.t==\'E\'){b 1F=$(\'2c\',4.k).1o(\'3a\');$(\'2c\',4.k).4r(\'3a\');5(1F!=3.3b){b 31=$(\'<m>\'+1F+\'</m>\');4.k.1u(31);5(3.4x){b 4B=2l(31);31.j({6:(g.k.6+1b.w.1a-4B.w.R)+\'p\'})}}}5(!3.4)4.u.2Y(3.4A)}g.A.36=2j.w.16;g.A.3O=2j.h.16;S(g.A);3R()}c 1w(e){v(\'1w\');5(e)e.1z();5(4.1I&&4.1k){4.1k=n;4.P=y;5(4.1h||4.13){3.2r(4,3,c(){4.C.Y();4.1h=n;4.13=n;3.2o(4,3,1N)})}q{5(21)4.k.j({X:\'\'});4.A.j({1e:\'1r\'});4.k.j({1e:\'1r\'});3.2A(4,3,c(){2z();3.2o(4,3,1N)})}}5(e)r n}c 12(){v(\'12\');5(4.1k&&!4.P){5(4.17){5(4.g.I()){4.P=y;5(4.13){2Q();3.2K(4,3,c(){4.C.Y();4.13=n;4.1h=n;1O()})}q{3.2r(4,3,c(){4.C.Y();4.1h=n;2Q();3.2C(4,$.M({},3),1O)})}}}q 5(!4.1h&&!4.13){4.P=y;4.1h=y;5(4.1i)18();q 4.C.I(3.4y);$(3.2U,4.C).1m(1w);3.2B(4,3,c(){4.P=n;12()})}}}c 3P(H){v(\'68: \'+G.z);4.g.I(3.O?3E($(\'<m>\'+H+\'</m>\').4E(3.O).1M()):3E(H));5(4.g.I()){4.17=y;12()}q 18()}c 3N(){v(\'3N\');3.l.19+=3.O;3.l.3L=\'\';$(\'3M[Z=\'+3.2J+\']\',3.l).2h();b Q=4.g.3Q(\'Q\');b 4q=Q.3w(\'2I\').1M().4E(3.O||\'14\').6b(\'4O[1E]\');Q.1o(\'1E\',\'64:63\');4.g.I(4q.I());5(4.g.I()){4.17=y;12()}q 18()}c 2z(){v(\'2z\');4.P=n;5(24||1V){5(2i)10.1L.3B.1e=\'1A\';q $(\'14\').j({1e:\'1A\'})}5(2g){2g.1u(4.k.1M());2g=D}q 5(1G){1G.1u(4.k.1M());1G=D}4.k.3C();4.u.3C().4r(\'3B\').Y().j(3.j.A).1u(4.k);12()}c 1N(){v(\'1N\');$(10).3w(\'4o\',3x);4.P=n;4.1I.2h();4.1I=D;5(24||1V){14.j({8:\'\',6:\'\',X:\'\'});$(\'I\').j({1e:\'\'})}5($.1P(3.1N))3.1N(4,3)}c 3I(){v(\'3I\');4.1k=y;4.P=n;12()}c 1O(){v(\'1O\');4.P=n;4.u.j({1f:\'\'});21=$.1Z.67&&66($.1Z.3K)<1.9&&3.t!=\'E\'&&3.t!=\'1x\';5(21)4.k.j({X:\'2x\'});5($.1P(3.1O))3.1O(4,3);5(1l.6)S({6:D});5(1l.8)S({8:D})}c 2w(z){b 3J=z.5G(\'#\');5(3J>-1)r z.1c(3J);r\'\'}c 3E(H){5(5F H==\'5E\')H=H.3D(/<\\/?(I|5I|14)([^>]*)>/5W,\'\');b g=2t 3G();$.3F($.5R({0:H},G.5T),c(){5($.2V(G,"4O")){5(!G.1E||$(G).1o(\'1s\')==\'5V\')4.2S.2P(G)}q g.2P(G)});r g}c 2l(N){N=N.41(0);b B={h:{2R:W(N,\'L\')+W(N,\'5Q\'),16:W(N,\'5Z\')+W(N,\'60\'),1a:W(N,\'5Y\')+W(N,\'5H\')},w:{2R:W(N,\'K\')+W(N,\'5J\'),16:W(N,\'5N\')+W(N,\'5O\'),1a:W(N,\'5L\')+W(N,\'5M\')}};B.h.35=B.h.2R+B.h.16;B.w.35=B.w.2R+B.w.16;B.h.4f=B.h.1a+B.h.16;B.w.4f=B.w.1a+B.w.16;B.h.R=B.h.35+B.h.1a;B.w.R=B.w.35+B.w.1a;r B}c W(N,Z){b B=3z($.6e(N,Z,y));5(6m(B))B=0;r B}c v(49){5(3&&3.v&&4.1I)4.V.2Y(49+\'<3H />\')}c 2Z(o,f,F){o.V.j({1f:0}).4D(6k,0.15,F)}c 2o(o,f,F){o.V.3y(62,F)}c 2B(o,f,F){b h=o.C.8();b w=o.C.6();o.C.j({8:h+\'p\',6:w+\'p\',L:(-h/2+f.1B)+\'p\',K:(-w/2+f.1y)+\'p\',1f:0}).1J().1S({1f:1},{1Y:F,22:2u})}c 2r(o,f,F){F()}c 2C(o,f,F){b h=o.C.8();b w=o.C.6();o.C.j({8:h+\'p\',6:w+\'p\',L:(-h/2+f.1B)+\'p\',K:(-w/2+f.1y)+\'p\'}).1J().1S({6:f.6+\'p\',8:f.8+\'p\',L:(f.L)+\'p\',K:(f.K)+\'p\'},{22:3A,1Y:c(){o.u.j({6:f.6+\'p\',8:f.8+\'p\',L:(f.L)+\'p\',K:(f.K)+\'p\'}).1J();o.C.3y(6c,F)}})}c 2A(o,f,F){o.u.1S({8:\'2E\',6:\'2E\',L:25+f.1B+\'p\',K:25+f.1y+\'p\'},{22:3A,1Y:c(){o.u.Y();F()}})}c 2L(o,f,F){o.C.j({L:o.u.j(\'L\'),K:o.u.j(\'K\'),8:o.u.j(\'8\'),6:o.u.j(\'6\'),1f:0}).1J().4D(2u,1,c(){o.u.Y();F()})}c 2K(o,f,F){o.u.j({6:f.6+\'p\',K:(f.K)+\'p\',8:f.8+\'p\',L:(f.L)+\'p\',1f:1});o.C.1S({6:f.6+\'p\',K:(f.K)+\'p\',8:f.8+\'p\',L:(f.L)+\'p\'},{1Y:c(){o.u.1J();o.C.3y(2u,c(){o.C.Y();F()})},22:3A})}c 2G(o,f,F){o.u.1S({6:f.6+\'p\',K:(f.K)+\'p\',8:f.8+\'p\',L:(f.L)+\'p\'},{1Y:F,22:2u})}c 2F(o,f,F){5(!$.5t.5s.2M){o.V.j({2M:f.2s});F()}q o.V.1S({2M:f.2s},{1Y:F,22:2u})}$($.1W.1t.f.3v).1t()});',62,396,'|||currentSettings|modal|if|width||height|||var|function|||settings|tmp|||css|content|from|div|false|elts|px|else|return||type|contentWrapper|debug|||true|url|wrapper|ret|loading|null|gallery|callback|this|data|html|href|marginLeft|marginTop|extend|elm|selector|anim|iframe|total|setCurrentSettings|class|length|bg|getCurCSS|position|hide|name|document|currentIndex|showContentOrLoading|transition|body||border|dataReady|loadingError|action|padding|outerContent|substring|showModal|overflow|opacity|id|loadingShown|error|Math|ready|resized|click|initModal|attr|ajax|processModal|hidden|rel|nyroModal|append|deep1|removeModal|image|marginScrollLeft|preventDefault|auto|marginScrollTop|window|eq|src|title|contentElt|form|full|show|100|documentElement|contents|endRemove|endShowContent|isFunction|value|maxHeight|animate|maxWidth|swf|isIE7|fn|nyroModalManual|complete|browser||fixFF|duration|scrollTop|isIE6||min||outerWrapper2|wrapper2|diffH|calcH|img|calcW|nyroModalNext|diffW|contentEltLast|remove|isIEXHTML|outerWrapper|keyCode|getOuter|hash|elt|hideBackground|deep2|Load|hideLoading|bgColor|new|400|wrap|getHash|fixed|nyroModalPrev|endHideContent|hideContent|showLoading|showContent|selIndicator|50px|updateBgColor|resize|nyroModalClose|load|formIndicator|hideTransition|showTransition|backgroundColor|param|location|push|fillContent|margin|scripts|calculateSize|closeSelector|nodeName|currentSettingsNew|left|prepend|showBackground|top|divTitle|imgHeight|imgWidth|zIndex|outer|borderW||||alt|defaultImgAlt|iframeHideIE|absolute|toLowerCase|formData|setDefaultCurrentSettings|processHandler|endResize|nyroModalIframe|Image|handleError|nyroModalSize|autoSizable|ratio|resizable|linkNext|wrapContent|endFillContent|linkPrev|index|openSelector|unbind|keyHandler|fadeOut|parseInt|350|style|empty|replace|filterScripts|each|Array|br|endBackground|hashPos|version|target|input|formDataLoaded|borderH|ajaxLoaded|children|setMargin|scrollLeft|ddy2|RegExp|nyroModalBg|setMarginScroll|test|nyroModalFull|curLoc||get|manual|req|hostname|wrapperImg|hashLoc|nyroModalContent|ddy|msg|nyroModalWrapper|mousewheel|scrollBy|Close|nyrModalTmp|inner|enctype|extImg|multipart|110|nyroModalLoading|fileType|trigger|floor|keydown|nyroModalImg|iframeContent|removeAttr|frameborder|hspace|minWidth|minHeight|max|setWidthImgTitle|contentLoading|Form|closeButton|outerDivTitle|substr|fadeTo|find|msie|resizing|transparent|wmode|embed|Ajax|success|errorClass|Content|script|contentError|object|600|150|flash|shockwave|AE6D|11cf|96B8|serializeArray|clsid||classid|444553540000|D27CDB6E|application|movie|method|tiff|gif|jpeg|png|102|Prev|bmp|101|nyroModalSettings|nyroModalRemove|jQuery|submit|resizeable|jpg|nyroModalSel|000000|Next|Please|try|be|loaded|step|fx|again|later|closeBut|close|wrapperSwf|wrapperIframe|requested|cannot|Cancel|The|string|typeof|indexOf|paddingBottom|head|marginRight|clientHeight|paddingLeft|paddingRight|borderLeftWidth|borderRightWidth|stopPropagation|marginBottom|clean|_blank|ownerDocument|addClass|forceLoad|gi|rev|paddingTop|borderTopWidth|borderBottomWidth|wrapInner|300|blank|about|color|parseFloat|mozilla|AjaxLoaded|Loaded|Data|not|200|Iframe|curCSS|nyroModalIframeHideIe|first|before|none|scrollHeight|500|white|isNaN|static'.split('|'),0,{}))
;
/*
 * jQuery Form Plugin
 * version: 2.33 (22-SEP-2009)
 * @requires jQuery v1.2.6 or later
 *
 * Examples and documentation at: http://malsup.com/jquery/form/
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
;(function($) {

/*
	Usage Note:
	-----------
	Do not use both ajaxSubmit and ajaxForm on the same form.  These
	functions are intended to be exclusive.  Use ajaxSubmit if you want
	to bind your own submit handler to the form.  For example,

	$(document).ready(function() {
		$('#myForm').bind('submit', function() {
			$(this).ajaxSubmit({
				target: '#output'
			});
			return false; // <-- important!
		});
	});

	Use ajaxForm when you want the plugin to manage all the event binding
	for you.  For example,

	$(document).ready(function() {
		$('#myForm').ajaxForm({
			target: '#output'
		});
	});

	When using ajaxForm, the ajaxSubmit function will be invoked for you
	at the appropriate time.
*/

/**
 * ajaxSubmit() provides a mechanism for immediately submitting
 * an HTML form using AJAX.
 */
$.fn.ajaxSubmit = function(options) {
	// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
	if (!this.length) {
		log('ajaxSubmit: skipping submit process - no element selected');
		return this;
	}

	if (typeof options == 'function')
		options = { success: options };

	var url = this.attr('action');
	
	if ( typeof(url) == "string" )
	{
		if (url) {
			// clean url (don't include hash vaue)
			url = (url.match(/^([^#]+)/)||[])[1];
	   	}
	   	url = url || window.location.href || '';
	}
	else
		url = window.location.href || '';

	options = $.extend({
		url:  url,
		type: this.attr('method') || 'GET'
	}, options || {});

	// hook for manipulating the form data before it is extracted;
	// convenient for use with rich editors like tinyMCE or FCKEditor
	var veto = {};
	this.trigger('form-pre-serialize', [this, options, veto]);
	if (veto.veto) {
		log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
		return this;
	}

	// provide opportunity to alter form data before it is serialized
	if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
		log('ajaxSubmit: submit aborted via beforeSerialize callback');
		return this;
	}

	var a = this.formToArray(options.semantic);
	if (options.data) {
		options.extraData = options.data;
		for (var n in options.data) {
		  if(options.data[n] instanceof Array) {
			for (var k in options.data[n])
			  a.push( { name: n, value: options.data[n][k] } );
		  }
		  else
			 a.push( { name: n, value: options.data[n] } );
		}
	}

	// give pre-submit callback an opportunity to abort the submit
	if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
		log('ajaxSubmit: submit aborted via beforeSubmit callback');
		return this;
	}

	// fire vetoable 'validate' event
	this.trigger('form-submit-validate', [a, this, options, veto]);
	if (veto.veto) {
		log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
		return this;
	}

	var q = $.param(a);

	if (options.type.toUpperCase() == 'GET') {
		options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
		options.data = null;  // data is null for 'get'
	}
	else
		options.data = q; // data is the query string for 'post'

	var $form = this, callbacks = [];
	if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
	if (options.clearForm) callbacks.push(function() { $form.clearForm(); });

	// perform a load on the target only if dataType is not provided
	if (!options.dataType && options.target) {
		var oldSuccess = options.success || function(){};
		callbacks.push(function(data) {
			$(options.target).html(data).each(oldSuccess, arguments);
		});
	}
	else if (options.success)
		callbacks.push(options.success);

	options.success = function(data, status) {
		for (var i=0, max=callbacks.length; i < max; i++)
			callbacks[i].apply(options, [data, status, $form]);
	};

	// are there files to upload?
	var files = $('input:file', this).fieldValue();
	var found = false;
	for (var j=0; j < files.length; j++)
		if (files[j])
			found = true;

	var multipart = false;
//	var mp = 'multipart/form-data';
//	multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);

	// options.iframe allows user to force iframe mode
   if (options.iframe || found || multipart) {
	   // hack to fix Safari hang (thanks to Tim Molendijk for this)
	   // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
	   if (options.closeKeepAlive)
		   $.get(options.closeKeepAlive, fileUpload);
	   else
		   fileUpload();
	   }
   else
	   $.ajax(options);

	// fire 'notify' event
	this.trigger('form-submit-notify', [this, options]);
	return this;


	// private function for handling file uploads (hat tip to YAHOO!)
	function fileUpload() {
		var form = $form[0];

		if ($(':input[name=submit]', form).length) {
			alert('Error: Form elements must not be named "submit".');
			return;
		}

		var opts = $.extend({}, $.ajaxSettings, options);
		var s = $.extend(true, {}, $.extend(true, {}, $.ajaxSettings), opts);

		var id = 'jqFormIO' + (new Date().getTime());
		var $io = $('<iframe id="' + id + '" name="' + id + '" src="about:blank" />');
		var io = $io[0];

		$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });

		var xhr = { // mock object
			aborted: 0,
			responseText: null,
			responseXML: null,
			status: 0,
			statusText: 'n/a',
			getAllResponseHeaders: function() {},
			getResponseHeader: function() {},
			setRequestHeader: function() {},
			abort: function() {
				this.aborted = 1;
				$io.attr('src','about:blank'); // abort op in progress
			}
		};

		var g = opts.global;
		// trigger ajax global events so that activity/block indicators work like normal
		if (g && ! $.active++) $.event.trigger("ajaxStart");
		if (g) $.event.trigger("ajaxSend", [xhr, opts]);

		if (s.beforeSend && s.beforeSend(xhr, s) === false) {
			s.global && $.active--;
			return;
		}
		if (xhr.aborted)
			return;

		var cbInvoked = 0;
		var timedOut = 0;

		// add submitting element to data if we know it
		var sub = form.clk;
		if (sub) {
			var n = sub.name;
			if (n && !sub.disabled) {
				options.extraData = options.extraData || {};
				options.extraData[n] = sub.value;
				if (sub.type == "image") {
					options.extraData[name+'.x'] = form.clk_x;
					options.extraData[name+'.y'] = form.clk_y;
				}
			}
		}

		// take a breath so that pending repaints get some cpu time before the upload starts
		setTimeout(function() {
			// make sure form attrs are set
			var t = $form.attr('target'), a = $form.attr('action');

			// update form attrs in IE friendly way
			form.setAttribute('target',id);
			if (form.getAttribute('method') != 'POST')
				form.setAttribute('method', 'POST');
			if (form.getAttribute('action') != opts.url)
				form.setAttribute('action', opts.url);

			// ie borks in some cases when setting encoding
			if (! options.skipEncodingOverride) {
				$form.attr({
					encoding: 'multipart/form-data',
					enctype:  'multipart/form-data'
				});
			}

			// support timout
			if (opts.timeout)
				setTimeout(function() { timedOut = true; cb(); }, opts.timeout);

			// add "extra" data to form if provided in options
			var extraInputs = [];
			try {
				if (options.extraData)
					for (var n in options.extraData)
						extraInputs.push(
							$('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
								.appendTo(form)[0]);

				// add iframe to doc and submit the form
				$io.appendTo('body');
				io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
				form.submit();
			}
			finally {
				// reset attrs and remove "extra" input elements
				form.setAttribute('action',a);
				t ? form.setAttribute('target', t) : $form.removeAttr('target');
				$(extraInputs).remove();
			}
		}, 10);

		var domCheckCount = 50;

		function cb() {
			if (cbInvoked++) return;

			io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);

			var ok = true;
			try {
				if (timedOut) throw 'timeout';
				// extract the server response from the iframe
				var data, doc;

				doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
				
				var isXml = opts.dataType == 'xml' || doc.XMLDocument || $.isXMLDoc(doc);
				log('isXml='+isXml);
				if (!isXml && (doc.body == null || doc.body.innerHTML == '')) {
				 	if (--domCheckCount) {
						// in some browsers (Opera) the iframe DOM is not always traversable when
						// the onload callback fires, so we loop a bit to accommodate
						cbInvoked = 0;
						setTimeout(cb, 100);
						return;
					}
					log('Could not access iframe DOM after 50 tries.');
					return;
				}

				xhr.responseText = doc.body ? doc.body.innerHTML : null;
				xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
				xhr.getResponseHeader = function(header){
					var headers = {'content-type': opts.dataType};
					return headers[header];
				};

				if (opts.dataType == 'json' || opts.dataType == 'script') {
					// see if user embedded response in textarea
					var ta = doc.getElementsByTagName('textarea')[0];
					if (ta)
						xhr.responseText = ta.value;
					else {
						// account for browsers injecting pre around json response
						var pre = doc.getElementsByTagName('pre')[0];
						if (pre)
							xhr.responseText = pre.innerHTML;
					}			  
				}
				else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
					xhr.responseXML = toXml(xhr.responseText);
				}
				data = $.httpData(xhr, opts.dataType);
			}
			catch(e){
				ok = false;
				$.handleError(opts, xhr, 'error', e);
			}

			// ordering of these callbacks/triggers is odd, but that's how $.ajax does it
			if (ok) {
				opts.success(data, 'success');
				if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
			}
			if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
			if (g && ! --$.active) $.event.trigger("ajaxStop");
			if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');

			// clean up
			setTimeout(function() {
				$io.remove();
				xhr.responseXML = null;
			}, 100);
		};

		function toXml(s, doc) {
			if (window.ActiveXObject) {
				doc = new ActiveXObject('Microsoft.XMLDOM');
				doc.async = 'false';
				doc.loadXML(s);
			}
			else
				doc = (new DOMParser()).parseFromString(s, 'text/xml');
			return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
		};
	};
};

/**
 * ajaxForm() provides a mechanism for fully automating form submission.
 *
 * The advantages of using this method instead of ajaxSubmit() are:
 *
 * 1: This method will include coordinates for <input type="image" /> elements (if the element
 *	is used to submit the form).
 * 2. This method will include the submit element's name/value data (for the element that was
 *	used to submit the form).
 * 3. This method binds the submit() method to the form for you.
 *
 * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
 * passes the options argument along after properly binding events for submit elements and
 * the form itself.
 */
$.fn.ajaxForm = function(options) {
	return this.ajaxFormUnbind().bind('submit.form-plugin', function() {
		$(this).ajaxSubmit(options);
		return false;
	}).bind('click.form-plugin', function(e) {
		var $el = $(e.target);
		if (!($el.is(":submit,input:image"))) {
			return;
		}
		var form = this;
		form.clk = e.target;
		if (e.target.type == 'image') {
			if (e.offsetX != undefined) {
				form.clk_x = e.offsetX;
				form.clk_y = e.offsetY;
			} else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
				var offset = $el.offset();
				form.clk_x = e.pageX - offset.left;
				form.clk_y = e.pageY - offset.top;
			} else {
				form.clk_x = e.pageX - e.target.offsetLeft;
				form.clk_y = e.pageY - e.target.offsetTop;
			}
		}
		// clear form vars
		setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 10);
	});
};

// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
$.fn.ajaxFormUnbind = function() {
	return this.unbind('submit.form-plugin click.form-plugin');
};

/**
 * formToArray() gathers form element data into an array of objects that can
 * be passed to any of the following ajax functions: $.get, $.post, or load.
 * Each object in the array has both a 'name' and 'value' property.  An example of
 * an array for a simple login form might be:
 *
 * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
 *
 * It is this array that is passed to pre-submit callback functions provided to the
 * ajaxSubmit() and ajaxForm() methods.
 */
$.fn.formToArray = function(semantic) {
	var a = [];
	if (this.length == 0) return a;

	var form = this[0];
	var els = semantic ? form.getElementsByTagName('*') : form.elements;
	if (!els) return a;
	for(var i=0, max=els.length; i < max; i++) {
		var el = els[i];
		var n = el.name;
		if (!n) continue;

		if (semantic && form.clk && el.type == "image") {
			// handle image inputs on the fly when semantic == true
			if(!el.disabled && form.clk == el) {
				a.push({name: n, value: $(el).val()});
				a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
			}
			continue;
		}

		var v = $.fieldValue(el, true);
		if (v && v.constructor == Array) {
			for(var j=0, jmax=v.length; j < jmax; j++)
				a.push({name: n, value: v[j]});
		}
		else if (v !== null && typeof v != 'undefined')
			a.push({name: n, value: v});
	}

	if (!semantic && form.clk) {
		// input type=='image' are not found in elements array! handle it here
		var $input = $(form.clk), input = $input[0], n = input.name;
		if (n && !input.disabled && input.type == 'image') {
			a.push({name: n, value: $input.val()});
			a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
		}
	}
	return a;
};

/**
 * Serializes form data into a 'submittable' string. This method will return a string
 * in the format: name1=value1&amp;name2=value2
 */
$.fn.formSerialize = function(semantic) {
	//hand off to jQuery.param for proper encoding
	return $.param(this.formToArray(semantic));
};

/**
 * Serializes all field elements in the jQuery object into a query string.
 * This method will return a string in the format: name1=value1&amp;name2=value2
 */
$.fn.fieldSerialize = function(successful) {
	var a = [];
	this.each(function() {
		var n = this.name;
		if (!n) return;
		var v = $.fieldValue(this, successful);
		if (v && v.constructor == Array) {
			for (var i=0,max=v.length; i < max; i++)
				a.push({name: n, value: v[i]});
		}
		else if (v !== null && typeof v != 'undefined')
			a.push({name: this.name, value: v});
	});
	//hand off to jQuery.param for proper encoding
	return $.param(a);
};

/**
 * Returns the value(s) of the element in the matched set.  For example, consider the following form:
 *
 *  <form><fieldset>
 *	  <input name="A" type="text" />
 *	  <input name="A" type="text" />
 *	  <input name="B" type="checkbox" value="B1" />
 *	  <input name="B" type="checkbox" value="B2"/>
 *	  <input name="C" type="radio" value="C1" />
 *	  <input name="C" type="radio" value="C2" />
 *  </fieldset></form>
 *
 *  var v = $(':text').fieldValue();
 *  // if no values are entered into the text inputs
 *  v == ['','']
 *  // if values entered into the text inputs are 'foo' and 'bar'
 *  v == ['foo','bar']
 *
 *  var v = $(':checkbox').fieldValue();
 *  // if neither checkbox is checked
 *  v === undefined
 *  // if both checkboxes are checked
 *  v == ['B1', 'B2']
 *
 *  var v = $(':radio').fieldValue();
 *  // if neither radio is checked
 *  v === undefined
 *  // if first radio is checked
 *  v == ['C1']
 *
 * The successful argument controls whether or not the field element must be 'successful'
 * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
 * The default value of the successful argument is true.  If this value is false the value(s)
 * for each element is returned.
 *
 * Note: This method *always* returns an array.  If no valid value can be determined the
 *	   array will be empty, otherwise it will contain one or more values.
 */
$.fn.fieldValue = function(successful) {
	for (var val=[], i=0, max=this.length; i < max; i++) {
		var el = this[i];
		var v = $.fieldValue(el, successful);
		if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
			continue;
		v.constructor == Array ? $.merge(val, v) : val.push(v);
	}
	return val;
};

/**
 * Returns the value of the field element.
 */
$.fieldValue = function(el, successful) {
	var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
	if (typeof successful == 'undefined') successful = true;

	if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
		(t == 'checkbox' || t == 'radio') && !el.checked ||
		(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
		tag == 'select' && el.selectedIndex == -1))
			return null;

	if (tag == 'select') {
		var index = el.selectedIndex;
		if (index < 0) return null;
		var a = [], ops = el.options;
		var one = (t == 'select-one');
		var max = (one ? index+1 : ops.length);
		for(var i=(one ? index : 0); i < max; i++) {
			var op = ops[i];
			if (op.selected) {
				var v = op.value;
				if (!v) // extra pain for IE...
					v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
				if (one) return v;
				a.push(v);
			}
		}
		return a;
	}
	return el.value;
};

/**
 * Clears the form data.  Takes the following actions on the form's input fields:
 *  - input text fields will have their 'value' property set to the empty string
 *  - select elements will have their 'selectedIndex' property set to -1
 *  - checkbox and radio inputs will have their 'checked' property set to false
 *  - inputs of type submit, button, reset, and hidden will *not* be effected
 *  - button elements will *not* be effected
 */
$.fn.clearForm = function() {
	return this.each(function() {
		$('input,select,textarea', this).clearFields();
	});
};

/**
 * Clears the selected form elements.
 */
$.fn.clearFields = $.fn.clearInputs = function() {
	return this.each(function() {
		var t = this.type, tag = this.tagName.toLowerCase();
		if (t == 'text' || t == 'password' || tag == 'textarea')
			this.value = '';
		else if (t == 'checkbox' || t == 'radio')
			this.checked = false;
		else if (tag == 'select')
			this.selectedIndex = -1;
	});
};

/**
 * Resets the form data.  Causes all form elements to be reset to their original value.
 */
$.fn.resetForm = function() {
	return this.each(function() {
		// guard against an input with the name of 'reset'
		// note that IE reports the reset function as an 'object'
		if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
			this.reset();
	});
};

/**
 * Enables or disables any matching elements.
 */
$.fn.enable = function(b) {
	if (b == undefined) b = true;
	return this.each(function() {
		this.disabled = !b;
	});
};

/**
 * Checks/unchecks any matching checkboxes or radio buttons and
 * selects/deselects and matching option elements.
 */
$.fn.selected = function(select) {
	if (select == undefined) select = true;
	return this.each(function() {
		var t = this.type;
		if (t == 'checkbox' || t == 'radio')
			this.checked = select;
		else if (this.tagName.toLowerCase() == 'option') {
			var $sel = $(this).parent('select');
			if (select && $sel[0] && $sel[0].type == 'select-one') {
				// deselect all other options
				$sel.find('option').selected(false);
			}
			this.selected = select;
		}
	});
};

// helper fn for console logging
// set $.fn.ajaxSubmit.debug to true to enable debug logging
function log() {
	if ($.fn.ajaxSubmit.debug && window.console && window.console.log)
		window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
};

})(jQuery);
;
/**
 * Ajax Queue Plugin
 * 
 * Homepage: http://jquery.com/plugins/project/ajaxqueue
 * Documentation: http://docs.jquery.com/AjaxQueue
 */

/**

<script>
$(function(){
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
});
</script>
<ul style="position: absolute; top: 5px; right: 5px;"></ul>

 */
/*
 * Queued Ajax requests.
 * A new Ajax request won't be started until the previous queued 
 * request has finished.
 */

/*
 * Synced Ajax requests.
 * The Ajax request will happen as soon as you call this method, but
 * the callbacks (success/error/complete) won't fire until all previous
 * synced requests have been completed.
 */


(function($) {
	
	var ajax = $.ajax;
	
	var pendingRequests = {};
	
	var synced = [];
	var syncedData = [];
	
	$.ajax = function(settings) {
		// create settings for compatibility with ajaxSetup
		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
		
		var port = settings.port;
		
		switch(settings.mode) {
		case "abort": 
			if ( pendingRequests[port] ) {
				pendingRequests[port].abort();
			}
			return pendingRequests[port] = ajax.apply(this, arguments);
		case "queue": 
			var _old = settings.complete;
			settings.complete = function(){
				if ( _old )
					_old.apply( this, arguments );
				jQuery([ajax]).dequeue("ajax" + port );;
			};
		
			jQuery([ ajax ]).queue("ajax" + port, function(){
				ajax( settings );
			});
			return;
		case "sync":
			var pos = synced.length;
	
			synced[ pos ] = {
				error: settings.error,
				success: settings.success,
				complete: settings.complete,
				done: false
			};
		
			syncedData[ pos ] = {
				error: [],
				success: [],
				complete: []
			};
		
			settings.error = function(){ syncedData[ pos ].error = arguments; };
			settings.success = function(){ syncedData[ pos ].success = arguments; };
			settings.complete = function(){
				syncedData[ pos ].complete = arguments;
				synced[ pos ].done = true;
		
				if ( pos == 0 || !synced[ pos-1 ] )
					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
		
						synced[i] = null;
						syncedData[i] = null;
					}
			};
		}
		return ajax.apply(this, arguments);
	};
	
})(jQuery);;
/*
 * Autocomplete - jQuery plugin 1.0.2
 *
 * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, JГ¶rn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 5747 2008-06-25 18:30:55Z joern.zaefferer $
 *
 */

;(function($) {

$.fn.extend({
	autocomplete: function(urlOrData, options) {
		var isUrl = typeof urlOrData == "string";
		options = $.extend({}, $.Autocompleter.defaults, {
			url: isUrl ? urlOrData : null,
			data: isUrl ? null : urlOrData,
			delay: isUrl ? $.Autocompleter.defaults.delay : 10,
			max: options && !options.scroll ? 10 : 150
		}, options);

		// if highlight is set to false, replace it with a do-nothing function
		options.highlight = options.highlight || function(value) { return value; };

		// if the formatMatch option is not specified, then use formatItem for backwards compatibility
		options.formatMatch = options.formatMatch || options.formatItem;

		return this.each(function() {
			new $.Autocompleter(this, options);
		});
	},
	result: function(handler) {
		return this.bind("result", handler);
	},
	search: function(handler) {
		return this.trigger("search", [handler]);
	},
	flushCache: function() {
		return this.trigger("flushCache");
	},
	setOptions: function(options){
		return this.trigger("setOptions", [options]);
	},
	unautocomplete: function() {
		return this.trigger("unautocomplete");
	}
});

$.Autocompleter = function(input, options) {

	var KEY = {
		UP: 38,
		DOWN: 40,
		DEL: 46,
		TAB: 9,
		RETURN: 13,
		ESC: 27,
		COMMA: 188,
		PAGEUP: 33,
		PAGEDOWN: 34,
		BACKSPACE: 8
	};

	// Create $ object for input element
	var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);

	var timeout;
	var request;
	var previousValue = "";
	var cache = $.Autocompleter.Cache(options);
	var hasFocus = 0;
	var lastKeyPressCode;
	var config = {
		mouseDownOnSelect: false
	};
	var select = $.Autocompleter.Select(options, input, selectCurrent, config);

	var blockSubmit;

	// prevent form submit in opera when selecting with return key
	$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
		if (blockSubmit) {
			blockSubmit = false;
			return false;
		}
	});

	// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
	$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
		// track last key pressed
		lastKeyPressCode = event.keyCode;
		switch(event.keyCode) {

			case KEY.UP:
				event.preventDefault();
				if ( select.visible() ) {
					select.prev();
				} else {
					onChange(0, true);
				}
				break;

			case KEY.DOWN:
				event.preventDefault();
				if ( select.visible() ) {
					select.next();
				} else {
					onChange(0, true);
				}
				break;

			case KEY.PAGEUP:
				event.preventDefault();
				if ( select.visible() ) {
					select.pageUp();
				} else {
					onChange(0, true);
				}
				break;

			case KEY.PAGEDOWN:
				event.preventDefault();
				if ( select.visible() ) {
					select.pageDown();
				} else {
					onChange(0, true);
				}
				break;

			// matches also semicolon
			case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
			case KEY.TAB:
			case KEY.RETURN:
				if( selectCurrent() ) {
					// stop default to prevent a form submit, Opera needs special handling
					event.preventDefault();
					blockSubmit = true;
					return false;
				}
				break;

			case KEY.ESC:
				select.hide();
				break;

			default:
				clearTimeout(timeout);
				timeout = setTimeout(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++;
	}).blur(function() {
		hasFocus = 0;
		if (!config.mouseDownOnSelect) {
			hideResults();
		}

		if ( options.blurClear === true )
			$input.val('');

	}).click(function() {
		// show select when clicking in a focused field
		if ( hasFocus++ > 1 && !select.visible() ) {
			onChange(0, true);
		}
	}).bind("search", function() {
		// TODO why not just specifying both arguments?
		var fn = (arguments.length > 1) ? arguments[1] : null;
		function findValueCallback(q, data) {
			var result;
			if( data && data.length ) {
				for (var i=0; i < data.length; i++) {
					if( data[i].result.toLowerCase() == q.toLowerCase() ) {
						result = data[i];
						break;
					}
				}
			}
			if( typeof fn == "function" ) fn(result);
			else $input.trigger("result", result && [result.data, result.value]);
		}
		$.each(trimWords($input.val()), function(i, value) {
			request(value, findValueCallback, findValueCallback);
		});
	}).bind("flushCache", function() {
		cache.flush();
	}).bind("setOptions", function() {
		$.extend(options, arguments[1]);
		// if we've updated the data, repopulate
		if ( "data" in arguments[1] )
			cache.populate();
	}).bind("unautocomplete", function() {
		select.unbind();
		$input.unbind();
		$(input.form).unbind(".autocomplete");
	});

	function selectCurrent() {
		var selected = select.selected();
		if( !selected )
			return false;

		var v = selected.result;
		previousValue = v;

		if ( options.multiple ) {
			var words = trimWords($input.val());
			if ( words.length > 1 ) {
				v = words.slice(0, words.length - 1).join( options.multipleSeparator+options.multipleSeparatorPostfix ) + options.multipleSeparator + options.multipleSeparatorPostfix + v;
			}
			v += options.multipleSeparator + options.multipleSeparatorPostfix;
		}

		$input.val(v);
		hideResultsNow();
		$input.trigger("result", [selected.data, selected.value]);
		return true;
	}

	function onChange(crap, skipPrevCheck) {
		if( lastKeyPressCode == KEY.DEL ) {
			select.hide();
			return;
		}

		var currentValue = $input.val();

		if ( !skipPrevCheck && currentValue == previousValue )
			return;

		previousValue = currentValue;

		currentValue = lastWord(currentValue);
		if ( currentValue.length >= options.minChars) {
			$input.addClass(options.loadingClass);
			if (!options.matchCase)
				currentValue = currentValue.toLowerCase();
			request(currentValue, receiveData, hideResultsNow);
		} else {
			stopLoading();
			select.hide();
		}
	};

	function trimWords(value) {
		if ( !value ) {
			return [""];
		}
		var words = value.split( options.multipleSeparator );
		var result = [];
		$.each(words, function(i, value) {
			if ( $.trim(value) )
				result[i] = $.trim(value);
		});
		return result;
	}

	function lastWord(value) {
		if ( !options.multiple )
			return value;
		var words = trimWords(value);
		return words[words.length - 1];
	}

	// fills in the input box w/the first match (assumed to be the best match)
	// q: the term entered
	// sValue: the first matching result
	function autoFill(q, sValue){
		// autofill in the complete box w/the first match as long as the user hasn't entered in more data
		// if the last user key pressed was backspace, don't autofill
		if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
			// fill in the value (keep the case the user has typed)
			$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
			// select the portion of the value not typed by the user (so the next character will erase)
			$.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length);
		}
	};

	function hideResults() {
		clearTimeout(timeout);
		timeout = setTimeout(hideResultsNow, 200);
	};

	function hideResultsNow() {
		var wasVisible = select.visible();
		select.hide();
		clearTimeout(timeout);
		stopLoading();
		if (options.mustMatch) {
			// call search and run callback
			$input.search(
				function (result){
					// if no value found, clear the input box
					if( !result ) {
						if (options.multiple) {
							var words = trimWords($input.val()).slice(0, -1);
							$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
						}
						else
							$input.val( "" );
					}
				}
			);
		}
		if (wasVisible)
			// position cursor at end of input field
			$.Autocompleter.Selection(input, input.value.length, input.value.length);
	};

	function receiveData(q, data) {
		if ( data && data.length && hasFocus ) {
			stopLoading();
			select.display(data, q);
			autoFill(q, data[0].value);
			select.show();
		} else {
			hideResultsNow();
		}
	};

	function request(term, success, failure) {
		if (!options.matchCase)
			term = term.toLowerCase();
		var data = cache.load(term);
		// recieve the cached data
		if (data && data.length) {
			success(term, data);
		// if an AJAX url has been supplied, try loading the data now
		} else if( (typeof options.url == "string") && (options.url.length > 0) ){

			var extraParams = {
				timestamp: +new Date()
			};
			$.each(options.extraParams, function(key, param) {
				extraParams[key] = typeof param == "function" ? param() : param;
			});

			$.ajax({
				// try to leverage ajaxQueue plugin to abort previous requests
				mode: "abort",
				port: 'autocomplete',
				queue: "autocomplete",
				cancelExisting: false,
				type: "POST",				
				async: true,
				dataType: options.dataType,
				url: options.url,
				data: $.extend({
					query: lastWord(term),
					limit: options.max
				}, extraParams),
				success: function(data) {
					var parsed = options.parse && options.parse(data) || parse(data);
					cache.add(term, parsed);
					success(term, parsed);
				}
			});
		} else {
			// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
			select.emptyList();
			failure(term);
		}
	};

	function parse(data) {
		var parsed = [];
		var rows = data.split("\n");
		for (var i=0; i < rows.length; i++) {
			var row = $.trim(rows[i]);
			if (row) {
				row = row.split("|");
				parsed[parsed.length] = {
					data: row,
					value: row[0],
					result: options.formatResult && options.formatResult(row, row[0]) || row[0]
				};
			}
		}
		return parsed;
	};

	function stopLoading() {
		$input.removeClass(options.loadingClass);
	};

};

$.Autocompleter.defaults = {
	inputClass: "ac_input",
	resultsClass: "ac_results",
	bgframeClass: "ac_bgframe",
	loadingClass: "ac_loading",
	minChars: 1,
	delay: 400,
	matchCase: false,
	matchSubset: true,
	matchContains: false,
	cacheLength: 10,
	max: 100,
	mustMatch: false,
	extraParams: {},
	selectFirst: true,
	formatItem: function(row) { return row[0]; },
	formatMatch: null,
	autoFill: false,
	width: 0,
	multiple: false,
	multipleSeparator: ",",
	multipleSeparatorPostfix: " ",
	highlight: function(value, term) {
		return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
	},
    scroll: true,
    scrollHeight: 180,
	blurClear: false,
	returnFocus: true
};

$.Autocompleter.Cache = function(options) {

	var data = {};
	var length = 0;

	function matchSubset(s, sub) {
		s = ''+s;
		if (!options.matchCase)
			s = s.toLowerCase();
		var i = s.indexOf(sub);
		if (i == -1) return false;
		return i == 0 || options.matchContains;
	};

	function add(q, value) {
		if (length > options.cacheLength){
			flush();
		}
		if (!data[q]){
			length++;
		}
		data[q] = value;
	}

	function populate(){
		if( !options.data ) return false;
		// track the matches
		var stMatchSets = {},
			nullData = 0;

		// no url was specified, we need to adjust the cache length to make sure it fits the local data store
		if( !options.url ) options.cacheLength = 1;

		// track all options for minChars = 0
		stMatchSets[""] = [];

		// loop through the array and create a lookup structure
		for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
			var rawValue = options.data[i];
			// if rawValue is a string, make an array otherwise just reference the array
			rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;

			var value = options.formatMatch(rawValue, i+1, options.data.length);
			if ( value === false )
				continue;

			var firstChar = value.charAt(0).toLowerCase();
			// if no lookup array for this character exists, look it up now
			if( !stMatchSets[firstChar] )
				stMatchSets[firstChar] = [];

			// if the match is a string
			var row = {
				value: value,
				data: rawValue,
				result: options.formatResult && options.formatResult(rawValue) || value
			};

			// push the current match into the set list
			stMatchSets[firstChar].push(row);

			// keep track of minChars zero items
			if ( nullData++ < options.max ) {
				stMatchSets[""].push(row);
			}
		};

		// add the data items to the cache
		$.each(stMatchSets, function(i, value) {
			// increase the cache size
			options.cacheLength++;
			// add to the cache
			add(i, value);
		});
	}

	// populate any existing data
	setTimeout(populate, 25);

	function flush(){
		data = {};
		length = 0;
	}

	return {
		flush: flush,
		add: add,
		populate: populate,
		load: function(q) {
			if (!options.cacheLength || !length)
				return null;
			/*
			 * if dealing w/local data and matchContains than we must make sure
			 * to loop through all the data collections looking for matches
			 */
			if( !options.url && options.matchContains ){
				// track all matches
				var csub = [];
				// loop through all the data grids for matches
				for( var k in data ){
					// don't search through the stMatchSets[""] (minChars: 0) cache
					// this prevents duplicates
					if( k.length > 0 ){
						var c = data[k];
						$.each(c, function(i, x) {
							// if we've got a match, add it to the array
							if (matchSubset(x.value, q)) {
								csub.push(x);
							}
						});
					}
				}
				return csub;
			} else
			// if the exact item exists, use it
			if (data[q]){
				return data[q];
			} else
			if (options.matchSubset) {
				for (var i = q.length - 1; i >= options.minChars; i--) {
					var c = data[q.substr(0, i)];
					if (c) {
						var csub = [];
						$.each(c, function(i, x) {
							if (matchSubset(x.value, q)) {
								csub[csub.length] = x;
							}
						});
						return csub;
					}
				}
			}
			return null;
		}
	};
};

$.Autocompleter.Select = function (options, input, select, config) {
	var CLASSES = {
		ACTIVE: "ac_over"
	};

	var listItems,
		active = -1,
		data,
		term = "",
		needsInit = true,
		element,
		bgframe,
		list;

	// Create results
	function init() {
		if (!needsInit)
			return;
		element = $("<div/>")
		.hide()
		.addClass(options.resultsClass)
		.appendTo(document.body);

		bgframe = $('<iframe src="javascript:;"/>')
		.hide()
		.addClass(options.bgframeClass)
		.appendTo(document.body);

		list = $("<ul/>").appendTo(element).mouseover( function(event) {
			var _event = target(event);
			if(_event.nodeName && _event.nodeName.toUpperCase() == 'LI') {
				active = $("li", list).removeClass(CLASSES.ACTIVE).index(_event);
			    $(_event).addClass(CLASSES.ACTIVE);
	        }
		}).click(function(event) {
			$(target(event)).addClass(CLASSES.ACTIVE);
			select();
			// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
			if ( options.returnFocus !== false )
				input.focus();
			return false;
		}).mousedown(function() {
			config.mouseDownOnSelect = true;
		}).mouseup(function() {
			config.mouseDownOnSelect = false;
		});

		if( options.width > 0 ) {
			element.css("width", options.width);
			bgframe.css("width", options.width);
		}

		needsInit = false;
	}

	function target(event) {
		var element = event.target;
		while(element && element.tagName != "LI")
			element = element.parentNode;
		// more fun with IE, sometimes event.target is empty, just ignore it then
		if(!element)
			return [];
		return element;
	}

	function moveSelect(step) {
		listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
		movePosition(step);
        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
        if(options.scroll) {
            var offset = 0;
            listItems.slice(0, active).each(function() {
				offset += this.offsetHeight;
			});
            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
            } else if(offset < list.scrollTop()) {
                list.scrollTop(offset);
            }
        }
	};

	function movePosition(step) {
		active += step;
		if (active < 0) {
			active = listItems.size() - 1;
		} else if (active >= listItems.size()) {
			active = 0;
		}
	}

	function limitNumberOfItems(available) {
		return options.max && options.max < available
			? options.max
			: available;
	}

	function fillList() {
		list.empty();
		var max = limitNumberOfItems(data.length);
		for (var i=0; i < max; i++) {
			if (!data[i])
				continue;
			var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
			if ( formatted === false )
				continue;
			var li = $("<li/>").html( options.highlight(formatted, term) ).
				addClass(i%2 == 0 ? "ac_even" : "ac_odd").attr({'index': i, 'title': data[i].data}).appendTo(list)[0];
			
			$.data(li, "ac_data", data[i]);
		}

		if ( options.selectFirst ) {
			listItems = list.find("li");
			listItems.slice(0,1).addClass(CLASSES.ACTIVE);
			active = 0;
		}
	}

	return {
		display: function(d, q) {
			init();
			data = d;
			term = q;
			fillList();
		},
		next: function() {
			moveSelect(1);
		},
		prev: function() {
			moveSelect(-1);
		},
		pageUp: function() {
			if (active != 0 && active - 8 < 0) {
				moveSelect( -active );
			} else {
				moveSelect(-8);
			}
		},
		pageDown: function() {
			if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
				moveSelect( listItems.size() - 1 - active );
			} else {
				moveSelect(8);
			}
		},
		hide: function() {
			element && element.hide();
			bgframe && bgframe.hide();
			listItems && listItems.removeClass(CLASSES.ACTIVE);
			active = -1;
		},
		visible : function() {
			return element && element.is(":visible");
		},
		current: function() {
			return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
		},
		show: function() {
			var offset = $(input).offset();

			bgframe.css({
				width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
				top: offset.top + input.offsetHeight,
				left: offset.left,
				height: element.height()+2
			}).show();

			element.css({
				width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
				top: offset.top + input.offsetHeight,
				left: offset.left
			}).show();

            if(options.scroll) {
                list.scrollTop(0);
                list.css({
					maxHeight: options.scrollHeight,
					overflow: 'auto'
				});

                if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
					var listHeight = 0;
					listItems.each(function() {
						listHeight += this.offsetHeight;
					});
					var scrollbarsVisible = listHeight > options.scrollHeight;
                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
					if (!scrollbarsVisible) {
						// IE doesn't recalculate width when scrollbar disappears
						//listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
					}
                }
            }

			bgframe.css({
				height: element.height()+2
			}).show();
		},
		selected: function() {
			var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
			return selected && selected.length && $.data(selected[0], "ac_data");
		},
		emptyList: function (){
			list && list.empty();
		},
		unbind: function() {
			element && element.remove();
			bgframe && bgframe.remove();
		}
	};
};

$.Autocompleter.Selection = function(field, start, end) {
	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;
		}
	}

	if ($(field).size())
		field.focus();
};

})(jQuery);;
(function($) {
    $.fn.location_inline = function(o) {
        return this.each(function() {
            new $location($(this), o);
        });
    };

    // Default configuration properties.
    var defaults = {
		'active_level' : [0,2,1,0,1,0,1],
		'level_type' : [
			[141],
			[140],
			[1,3,4,5,136,139],
			[6],
			[2,10,24,14,26,42,65,104],
			[14,26,42,65,104],
			[61,83,91,93,98,111,112,113,116]
		],
		'important' : [0,0,0,0,1,0,0],
		'suggest_limit' : 20,
		'search_limit' : 50,
		'limit' : [null,null,null,null,null,150,150],
		'select_text' : [
			'- Выберите континент -',
			'- Выберите страну -',
			'- Выберите область -',
			'- Выберите район -',
			'- Выберите город -',
			'- Выберите населенный пункт -',
			'- Выберите улицу -'
		],
		'select_tree' : [0,0,0,0,0,0,0],
		'suggest_text' : [
			'Название континента...',
			'Название страны...',
			'Название области...',
			'Название района...',
			'Название города...',
			'Название населенного пункта...',
			'Название улицы...'
		],
		'link_text' : [
			'изменить континент',
			'изменить страну',
			'изменить регион',
			'изменить район',
			'изменить город',
			'изменить поселок',
			'изменить улицу'
		],
		'link_other_text' : [
			'- Другой -',
			'- Другая -',
			'- Другой -',
			'- Другой -',
			'- Другой -',
			'- Другой -',
			'- Другая -'
		],
		'use_link_text' : [0,0,0,0,0,0,0],
		'brake' : ' <em class="brake">»</em> ',

		'code': '',
		'level': 0,

		'brake' : ' <em class="brake">»</em> ',
		'house' : 'house',

		'onSelect' : false,
		'onChangeLocation' : false
	};

    /**
     * The jcmcarousel object.
     *
     * @constructor
     * @name $.jcmcarousel
     * @param Object e The element to create the carousel for.
     * @param Hash o A set of key/value pairs to set as configuration properties.
     * @cat Plugins/jcmcarousel
     */
    $.location_inline = function(e, o) {

		var self = this;
		this.options    = $.extend({}, defaults, o || {});

		this.container = e;
		this.house = $('.'+this.options.house);
		this.code = '';
		this.cache = {};

		if ( typeof(this.options.onSelect) == "string" && this.options.onSelect != "" )
			this.onSelect = new Function("parent", "level", this.options.onSelect);
		if ( typeof(this.options.onChangeLocation) == "string" && this.options.onChangeLocation != "" )
			this.onChangeLocation = new Function("parent", "level", this.options.onChangeLocation);
//console.log(this.onChangeLocation);
		jQuery.each(this.options.level_type, function(i, v) {
			if (typeof v != 'array')
				self.options.level_type[i] = v.toString();
		});

		this.restoreEnv();
		
		this.container.each(function() {
			this.getObjectLevel = function() {
				return self.objectLevel(self.code);
			}
		});
    };

    // Create shortcut for internal use
    var $location = $.location_inline;

    $location.fn = $location.prototype = {
        location_inline: '0.0.1'
    };

    $location.fn.extend = $location.extend = $.extend;

    $location.fn.extend({
        /**
         * Setups the carousel.
         *
         * @name setup
         * @type undefined
         * @cat Plugins/jcmcarousel
         */
        restoreEnv: function() {

			this.setCode(this.options.code);

			var isLink = false;
			var self = this;
			$('[class*="location-inline"]', this.container).each(function() {
				this.isLevel = self.isLevel(this.className);
			});

			$('[class*="location-inline-s"]', this.container).each(function(i, v) {
				self.registerSuggest($(v), self.stringCode(6), v.isLevel);
				v.value = self.options.suggest_text[v.isLevel];

				$(v).one('focus', function() {
					this.value = '';
				});
			});
			
			$('[class*="location-inline-l"]', this.container).each(function() {
				var link = $(this);
				var class_ = link.attr('class').match(/(location-inline-l-\d+)/g);

				self.registerLink($(this), self.stringCode(class_[0].substr(18)));
			});
			
			$('[class*="location-inline-o"]', this.container).each(function(i, v) {

				$(v).bind('change', function() {

					if ($location.intval(this.value) != -1) {

						var option = $(this.options[this.selectedIndex]);
						
						var link = $(this);
						var class_ = link.attr('class').match(/(location-inline-o-\d+)/g);

						return self.changeLocation({
							code: this.value,
							name: this.options[this.selectedIndex].text,
							level: v.isLevel,
							parent: self.stringCode(class_[0].substr(18)),
							type: option.attr('_type')
						});
					}

					self.createSuggest(self.stringCode(v.isLevel), v.isLevel);
				});
			});
        },

		registerLink: function(link, parent) {
			var self = this;
			
			if (parent == undefined)
				parent = '';
			
			link.one('click', function() {
				var container = $('.location-inline-c-'+this.isLevel, self.container);
				$('~ *', container).remove();
				link.remove();

				if (self.house.size()) {
					self.house.css('display', 'none');

					$('input', self.house).each(function() {
						this.value = '';
					});
				}

				self.setCode(parent);
				
				self.setupList(container, this.isLevel);

			});
		},

		createSuggest: function(code, level) {
			var container = $('.location-inline-c-'+level, this.container);
			var suggest = $('<input type="text"/>');
			suggest
				.addClass('suggest').addClass('location-inline-s-'+level);

			this.registerSuggest(suggest, code, level);
			suggest.val(this.options.suggest_text[level]).one('focus', function() {
				this.value = '';
			});

			$('*', container).remove();
			container.append(suggest);
		},

		registerSuggest: function(suggest, code, level) {

			var self = this;

			/*var o_code = this.objectCode(code);
			
			for(var i=0; i<7; i++) {
				if (this.options.active_level[i] != 4)
					continue ;
				o_code[i] = (i!=6?'???':'????');				
			}*/

			suggest.val('');
			suggest.autocomplete("/service/source/db.location_inline", {
				dataType: 'json',
				extraParams: {
					parent: code,
					level: level,
					type_in: this.options.level_type[level],
					limit: this.options.suggest_limit,
					type: 'query'
				},
				parse: function(json) {
					var parsed = [];

					if ( !json.list || !json.list.length )
						return parsed;

					for (var i in json.list) {
						if ( typeof json.list[i] != 'object' )
							continue;
						
						var Desc = '';
						if ( json.list[i].parent && json.list[i].parent.length ) {
							Desc = '<div class="ac_describe">';
							for (var j in json.list[i].parent)
							{
								if ( typeof json.list[i].parent[j] == 'string' )
									Desc += json.list[i].parent[j] + '<br />';
							}
							Desc += '</div>';
						}
												
						parsed[parsed.length] = {
							data: json.list[i].name + Desc,
							value: json.list[i]
						};
					}

					return parsed;
				},
				formatItem: function(text, i, max, value) {
					return text;
				},
				blurClear: true,
				returnFocus: false,
				max: this.options.suggest_limit
			}).result(function(event, name, value) {
				return self.changeLocation({
					name: name.replace(/<.*>/, ''),
					parent: code,
					code: value.id,
					type: value.type,
					level: level
				});
			});
		},

		setupList: function(container, level) {
			this.showLoader(container);
			var self = this;
			var parent = this.stringCode(level);

			if (typeof this.cache[level+'_'+parent] == 'object')
				return self.loadListSuccess(this.cache[level+'_'+parent], parent, container, level);

			$.ajax({
				mode: 'abort',
				port: 'list',
				type: 'POST',
				url: '/service/source/db.location_inline',
				dataType: 'json',
				data: {
					level: level,
					parent: parent,
					important: this.options.important[level],
					limit: this.options.limit[level],
					type_in: this.options.level_type[level],
					type: 'subordinate_objects',
					tree: this.options.select_tree[level]
				},

				error: function() {
					if (confirm("Не удалось получить список.\nПовторить?"))
						self.setupList(container, level);
				},

				success: function(json) {
					self.loadListSuccess(json, parent, container, level);
				}
			});
		},

		loadListSuccess: function(json, parent, container, level) {
			var self = this;
			var limit = $location.intval(this.options.limit[level]);
			var search_limit = $location.intval(this.options.search_limit);

			//if (!limit || json.count <= limit) {
			if (!limit || limit) {

				var list = $('<select/>');
				list
					.addClass('list').addClass('location-inline-o-'+level);

				list.bind('change', function() {

					if ($location.intval(this.value) != -1) {

						var option = $(this.options[this.selectedIndex]);

						return self.changeLocation({
							code: this.value,
							parent: parent,
							name: this.options[this.selectedIndex].text,
							level: level,
							type: option.attr('_type')
						});
					}

					self.createSuggest(parent, level);
				});

				list.append($('<option/>').attr({value: undefined}).html(this.options.select_text[level]));

				if (this.options.important[level]) {
					list.append($('<option></option>').val(-1).html( self.options.select_other_text[level] ).css('font-weight','bold'));
				}

				var group = null;
				var _type = 0;
				
				jQuery.each(json.list, function(i, v) {
					if ( self.options.select_tree[level] && v.type != _type ) {
						group = $('<optgroup></optgroup>').attr({ label: json.types[parseInt(v.type)].SocrText });
						list.append(group);
						_type = v.type;
					}
					
					var option = $('<option></option>').attr({
							value: v.id,
							_type: v.type
						}).html(v.name);
					
					if ( self.options.select_tree[level] ) {
						group.append(option);
					} else {
						list.append(option);
					}
				});				
								
				if (this.options.important[level]) {
					list.append($('<option></option>').val(-1).html( self.options.select_other_text[level] ).css('font-weight','bold'));
				}

				container.append(list);

				if (this.cache[level+'_'+parent] == undefined)
					this.cache[level+'_'+parent] = json;
			} else
				this.createSuggest(parent, level);

			//this.setCode(parent);

			if ( typeof(self.onSelect) == "function" ) {
				try {
					self.onSelect(parent,level);
				} catch(e) {}
			}

			this.removeLoader();
		},

		changeLocation: function(params) {

			var container = $('.location-inline-c-'+params.level, this.container);
			
			if ( this.options.use_link_text[params.level] ) {
				var link = $('<span></span>')
					.addClass('location-inline-l-'+params.level)
					.html('<span class="link-title">'+params.name+'</span>&nbsp;');
				
				var link_href = $('<a href=""></a>')
					.attr({href: 'javascript:;'})
					.addClass('subscript')
					.html(this.options.link_text[params.level]);
				
				link.append(link_href);
			} else {
				var link = $('<a href=""></a>').attr({
					href: 'javascript:;',
					title: params.name
				})
				.addClass('link').addClass('location-inline-l-'+params.level).html(params.name);
			}
			
			link.get(0).isLevel = params.level;

			$('*', container).remove();

			container.append(link);
			this.registerLink(link, params.parent);
			this.setCode(params.code);

			//if (params.type == 2)
				//params.level = 4;

			level = false;
			if (this.objectLevel(this.objectCode(params.code)) != 7)
				level = this.nextLevel(params.level);

			if (level == false) {
				if (this.house.size()) {
					this.house.css('display', '');

					$('input', this.house).each(function() {
						this.value = '';
					});
				}

				if ( typeof(this.onChangeLocation) == "function" ) {
					try {
						this.onChangeLocation(params.parent,level);
					} catch(e) {}
				}

				return ;
			}

			this.house.css('display', 'none');
			$('input', this.house).each(function() {
				this.value = '';
			});

			this.container.append(this.options.brake);

			var container = $('.location-inline-c-'+level, this.container);

			if (container.size() == 0) {			
				container = $('<span></span>')
					.addClass('container').addClass('location-inline-c-'+level);
				this.container.append(container);
			}

			if ( typeof(this.onChangeLocation) == "function" ) {
				//try {
					this.onChangeLocation(params.parent,level);
				//} catch(e) {}
			}

			this.setupList(container, level);
		},

		nextLevel: function(level) {

			for(level+=1;this.options.active_level[level] !== undefined;level++) {
				if (this.options.active_level[level] !== 0 && this.options.active_level[level] !== 4)
					return level;
			}
			return false;
		},

		showLoader: function(container) {

			this.removeLoader();

			var loader = $('<input type="text" />');
			loader.attr({
				readonly: true, disabled: true,
				value: 'Загрузка...'
			}).addClass('loader');

			container.append(loader);
		},

		removeLoader: function() {
			$('.loader', this.container).remove();
		},

		isLevel: function(cl) {
			return parseInt(cl.replace(
				new RegExp("location-inline-(s|l|c|o)-(\\d)"), '$2'));
		},

		setCode: function(code) {
			var input = $('.location-inline-v', this.container);

			if (typeof code != 'string') {
				input.val(code.toString().replace(/,/g,'').replace(/\?/g,'0'));

				this.code = code;
				code = this.stringCode(7);
			} else {

				input.val(code.replace(/\?/g,'0'));
				this.code = this.objectCode(code);
			}

			return code;
		},

		objectLevel: function(code) {
			if ( code[6] !== undefined && code[6] !== '0000' )
				return 7;

			if ( code[5] !== undefined && code[5] !== '000' )
				return 6

			if ( code[4] !== undefined && code[4] !== '000' )
				return 5;

			if ( code[3] !== undefined && code[3] !== '000' )
				return 4;

			if ( code[2] !== undefined && code[2] !== '000' )
				return 3;

			if ( code[1] !== undefined && code[1] !== '000' )
				return 2;

			if ( code[0] !== undefined && code[0] !== '000' )
				return 1;

			return 0;
		},

		objectCode: function(code) {
			return new Array(
				code.substr(0, 3) ? code.substr(0, 3) : '000',
				code.substr(3, 3) ? code.substr(3, 3) : '000',
				code.substr(6, 3) ? code.substr(6, 3) : '000',
				code.substr(9, 3) ? code.substr(9, 3) : '000',
				code.substr(12, 3) ? code.substr(12, 3) : '000',
				code.substr(15, 3) ? code.substr(15, 3) : '000',
				code.substr(18, 4) ? code.substr(18, 4) : '0000'
			);
		},

		stringCode: function(level) {

			var self = this;
			var codeString = '';
			var code = this.code.slice(0, level);
			var current_level = this.objectLevel(this.code);

			//alert(code+' - '+);
			//alert(level+' - '+current_level+' - '+self.options.active_level[current_level]);
			jQuery.each(this.code, function(i) {

				if (code[i] === undefined || 
					(i == 3 && level != 6 && self.options.active_level[3]==0 && self.code[4] == '000')
				)// || i > level-2)
					codeString += (i!=6?'000':'0000');
				//else if ($location.intval(self.options.active_level[i]) == 0)
					//codeString += (i!=6?'???':'????');
				else
					codeString += code[i];

				if (level == i && ($location.intval(self.options.active_level[i+1]) === 3 || $location.intval(self.options.active_level[i+1]) === 4)) {
					codeString =
						codeString.substr(0, ((i+1)*3)).replace(/./g, '?');
				}
			});
			return codeString;
		}


    });

    $location.extend({
        defaults: function(d) {
            return $.extend(defaults, d || {});
        },

        margin: function(e, p) {
            if (!e)
                return 0;

            var el = e.jquery != undefined ? e[0] : e;

            if (p == 'marginRight' && $.browser.safari) {
                var old = {'display': 'block', 'float': 'none', 'width': 'auto'}, oWidth, oWidth2;

                $.swap(el, old, function() { oWidth = el.offsetWidth; });

                old['marginRight'] = 0;
                $.swap(el, old, function() { oWidth2 = el.offsetWidth; });

                return oWidth2 - oWidth;
            }

            return $jcm.intval($.css(el, p));
        },

        intval: function(v) {
            v = parseInt(v);
            return isNaN(v) ? 0 : v;
        }
    });

})(jQuery);;
// управление виджетами
var widgetAPI = {
    widgets: {},
    createWidget: function(id, path, state, params, rendered, contentrendered, tic)
    {
		if(typeof tic == 'undefined')
			tic = '';
        this.widgets[id] = new widgetObject(id, path, state, params, rendered, contentrendered, tic);
        return this.widgets[id];
    },

    removeWidget: function(id)
    {
        delete this.widgets[id];
    },

    closeAll: function()
    {
        for(i in this.widgets)
        {
            if(typeof this.widgets[i] != 'undefined')
                this.widgets[i].show(false);
        }
    },

    openAll: function()
    {
        for(i in this.widgets)
        {
            if(typeof this.widgets[i] != 'undefined')
                this.widgets[i].show(true);
        }
    }
}

//обьект виджета
function widgetObject(id, path, state, params, rendered, contentrendered, tic)
{
    this.id = id;
    this.rendered = rendered;
    this.path = path;
    this.state = state;
    this.params = params;
	this.tic = tic;

    if(rendered == true || contentrendered == true)
    {
        this.configure = $('#container_'+this.id+' .widgetConfigure');
        this.container = $('#container_'+this.id+' .widgetContainer');
        this.content = $('#container_'+this.id+' .widgetContent');
        this.initialized = true;

        $('#container_'+this.id+' .widgetButtonClose').unbind('click');
        $('#container_'+this.id+' .widgetButtonReload').unbind('click');
        $('#container_'+this.id+' .widgetButtonConfigure').unbind('click');

        $('#container_'+this.id+' .widgetButtonClose').bind('click', {obj:this}, function(e){e.data.obj.toggleVisible();});
        $('#container_'+this.id+' .widgetButtonReload').bind('click', {obj:this}, function(e){e.data.obj.reload();});
        $('#container_'+this.id+' .widgetButtonConfigure').bind('click', {obj:this}, function(e){e.data.obj.toggleConfigure();});
    }

    if(rendered == false && contentrendered == false)
        this.loadContainer();

    if(contentrendered == true && rendered == false)
    {
        this.showed = false;
        this.content.css('display', 'none');
    }
}

widgetObject.prototype = {
    id: null,                   // уникальный идентификатор в пределах загруженной страницы
    configure: undefined,       // блок конфигурации
    container: undefined,       // блок контейнера
    content: undefined,         // блок содержимого
    beforeLoad: null,           //
    rendered: false,            // отрендерен блок содержимого?
    initialized: false,         // отрендерен контейнер?
    showed: true,               // показан блок содержимого?
    configureshowed: false,     // показана конфигурация?
    configurerendered: false,   // отрендерена конфигурация?
    path: '',                   // имя виджета
    state: '',                  // текущее состояние
    params: {},                 // дополнительные параметры
	tic: '',

    beforeReload: undefined,
    beforeConfigureApply: undefined,
    beforeConfigureSave: undefined,
    afterConfigureApply: undefined,
    beforeConfigureShow: undefined,
    afterConfigureShow: undefined,
    beforeContainerLoad: undefined,
    beforeContentShow: undefined,
    afterContentShow: undefined,
    beforeHandle: undefined,
    beforeContainerLoaded: undefined,
    afterContainerLoaded: undefined,
    beforeConfigureLoaded: undefined,
    afterConfigureLoaded: undefined,
    beforeLoaded: undefined,
    afterLoaded: undefined,

    addHandler: function(selector, evt, func)
    {
        var obj = $('#container_'+this.id+' '+selector);
        obj.unbind(evt);
        obj.bind(evt, {obj:this}, function(e){func.apply(e.data.obj);});
    },

    // сохранить настройки
    configureApply: function()
    {
        if(jQuery.isFunction(this.beforeConfigureApply))
            this.beforeConfigureApply.apply(this);

        // сбор всех значений из полей контейнера конфигурации имеющих класс widgetFieldToSave
        // формируется строка GET запроса
        var fields = $('#container_'+this.id+' .widgetConfigure .widgetFieldToSave');
        var result = '';
        fields.each(function(i){
            if(this.type == 'checkbox')
            {
                if(this.checked == true)
                {
                    if(result.length > 0) result += '&';
                    result += escape(this.name) + '=' + this.value;
                }
            }
            else if(this.type == 'radio')
            {
                if(this.selected == true)
                {
                    if(result.length > 0) result += '&';
                    result += escape(this.name) + '=' + this.value;
                }
            }
            else
            {
                if(result.length > 0) result += '&';
                result += escape(this.name) + '=' + escape(this.value);
            }
        });

        if(jQuery.isFunction(this.beforeConfigureSave))
            this.beforeConfigureSave.apply(this);

        var __obj = this;

        this.save('configureapply', {params: result}, function(data){__obj.reload();});
        if(jQuery.isFunction(this.afterConfigureApply))
            this.afterConfigureApply.apply(this);

        this.showConfigure(false);
    },

    // скрыть / показать блок настроек
    toggleConfigure: function()
    {
        this.showConfigure(!this.configureshowed);
    },

    // показать блок настроек (true - показать false - скрыть)
    showConfigure: function(show)
    {
        if(jQuery.isFunction(this.beforeConfigureShow))
            show = this.beforeConfigureShow.apply(this, [show]);

        if(show == true && this.configurerendered == false)
        {
            var __obj=this;
            params = this.params;
            params.widgetContainerInit = false;
			params.tic = this.tic;
            this.handleAjax(
                'configure',
                null,
                params,
                function(data){__obj.successConfigureLoad(data);},
                this.failedLoad);
            return;
        }

        if(show == true)
            this.configure.slideDown('normal');
        else
            this.configure.slideUp('normal');

        this.configureshowed = show;

        if(jQuery.isFunction(this.afterConfigureShow))
            this.afterConfigureShow.apply(this, [show]);
    },

    toggleVisible: function()
    {
        this.show(!this.showed);
    },

    reload: function()
    {
        if(jQuery.isFunction(this.beforeReload))
            this.beforeReload.apply(this);

        if(this.showed == false)
        {
            this.rendered = false;
        }
        else
        {
            this.handle(this.state, this.params);
        }
    },

    loadContainer: function()
    {
        if(jQuery.isFunction(this.beforeContainerLoad))
            this.beforeContainerLoad.apply(this);

        if(this.rendered == false)
        {
            var __obj=this;
            params = this.params;
            params.widgetContainerInit = !this.initialized;
            this.handleTo(
                this.state,
                null,
                params,
                function(data){__obj.successContainerLoad(data);});
            return;
        }
    },

    show: function(show)
    {
        if(show) show = true; else show = false;

        if(jQuery.isFunction(this.beforeContentShow))
            show = this.beforeContentShow.apply(this, [show]);

        if(show == true && this.rendered == false)
        {
            var __obj=this;
            params = this.params;
            params.widgetContainerInit = !this.initialized;
            params.widgetContainerShowed = true;
            this.handleTo(
                this.state,
                null,
                params,
                function(data){__obj.successLoad(__obj.content, data);});
            return;
        }

        if(show == true)
        {
            this.content.slideDown('normal');
            $('#container_'+this.id+' .widgetButtonCloseObj').removeClass('widgetButtonCloseClosedImg');
            $('#container_'+this.id+' .widgetButtonCloseObj').addClass('widgetButtonCloseOpenedImg');
        }
        else
        {
            this.content.slideUp('normal');
            $('#container_'+this.id+' .widgetButtonCloseObj').addClass('widgetButtonCloseClosedImg');
            $('#container_'+this.id+' .widgetButtonCloseObj').removeClass('widgetButtonCloseOpenedImg');
        }

        if(this.showed != show)
            this.save('togglevisible', {widgetContainerShowed: show});
        this.showed = show;

        if(jQuery.isFunction(this.afterContentShow))
            this.afterContentShow.apply(this, [show]);
    },

    remove: function()
    {
        widgetAPI.removeWidget(this.id);
    },

    load: function(state, params, success, failed)
    {
        if(typeof(success) == 'undefined')
            return;
        if(typeof(failed) == 'undefined')
            failed = null;
        this.handleAjax(state, null, params, success, failed);
    },

    save: function(state, params, success, failed)
    {
        if(typeof(success) == 'undefined')
            success = null;
        if(typeof(failed) == 'undefined')
            failed = null;
        this.handleAjax(state, null, params, success, failed);
    },

    handle: function(state, params, success, failed)
    {
        this.handleTo(state, this.content, params, success, failed);
    },

    handleTo: function(state, obj, params, success, failed)
    {
        this.state = state;

        var __obj = this;
        if(typeof(success) == 'undefined')
            success = function(data){__obj.successLoad(obj, data);};
        if(typeof(failed) == 'undefined')
            failed = function(){__obj.failedLoad(obj);};

        this.handleAjax(state, this.content, params, success, failed);
    },

    handleAjax: function(state, obj, params, success, failed)
    {
        if(jQuery.isFunction(this.beforeHandle))
            state = this.beforeHandle.apply(this, [state, obj, params, success, failed]);

        params.widgetContainerId = this.id;
		params.tic = this.tic;
		params = $.extend({}, this.params, params);
		
		var _params = new Array();
		for(v in params) {

			if ('object' == typeof params[v]) {
				for(v1 in params[v]) {
					_params.push(v+'['+v1+']='+encodeURIComponent(params[v][v1]));
				}
			} else
				_params.push(v+'='+encodeURIComponent(params[v]));
		}
		
        $.ajax({
			url: '/service/widget/'+this.path+'/'+state+'.php',
			beforeload: this.beforeLoad,
			cache: false,
			dataType: 'json',
			data: _params.join('&').replace(/%20/g, "+"),
			success: success,
			error: failed,
			type: 'GET'});
    },

    successContainerLoad: function(data)
    {
        if(jQuery.isFunction(this.beforeContainerLoaded))
            this.beforeContainerLoaded.apply(this, [data]);

        if(data.type == 'html')
        {
            container = $('#container_'+this.id);
            container.html(data.content);
            container.slideDown('normal');
            this.configure = $('#container_'+this.id+' .widgetConfigure');
            this.container = $('#container_'+this.id+' .widgetContainer');
            this.content = $('#container_'+this.id+' .widgetContent');

            this.initialized = true;

            this.rendered = data.showed;
            this.showed = data.showed;
            this.params.widgetContainerInit = false;

            if(data.showed == false)
            {
                this.content.hide();
                $('#container_'+this.id+' .widgetButtonCloseObj').addClass('widgetButtonCloseClosedImg');
                $('#container_'+this.id+' .widgetButtonCloseObj').removeClass('widgetButtonCloseOpenedImg');
            }
            else
            {
                $('#container_'+this.id+' .widgetButtonCloseObj').removeClass('widgetButtonCloseClosedImg');
                $('#container_'+this.id+' .widgetButtonCloseObj').addClass('widgetButtonCloseOpenedImg');
            }

            $('#container_'+this.id+' .widgetButtonClose').unbind('click');
            $('#container_'+this.id+' .widgetButtonReload').unbind('click');
            $('#container_'+this.id+' .widgetButtonConfigure').unbind('click');

            $('#container_'+this.id+' .widgetButtonClose').bind('click', {obj:this}, function(e){e.data.obj.toggleVisible();});
            $('#container_'+this.id+' .widgetButtonReload').bind('click', {obj:this}, function(e){e.data.obj.reload();});
            $('#container_'+this.id+' .widgetButtonConfigure').bind('click', {obj:this}, function(e){e.data.obj.toggleConfigure();});
        }

        if(jQuery.isFunction(this.afterContainerLoaded))
            this.afterContainerLoaded.apply(this, [data]);
    },

    successConfigureLoad: function(data)
    {
        if(jQuery.isFunction(this.beforeConfigureLoaded))
            this.beforeConfigureLoaded.apply(this, [data]);

        if(data.type == 'html')
        {
            this.configure.html(data.content);
            this.configure.slideDown('normal');
            //this.configure.css('display', '');

            this.configurerendered = true;
            this.configureshowed = true;

            $('#container_'+this.id+' .widgetButtonConfigureApply').unbind('click');
            $('#container_'+this.id+' .widgetButtonConfigureApply').bind('click', {obj:this}, function(e){e.data.obj.configureApply();});
        }
        if(jQuery.isFunction(this.afterConfigureLoaded))
            this.afterConfigureLoaded.apply(this, [data]);
    },

    successLoad: function(obj, data, notsetrendered)
    {
        if(jQuery.isFunction(this.beforeLoaded))
            this.beforeLoaded.apply(this, [obj, data]);

        if(data.type == 'html')
        {
            obj.html(data.content);
            if(this.showed != true)
                this.save('togglevisible', {widgetContainerShowed: true});
            this.showed = true;
            this.rendered = true;
            this.content.slideDown('normal');
            $('#container_'+this.id+' .widgetButtonCloseObj').removeClass('widgetButtonCloseClosedImg');
            $('#container_'+this.id+' .widgetButtonCloseObj').addClass('widgetButtonCloseOpenedImg');

            $('#container_'+this.id+' .widgetButtonClose').unbind('click');
            $('#container_'+this.id+' .widgetButtonReload').unbind('click');
            $('#container_'+this.id+' .widgetButtonConfigure').unbind('click');

            $('#container_'+this.id+' .widgetButtonClose').bind('click', {obj:this}, function(e){e.data.obj.toggleVisible();});
            $('#container_'+this.id+' .widgetButtonReload').bind('click', {obj:this}, function(e){e.data.obj.reload();});
            $('#container_'+this.id+' .widgetButtonConfigure').bind('click', {obj:this}, function(e){e.data.obj.toggleConfigure();});
        }
        if(jQuery.isFunction(this.afterLoaded))
            this.afterLoaded.apply(this, [obj, data]);
    },

    failedLoad: function()
    {

    }
};;
