Google

Cyb3r Drag0nz Team Shell

Server : Apache
System : Linux webd003.cluster126.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64
User : atwiofrxug (73666)
PHP Version : 8.4.10
Disable Functions : _dyuweyrj4,_dyuweyrj4r,dl
Current Directory : /home/atwiofrxug/mylittletelaviv/wp-content/plugins/qtranslate-xt/admin/js/
Directory Status: Writeable | Document Root: Writeable

Upload File







Viewing: /home/atwiofrxug/mylittletelaviv/wp-content/plugins/qtranslate-xt/admin/js/common.js

/*
	Copyright 2014  qTranslate Team  (email : qTranslateTeam@gmail.com )

	This program is free software; you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation; either version 2 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program; if not, write to the Free Software
	Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
 * Search for 'Designed as interface for other plugin integration' in comments to functions
 * to find out which functions are safe to use in the 3rd-party integration.
 * Avoid accessing internal variables directly, as they are subject to be re-designed at any time.
 * Single global variable 'qTranslateConfig' is an entry point to the interface.
 * - qTranslateConfig.qtx - is a shorthand reference to the only global object of type 'qTranslateX'.
 * - qTranslateConfig.js - is a place where custom Java script functions are stored, if needed.
 * Read Integration Guide, https://qtranslatexteam.wordpress.com/integration/, for more information.
 */
/*
// debugging tools, do not check in
var cc=0;
function c(v){ ++cc; console.log('== '+cc+': '+v); }
function ct(v){ c(v); console.trace(); }
function co(t,o){ ++cc; console.log('== '+cc+': '+t+'%o',o); }
*/

/**
 * since 3.2.7
 */
qtranxj_get_split_blocks = function (text) {
	var split_regex = /(<!--:[a-z]{2}-->|<!--:-->|\[:[a-z]{2}\]|\[:\]|\{:[a-z]{2}\}|\{:\})/gi; // @since 3.3.6 swirly brackets
	return text.xsplit(split_regex);
};

/**
 * since 3.2.7
 */
qtranxj_split = function (text) {
	var blocks = qtranxj_get_split_blocks(text);
	return qtranxj_split_blocks(blocks);
};

/**
 * since 3.1-b1 - closing tag [:]
 */
qtranxj_split_blocks = function (blocks) {
	var result = new Object;
	//for(var i=0; i<qTranslateConfig.enabled_languages.length; ++i)
	for (var lang in qTranslateConfig.language_config) {
		//var lang=qTranslateConfig.enabled_languages[i];
		result[lang] = '';
	}
	//if(!qtranxj_isArray(blocks))//since 3.2.7
	if (!blocks || !blocks.length)
		return result;
	if (blocks.length == 1) { //no language separator found, enter it to all languages
		var b = blocks[0];
		//for(var j=0; j<qTranslateConfig.enabled_languages.length; ++j){
		for (var lang in qTranslateConfig.language_config) {
			//var lang=qTranslateConfig.enabled_languages[j];
			result[lang] += b;
		}
		return result;
	}
	var clang_regex = /<!--:([a-z]{2})-->/gi;
	var blang_regex = /\[:([a-z]{2})\]/gi;
	var slang_regex = /\{:([a-z]{2})\}/gi; // @since 3.3.6 swirly brackets
	var lang = false;
	var matches;
	for (var i = 0; i < blocks.length; ++i) {
		var b = blocks[i];
		if (!b.length) continue;
		matches = clang_regex.exec(b);
		clang_regex.lastIndex = 0;
		if (matches != null) {
			lang = matches[1];
			continue;
		}
		matches = blang_regex.exec(b);
		blang_regex.lastIndex = 0;
		if (matches != null) {
			lang = matches[1];
			continue;
		}
		matches = slang_regex.exec(b);
		slang_regex.lastIndex = 0;
		if (matches != null) {
			lang = matches[1];
			continue;
		}
		if (b == '<!--:-->' || b == '[:]' || b == '{:}') {
			lang = false;
			continue;
		}
		if (lang) {
			if (!result[lang]) result[lang] = b;
			else result[lang] += b;
			lang = false;
		} else { //keep neutral text
			for (var key in result) {
				result[key] += b;
			}
		}
	}
	return result;
};

function qtranxj_get_cookie(cname) {
	var nm = cname + "=";
	var ca = document.cookie.split(';');
	//c('ca='+ca);
	for (var i = 0; i < ca.length; ++i) {
		var s = ca[i];
		var sa = s.split('=');
		if (sa[0].trim() != cname)
			continue;
		if (ca.length < 2)
			continue;
		return sa[1].trim();
	}
	return '';
}

String.prototype.xsplit = function (_regEx) {
	// Most browsers can do this properly, so let them work, they'll do it faster
	if ('a~b'.split(/(~)/).length === 3) {
		return this.split(_regEx);
	}

	if (!_regEx.global) {
		_regEx = new RegExp(_regEx.source, 'g' + (_regEx.ignoreCase ? 'i' : ''));
	}

	// IE (and any other browser that can't capture the delimiter)
	// will, unfortunately, have to be slowed down
	var start = 0, arr = [];
	var result;
	while ((result = _regEx.exec(this)) != null) {
		arr.push(this.slice(start, result.index));
		if (result.length > 1)
			arr.push(result[1]);
		start = _regEx.lastIndex;
	}
	if (start < this.length)
		arr.push(this.slice(start));
	if (start == this.length)
		arr.push(''); //delim at the end
	return arr;
};

//Since 3.2.7 removed: function qtranxj_isArray(obj){ return obj.constructor.toString().indexOf('Array') >= 0; }

function qtranxj_ce(tagName, props, pNode, isFirst) {
	var el = document.createElement(tagName);
	if (props) {
		for (var prop in props) {
			//try
			{
				el[prop] = props[prop];
			}
			//catch(err)
			{
				//Handle errors here
			}
		}
	}
	if (pNode) {
		if (isFirst && pNode.firstChild) {
			pNode.insertBefore(el, pNode.firstChild);
		}
		else {
			pNode.appendChild(el);
		}
	}
	return el;
}

(function ($) {
	var qTranslateX = function (pg) {
		var qtx = this;

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * return array keyed by two-letter language code. Example of usage:
		 * var langs = getLanguages();
		 * for(var lang_code in langs){
		 *  var lang_conf = langs[lang_code];
		 *  // variables available:
		 *  //lang_conf.name //name of language in native language
		 *  //lang_conf.admin_name //in the admin language chosen
		 *  //lang_conf.flag
		 *  //lang_conf.locale
		 *  // and may be more properties later
		 * }
		 * @since 3.3
		 */
		this.getLanguages = function () {
			return qTranslateConfig.language_config;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * return URL to folder with flag images.
		 */
		this.getFlagLocation = function () {
			return qTranslateConfig.flag_location;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * return true if 'lang' is in the hash of enabled languages.
		 * This function maybe needed, as function qtranxj_split may return languages,
		 * which are not enabled, in case they were previously enabled and had some data.
		 * Such data is preserved and re-saved until user deletes it manually.
		 */
		this.isLanguageEnabled = function (lang) {
			return !!qTranslateConfig.language_config[lang];
		};

		var setLangCookie = function (lang) {
			document.cookie = 'qtrans_edit_language=' + lang;
		};

		if (qTranslateConfig.LSB) {
			qTranslateConfig.activeLanguage = qtranxj_get_cookie('qtrans_edit_language');
			if (!qTranslateConfig.activeLanguage || !this.isLanguageEnabled(qTranslateConfig.activeLanguage)) {
				qTranslateConfig.activeLanguage = qTranslateConfig.language;
				if (this.isLanguageEnabled(qTranslateConfig.activeLanguage)) {
					setLangCookie(qTranslateConfig.activeLanguage);
				} else {//no languages are enabled
					qTranslateConfig.LSB = false;
				}
			}
		} else {
			qTranslateConfig.activeLanguage = qTranslateConfig.language;
			setLangCookie(qTranslateConfig.activeLanguage);
		}

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3
		 */
		this.getActiveLanguage = function () {
			return qTranslateConfig.activeLanguage;
		};
		//this.getActiveLanguageName = function() { return qTranslateConfig.language_name[qTranslateConfig.activeLanguage]; }

		var contentHooks = {};
		var contentHookId = 0;

		var updateFusedValueH = function (id, value) {
			if (qTranslateConfig.RAW)
				return;
			var h = contentHooks[id];
			var text = value.trim();
			//c('updateFusedValueH['+id+'] lang='+h.lang+'; text:'+text);
			h.fields[h.lang].value = text;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3.4
		 */
		this.hasContentHook = function (id) {
			return contentHooks[id];
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3.2
		 */
		this.addContentHook = function (inpField, encode, field_name) {
			//co('addContentHook: inpField:',inpField);
			//co('addContentHook: encode:',encode);
			//co('addContentHook: field_name:',field_name);
			if (!inpField) return false;
			switch (inpField.tagName) {
				case 'TEXTAREA':
					break;
				case 'INPUT':
					//co('addContentHook: inpField.type=',inpField.type);
					//reject the types which cannot be multilingual
					switch (inpField.type) {
						case 'button':
						case 'checkbox':
						case 'password':
						case 'radio':
						case 'submit':
							return false;
					}
					//if(inpField.type.match(/(button|checkbox|password|radio|submit)/)) return false;
					break;
				default:
					return false;
			}

			if (!field_name) {
				if (!inpField.name) return false;
				field_name = inpField.name;
			}
			//if( typeof inpField.value !== 'string' ) return false;
			if (inpField.id) {
				if (contentHooks[inpField.id]) {
					if ($.contains(document, inpField))
						return contentHooks[inpField.id];
					//otherwise some Java script already removed previously hooked element
					qtx.removeContentHook(inpField);
				}
			} else if (!contentHooks[field_name]) {
				inpField.id = field_name;
			} else {
				var idx = 0;
				do {
					++idx;
					inpField.id = field_name + idx;
				} while (contentHooks[inpField.id]);
				//$(inpField).uniqueId();//does not work
				//$(inpField).each(function (i,e) { e.uniqueId(); });//does not work
			}

			/**
			 * Highlighting the translatable fields
			 * @since 3.2-b3
			 */
			inpField.className += ' qtranxs-translatable';

			//co('addContentHook: id=',inpField.id);
			var h = contentHooks[inpField.id] = {};
			//h.id = inpField.id;
			h.name = field_name;
			h.contentField = inpField;
			//c('addContentHook: inpField.value='+inpField.value);
			h.lang = qTranslateConfig.activeLanguage;

			var qtx_prefix;
			if (encode) {
				switch (encode) {
					case 'slug':
						qtx_prefix = 'qtranslate-slugs[';
						break;
					case 'term':
						qtx_prefix = 'qtranslate-terms[';
						break;
					default:
						qtx_prefix = 'qtranslate-fields[';
						break;
				}
			} else {
				//if(inpField.tagName==='TEXTAREA')
				//	encode='<';
				//else
				encode = '[';//since 3.1 we get rid of <--:--> encoding
				qtx_prefix = 'qtranslate-fields[';
			}

			h.encode = encode;

			var bfnm, sfnm, p = h.name.indexOf('[');
			if (p < 0) {
				bfnm = qtx_prefix + h.name + ']';
			} else {
				bfnm = qtx_prefix + h.name.substring(0, p) + ']';
				if (h.name.lastIndexOf('[]') < 0) {
					bfnm += h.name.substring(p);
				} else {
					var len = h.name.length - 2;
					if (len > p)
						bfnm += h.name.substring(p, len);
					sfnm = '[]';
				}
			}

			var contents;

			h.fields = {};
			if (!qTranslateConfig.RAW) {
				contents = qtranxj_split(inpField.value);
				inpField.value = contents[h.lang];
				for (var lang in contents) {
					var text = contents[lang];
					var fnm = bfnm + '[' + lang + ']';
					if (sfnm)
						fnm += sfnm;
					var f = qtranxj_ce('input', {name: fnm, type: 'hidden', className: 'hidden', value: text});
					h.fields[lang] = f;
					inpField.parentNode.insertBefore(f, inpField);
				}
			}

			// since 3.2.9.8 - h.contents -> h.fields
			// since 3.3.8.7 - slug & term
			switch (encode) {
				case 'slug':
				case 'term': {
					if (qTranslateConfig.RAW)
						contents = qtranxj_split(inpField.value);
					h.sepfield = qtranxj_ce('input', {
						name: bfnm + '[qtranslate-original-value]',
						type: 'hidden',
						className: 'hidden',
						value: contents[qTranslateConfig.default_language]
					});
				}
					break;
				default: {
					if (!qTranslateConfig.RAW) {
						h.sepfield = qtranxj_ce('input', {
							name: bfnm + '[qtranslate-separator]',
							type: 'hidden',
							className: 'hidden',
							value: encode
						});
					}
				}
					break;
			}

			if (h.sepfield)
				inpField.parentNode.insertBefore(h.sepfield, inpField);

			/*
			if(window.tinyMCE){
			  //c('addContentHook: window.tinyMCE: tinyMCE.editors.length='+tinyMCE.editors.length);
			  //tinyMCE.editors are not yet set up at this point.
			  for(var i=0; i<tinyMCE.editors.length; ++i){
				var ed=tinyMCE.editors[i];
				if(ed.id != inpField.id) continue;
				//c('addContentHook: updateTinyMCE: ed.id='+ed.id);//never fired yet
				h.mce=ed;
				//updateTinyMCE(ed,text);
				updateTinyMCE(h);
			  }
			}
			*/
			return h;
		};
		this.addContentHookC = function (inpField) {
			return qtx.addContentHook(inpField, '[');
		}; //'<'
		this.addContentHookB = function (inpField) {
			return qtx.addContentHook(inpField, '[');
		};

		this.addContentHookById = function (id, sep, nm) {
			return qtx.addContentHook(document.getElementById(id), sep, nm);
		};
		this.addContentHookByIdName = function (nm) {
			var sep;
			//if(nm.indexOf('<')==0 || nm.indexOf('[')==0){
			switch (nm[0]) {
				case '<':
				case '[':
					sep = nm.substring(0, 1);
					nm = nm.substring(1);
					break;
				default:
					break;
			}
			return qtx.addContentHookById(nm, sep);
		};
		this.addContentHookByIdC = function (id) {
			return qtx.addContentHookById(id, '[');
		}; //'<'
		this.addContentHookByIdB = function (id) {
			return qtx.addContentHookById(id, '[');
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.1-b2
		 */
		this.addContentHooks = function (fields, sep, field_name) {
			for (var i = 0; i < fields.length; ++i) {
				var field = fields[i];
				qtx.addContentHook(field, sep, field_name);
			}
		};

		var addContentHooksByClassName = function (nm, container, sep) {
			if (!container)
				container = document;
			var fields = container.getElementsByClassName(nm);
			qtx.addContentHooks(fields, sep);
		};

		this.addContentHooksByClass = function (nm, container) {
			var sep;
			if (nm.indexOf('<') == 0 || nm.indexOf('[') == 0) {
				sep = nm.substring(0, 1);
				nm = nm.substring(1);
			}
			addContentHooksByClassName(nm, container, sep);
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3.2
		 */
		this.addContentHooksByTagInClass = function (nm, tag, container) {
			var elems = container.getElementsByClassName(nm);
			for (var i = 0; i < elems.length; ++i) {
				var elem = elems[i];
				var items = elem.getElementsByTagName(tag);
				qtx.addContentHooks(items);
			}
		};

		var removeContentHookH = function (h) {
			if (!h)
				return false;
			if (h.sepfield)
				$(h.sepfield).remove();
			var contents = {};
			for (var lang in h.fields) {
				var f = h.fields[lang];
				contents[lang] = f.value;
				$(f).remove();
			}
			$(h.contentField).removeClass('qtranxs-translatable');
			delete contentHooks[h.contentField.id];
			return contents;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3
		 */
		this.removeContentHook = function (inpField) {
			if (!inpField || !inpField.id || !contentHooks[inpField.id])
				return false;
			var h = contentHooks[inpField.id];
			removeContentHookH(h);
			/* @since 3.2.9.8 - h.contents -> h.fields
			inpField.onblur = function(){};
			inpField.name=inpField.name.replace(/^edit-/,'');
			inpField.value=h.mlContentField.value;
			$(h.mlContentField).remove();
			*/
			$(inpField).removeClass('qtranxs-translatable');
			return true;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * Re-create a hook, after a piece of HTML is dynamically replaced with a custom Java script.
		 */
		this.refreshContentHook = function (inpField) {
			if (!inpField || !inpField.id)
				return false;
			var h = contentHooks[inpField.id];
			if (h)
				removeContentHookH(h);
			return qtx.addContentHook(inpField);
		};

		/**
		 * @since 3.4.6.9
		 */
		var getDisplayContentDefaultValue = function (contents) {
			if (contents[qTranslateConfig.language])
				return '(' + qTranslateConfig.language + ') ' + contents[qTranslateConfig.language];
			if (contents[qTranslateConfig.default_language])
				return '(' + qTranslateConfig.default_language + ') ' + contents[qTranslateConfig.default_language];
			var default_value = null;
			for (var lang in contents) {
				if (!contents[lang]) continue;
				return '(' + lang + ') ' + contents[lang];
			}
			return '';
		};

		/**
		 * @since 3.4.6.9
		 */
		var completeDisplayContent = function (contents) {
			var default_value = null;
			for (var lang in contents) {
				if (contents[lang])
					continue;
				if (!default_value)
					default_value = getDisplayContentDefaultValue(contents);
				contents[lang] = default_value;
			}
		};

		/**
		 * @since 3.2.7
		 */
		var displayHookNodes = [];
		var addDisplayHookNode = function (nd) {
			if (!nd.nodeValue)
				return 0;
			var blocks = qtranxj_get_split_blocks(nd.nodeValue);
			if (!blocks || !blocks.length || blocks.length == 1)
				return 0;
			//co('addDisplayHookNode: nd: ',nd);
			//co('addDisplayHookNode: blocks: ',blocks);
			var h = {};
			h.nd = nd;
			//co('addDisplayHookNode: nd=',nd);
			//c('addDisplayHookNode: nodeValue: "'+nd.nodeValue+'"');
			//c('addDisplayHookNode: content='+content);
			h.contents = qtranxj_split_blocks(blocks);
			completeDisplayContent(h.contents);
			nd.nodeValue = h.contents[qTranslateConfig.activeLanguage];
			displayHookNodes.push(h);
			return 1;
		};

		/**
		 * @since 3.2.7
		 */
		var displayHookAttrs = [];
		var addDisplayHookAttr = function (nd, attr) {
			if (!nd.hasAttribute(attr)) return 0;
			var value = nd.getAttribute(attr);
			var blocks = qtranxj_get_split_blocks(value);
			if (!blocks || !blocks.length || blocks.length == 1)
				return 0;
			//co('addDisplayHookAttr: nd: ',nd);
			var h = {};
			h.nd = nd;
			h.attr = attr;
			h.contents = qtranxj_split_blocks(blocks);
			completeDisplayContent(h.contents);
			//nd.value=h.contents[qTranslateConfig.activeLanguage];
			nd.setAttribute(attr, h.contents[qTranslateConfig.activeLanguage]);
			displayHookAttrs.push(h);
			return 1;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.2.7 switched to use of nodeValue instead of innerHTML.
		 */
		this.addDisplayHook = function (elem) {
			//co('addDisplayHook: this: ',this);
			if (!elem || !elem.tagName)
				return 0;
			switch (elem.tagName) {
				case 'TEXTAREA':
					return 0;
				case 'INPUT':
					switch (elem.type) {
						case 'submit':
							if (elem.value)
								return addDisplayHookAttr(elem, 'value');
						default:
							return 0;
					}
				default:
					break;
			}
			//co('addDisplayHook: elem: ',elem);
			var cnt = 0;
			if (elem.childNodes && elem.childNodes.length) {
				for (var i = 0; i < elem.childNodes.length; ++i) {
					var nd = elem.childNodes[i];
					switch (nd.nodeType) {//http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1950641247
						case 1://ELEMENT_NODE
							cnt += qtx.addDisplayHook(nd);//recursive call
							break;
						case 2://ATTRIBUTE_NODE
						case 3://TEXT_NODE
							cnt += addDisplayHookNode(nd);
							break;
						default:
							break;
					}
				}
			}
			return cnt;
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.0
		 */
		this.addDisplayHookById = function (id) {
			return qtx.addDisplayHook(document.getElementById(id));
		};

		var updateTinyMCE = function (h) {
			text = h.contentField.value;
			//co('updateTinyMCE: window.switchEditors: ',window.switchEditors);
			//c('updateTinyMCE: text:'+text);
			if (h.wpautop && window.switchEditors) {
				//text = window.switchEditors.pre_wpautop( text );
				text = window.switchEditors.wpautop(text);
				//c('updateTinyMCE:wpautop:'+text);
			}
			h.mce.setContent(text, {format: 'html'});
		}

		var onTabSwitch = function (lang) {
			//var qtx = this;
			setLangCookie(lang);
			for (var i = displayHookNodes.length; --i >= 0;) {
				var h = displayHookNodes[i];
				if (h.nd.parentNode) {
					h.nd.nodeValue = h.contents[lang];//IE gets upset here if node was removed
				} else {
					displayHookNodes.splice(i, 1);//node was removed by some other function
				}
			}
			for (var i = displayHookAttrs.length; --i >= 0;) {
				var h = displayHookAttrs[i];
				if (h.nd.parentNode) {
					h.nd.setAttribute(h.attr, h.contents[lang]);
				} else {
					displayHookAttrs.splice(i, 1);//node was removed by some other function
				}
			}
			if (qTranslateConfig.RAW)
				return;
			for (var key in contentHooks) {
				var h = contentHooks[key];
				var mce = h.mce && !h.mce.hidden;
				if (mce) {
					h.mce.save({format: 'html'});
				}

				var text = h.contentField.value.trim();
				var blocks = qtranxj_get_split_blocks(text);
				if (!blocks || blocks.length <= 1) {
					// value is not ML, switch it to other language
					h.fields[h.lang].value = text;
					h.lang = lang;
					var value = h.fields[h.lang].value;
					if (h.contentField.placeholder && value != '') {//since 3.2.7
						h.contentField.placeholder = '';
					}
					h.contentField.value = value;
					if (mce) {
						updateTinyMCE(h);
					}
				} else {
					// value is ML, fill out values per language
					var contents = qtranxj_split_blocks(blocks);
					for (var lng in h.fields) {
						h.fields[lng].value = contents[lng];
					}
					h.lang = lang;
				}
			}
		};

		/*
		  onTabSwitchCustom=function()
		  {
			//co('onTabSwitch: this',this);
			//co('onTabSwitch: qtx',qTranslateConfig.qtx);
			pg.onTabSwitch(this.lang,qTranslateConfig.qtx);
		  }
		*/

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.0
		 */
		this.addDisplayHooks = function (elems) {
			//c('addDisplayHooks: elems.length='+elems.length);
			for (var i = 0; i < elems.length; ++i) {
				var e = elems[i];
				//co('addDisplayHooks: e=',e);
				//co('addDisplayHooks: e.tagName=',e.tagName);
				qtx.addDisplayHook(e);
			}
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.4.7
		 */
		this.addDisplayHookAttrs = function (elem, attrs) {
			for (var j = 0; j < attrs.length; ++j) {
				var a = attrs[j];
				addDisplayHookAttr(elem, a);
			}
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.4.7
		 */
		this.addDisplayHooksAttrs = function (elems, attrs) {
			for (var i = 0; i < elems.length; ++i) {
				var e = elems[i];
				qtx.addDisplayHookAttrs(e, attrs);
			}
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3
		 */
		this.addDisplayHooksByClass = function (nm, container) {
			//co('addDisplayHooksByClass: container:',container);
			var elems = container.getElementsByClassName(nm);
			//co('addDisplayHooksByClass: elems('+nm+'):',elems);
			//co('addDisplayHooksByClass: elems.length=',elems.length);
			qtx.addDisplayHooks(elems);
		};

		/**
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 * @since 3.3
		 */
		this.addDisplayHooksByTagInClass = function (nm, tag, container) {
			var elems = container.getElementsByClassName(nm);
			//c('addDisplayHooksByClass: elems.length='+elems.length);
			for (var i = 0; i < elems.length; ++i) {
				var elem = elems[i];
				var items = elem.getElementsByTagName(tag);
				qtx.addDisplayHooks(items);
			}
		};


		/**
		 * adds custom hooks from configuration
		 * @since 3.1-b2 - renamed to addCustomContentHooks, since addContentHooks used in qTranslateConfig.js
		 * @since 3.0 - addContentHooks
		 */
		this.addCustomContentHooks = function () {
			//c('qTranslateConfig.custom_fields.length='+qTranslateConfig.custom_fields.length);
			for (var i = 0; i < qTranslateConfig.custom_fields.length; ++i) {
				var nm = qTranslateConfig.custom_fields[i];
				qtx.addContentHookByIdName(nm);
			}
			for (var i = 0; i < qTranslateConfig.custom_field_classes.length; ++i) {
				var nm = qTranslateConfig.custom_field_classes[i];
				qtx.addContentHooksByClass(nm);
			}
			if (qTranslateConfig.LSB)
				setTinyMceInit();
		};

		/**
		 * adds translatable hooks for fields marked with classes
		 * i18n-multilingual
		 * i18n-multilingual-curly
		 * i18n-multilingual-term
		 * i18n-multilingual-slug
		 * i18n-multilingual-display
		 * @since 3.4
		 */
		var addMultilingualHooks = function () {
			$('.i18n-multilingual').each(function (i, e) {
				qtx.addContentHook(e, '[');
			});
			$('.i18n-multilingual-curly').each(function (i, e) {
				qtx.addContentHook(e, '{');
			});
			$('.i18n-multilingual-term').each(function (i, e) {
				qtx.addContentHook(e, 'term');
			});
			$('.i18n-multilingual-slug').each(function (i, e) {
				qtx.addContentHook(e, 'slug');
			});
			$('.i18n-multilingual-display').each(function (i, e) {
				qtx.addDisplayHook(e);
			});
		};

		/**
		 * Parses page configuration, loaded in qtranxf_get_admin_page_config_post_type.
		 * @since 3.1-b2
		 */
		var addPageHooks = function (page_config_forms) {
			for (var form_id in page_config_forms) {
				var frm = page_config_forms[form_id];
				var form;
				if (frm.form) {
					if (frm.form.id) {
						form = document.getElementById(frm.form.id);
					} else if (frm.form.jquery) {
						form = $(frm.form.jquery);
					} else if (frm.form.name) {
						var elms = document.getElementsByName(frm.form.name);
						if (elms && elms.length) {
							form = elms[0];
						}
					}
				} else {
					form = document.getElementById(form_id);
				}
				if (!form) {
					form = getWrapForm();
					if (!form)
						form = document;
				}
				//co('form=',form);
				//c('frm.fields.length='+frm.fields.length);
				for (var handle in frm.fields) {
					var fld = frm.fields[handle];
					//co('fld['+handle+']: ',fld);
					//c('encode='+fld.encode);
					//c('id='+fld.id);
					//c('class='+fld.class);
					var containers = [];
					if (fld.container_id) {
						var container = document.getElementById(fld.container_id);
						if (container)
							containers.push(container);
					} else if (fld.container_jquery) {
						containers = $(fld.container_jquery);
					} else if (fld.container_class) {
						containers = document.getElementsByClassName(fld.container_class);
					} else {// if(form){
						containers.push(form);
					}
					var sep = fld.encode;
					switch (sep) {
						case 'none':
							continue;
						case 'display':
							if (fld.jquery) {
								for (var i = 0; i < containers.length; ++i) {
									var container = containers[i];
									//co('addPageHooks:display: container: ',container);
									//$(container).find(fld.jquery).each(function(i,e){qtx.addDisplayHook(e);});//also ok
									var fields = $(container).find(fld.jquery);
									//co('addPageHooks:display: jquery='+fld.jquery+': fields.length=',fields.length);
									if (fld.attrs) {
										qtx.addDisplayHooksAttrs(fields, fld.attrs);
									} else {
										qtx.addDisplayHooks(fields);
									}
								}
							} else {
								var id = fld.id ? fld.id : handle;
								//co('addPageHooks:display: id=',id);
								var field = document.getElementById(id);
								if (fld.attrs) {
									qtx.addDisplayHookAttrs(field, fld.attrs);
								} else {
									qtx.addDisplayHook(field);
								}
							}
							break;
						case '['://b - bracket
						case '<'://c - comment
						case '{'://s - swirly/curly bracket
						case 'byline':
						default:
							if (fld.jquery) {
								for (var i = 0; i < containers.length; ++i) {
									var container = containers[i];
									//$(container).find(fld.jquery).each(function(i,e){qtx.addContentHook(e,sep);});//also works
									//co('addPageHooks:content: jquery='+fld.jquery+': container=',container);
									var fields = $(container).find(fld.jquery);
									//co('addPageHooks:content: jquery='+fld.jquery+': fields.length=',fields.length);
									qtx.addContentHooks(fields, sep, fld.name);
								}
							} else {
								var id = fld.id ? fld.id : handle;
								//co('addPageHooks:content: id=',id);
								qtx.addContentHookById(id, sep, fld.name);
							}
							break;
					}
				}
			}
		};

		this.addContentHooksTinyMCE = function () {
			function setEditorHooks(ed) {
				var id = ed.id;
				if (!id)
					return;
				var h = contentHooks[id];
				if (!h)
					return;
				if (h.mce) {
					//already initialized
					return;
				}
				h.mce = ed;

				/**
				 * Highlighting the translatable fields
				 * @since 3.2-b3
				 */
				ed.getContainer().className += ' qtranxs-translatable';
				ed.getElement().className += ' qtranxs-translatable';

				var updateTinyMCEonInit = h.updateTinyMCEonInit;
				if (updateTinyMCEonInit == null) {// 'tmce-active' or 'html-active' was not provided on the wrapper.
					var text_e = ed.getContent({format: 'html'}).replace(/\s+/g, '');
					var text_h = h.contentField.value.replace(/\s+/g, '');
					/**
					 * @since 3.2.9.8 - this is an ugly trick.
					 * Before this version, it was working relying on properly timed synchronisation of the page loading process,
					 * which did not work correctly in some browsers like IE or MAC OS, for example.
					 * Now, function setTinyMceInit is called after HTML loaded, before TinyMCE initialization, and it always set
					 * tinyMCEPreInit.mceInit, which causes to call this function, setEditorHooks, on TinyMCE initialization of each editor.
					 * However, function setEditorHooks gets invoked in two ways:
					 *
					 * 1. On page load, when Visual mode is initially on.
					 *      In this case we need to apply updateTinyMCE, which possibly applies wpautop.
					 *      Without q-X, WP applies wpautop in this case in php code in /wp-includes/class-wp-editor.php,
					 *      function 'editor', line "add_filter('the_editor_content', 'wp_richedit_pre');".
					 *      q-X disables this call in 'function qtranxf_the_editor',
					 *      since wpautop does not work correctly on multilingual values, and there is no filter to adjust its behaviour.
					 *      So, here we have to apply back wpautop to single-language value, which is achieved
					 *      with a call to updateTinyMCE(h) below.
					 *
					 * 2. When user switches to Visual mode for the first time from a page, which was initially loaded in Text mode.
					 *      In this case, wpautop gets applied internally inside TinyMCE, and we do not need to call updateTinyMCE(h) below.
					 *
					 * We could not figure out a good way to distinct within this function which way it was called,
					 * except this tricky comparison on the next line.
					 *
					 * If somebody finds out a better way, please let us know at qtranslateteam@gmail.com.
					 */
					updateTinyMCEonInit = text_e != text_h;
				}
				if (updateTinyMCEonInit) {
					updateTinyMCE(h);
				}
				return h;
			}

			/** Sets hooks on HTML-loaded TinyMCE editors via tinyMCEPreInit.mceInit. */
			setTinyMceInit = function () {
				//co('setTinyMceInit: this: ', this);
				if (!window.tinyMCE) return;
				for (var key in contentHooks) {
					var h = contentHooks[key];
					if (h.contentField.tagName !== 'TEXTAREA' || h.mce || h.mceInit || !tinyMCEPreInit.mceInit[key])
						continue;
					h.mceInit = tinyMCEPreInit.mceInit[key];
					if (h.mceInit.wpautop) {
						h.wpautop = h.mceInit.wpautop;
						var wrappers = tinymce.DOM.select('#wp-' + key + '-wrap');
						if (wrappers && wrappers.length) {
							h.wrapper = wrappers[0];
							if (h.wrapper) {
								if (tinymce.DOM.hasClass(h.wrapper, 'tmce-active'))
									h.updateTinyMCEonInit = true;
								if (tinymce.DOM.hasClass(h.wrapper, 'html-active'))
									h.updateTinyMCEonInit = false;
								//otherwise h.updateTinyMCEonInit stays undetermined
							}
						}
					} else {
						h.updateTinyMCEonInit = false;
					}
					tinyMCEPreInit.mceInit[key].init_instance_callback = function (ed) {
						setEditorHooks(ed);
					}
					//co('setTinyMceInit: id=', key);
				}
			};
			setTinyMceInit();

			/** Adds more TinyMCE editors, which may have been initialized dynamically. */
			loadTinyMceHooks = function () {
				if (!window.tinyMCE)
					return;
				if (!tinyMCE.editors)
					return;
				for (var i = 0; i < tinyMCE.editors.length; ++i) {
					var ed = tinyMCE.editors[i];
					setEditorHooks(ed);
				}
			}
			window.addEventListener('load', loadTinyMceHooks);
		};

		if (!qTranslateConfig.onTabSwitchFunctions)
			qTranslateConfig.onTabSwitchFunctions = [];
		if (!qTranslateConfig.onTabSwitchFunctionsSave)
			qTranslateConfig.onTabSwitchFunctionsSave = [];
		if (!qTranslateConfig.onTabSwitchFunctionsLoad)
			qTranslateConfig.onTabSwitchFunctionsLoad = [];

		this.addLanguageSwitchListener = function (func) {
			qTranslateConfig.onTabSwitchFunctions.push(func);
		};

		/**
		 * @since 3.2.9.8.6
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * The function passed will be called when user presses one of the Language Switching Buttons
		 * before the content of all fields hooked is replaced with an appropriate language.
		 * Two arguments are supplied:
		 * - two-letter language code of currently active language from which the edit language is being switched.
		 * - the language code to which the edit language is being switched.
		 * The value of "this" is set to the only global instance of qTranslateX object.
		 */
		this.addLanguageSwitchBeforeListener = function (func) {
			qTranslateConfig.onTabSwitchFunctionsSave.push(func);
		};

		/**
		 * @since 3.3.2
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * Delete handler previously added by function addLanguageSwitchBeforeListener.
		 */
		this.delLanguageSwitchBeforeListener = function (func) {
			for (var i = 0; i < qTranslateConfig.onTabSwitchFunctionsSave.length; ++i) {
				var f = qTranslateConfig.onTabSwitchFunctionsSave[i];
				if (f != func)
					continue;
				qTranslateConfig.onTabSwitchFunctionsSave.splice(i, 1);
				return;
			}
		};

		/**
		 * @since 3.2.9.8.6
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * The function passed will be called when user presses one of the Language Switching Buttons
		 * after the content of all fields hooked is replaced with an appropriate language.
		 * Two arguments are supplied:
		 * - two-letter language code of active language to which the edit language is already switched.
		 * - the language code from which the edit language is being switched.
		 * The value of "this" is set to the only global instance of qTranslateX object.
		 */
		this.addLanguageSwitchAfterListener = function (func) {
			qTranslateConfig.onTabSwitchFunctionsLoad.push(func);
		}

		/**
		 * @since 3.3.2
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 * Delete handler previously added by function addLanguageSwitchAfterListener.
		 */
		this.delLanguageSwitchAfterListener = function (func) {
			for (var i = 0; i < qTranslateConfig.onTabSwitchFunctionsLoad.length; ++i) {
				var f = qTranslateConfig.onTabSwitchFunctionsLoad[i];
				if (f != func)
					continue;
				qTranslateConfig.onTabSwitchFunctionsLoad.splice(i, 1);
				return;
			}
		};

		/**
		 * @since 3.2.9.8.9
		 * Designed as interface for other plugin integration. The documentation is available at
		 * https://qtranslatexteam.wordpress.com/integration/
		 *
		 */
		this.enableLanguageSwitchingButtons = function (on) {
			var display = on ? 'block' : 'none';
			for (var lang in qTranslateConfig.tabSwitches) {
				var tabSwitches = qTranslateConfig.tabSwitches[lang];
				for (var i = 0; i < tabSwitches.length; ++i) {
					var tabSwitch = tabSwitches[i];
					var tabSwitchParent = tabSwitches[i].parentElement;
					tabSwitchParent.style.display = display;
					break;
				}
				break;
			}
		};

		var getWrapForm = function () {
			var wraps = document.getElementsByClassName('wrap');
			for (var i = 0; i < wraps.length; ++i) {
				var w = wraps[i];
				var forms = w.getElementsByTagName('form');
				if (forms.length)
					return forms[0];
			}
			var forms = document.getElementsByTagName('form');
			if (forms.length === 1)
				return forms[0];
			for (var i = 0; i < forms.length; ++i) {
				var f = forms[i];
				wraps = f.getElementsByClassName('wrap');
				if (wraps.length)
					return f;
			}
			return null;
		};

		var getFormWrap = function () {
			var forms = document.getElementsByTagName('form');
			for (var i = 0; i < forms.length; ++i) {
				var f = forms[i];
				var wraps = f.getElementsByClassName('wrap');
				if (wraps.length)
					return wraps[0];
			}
			var wraps = document.getElementsByClassName('wrap');
			for (var i = 0; i < wraps.length; ++i) {
				var w = wraps[i];
				forms = w.getElementsByTagName('form');
				if (forms.length)
					return w;
			}
			return null;
		};

		if (typeof(pg.addContentHooks) == "function")
			pg.addContentHooks(this);

		if (qTranslateConfig.page_config && qTranslateConfig.page_config.forms)
			addPageHooks(qTranslateConfig.page_config.forms);

		addMultilingualHooks();

		//co('displayHookNodes.length=',displayHookNodes.length);
		//co('displayHookNodes: ',displayHookNodes);
		//co('displayHookAttrs.length=',displayHookAttrs.length);
		//co('contentHooks: ',contentHooks);
		if (!displayHookNodes.length && !displayHookAttrs.length) {
			var ok = false;
			for (var key in contentHooks) {
				ok = true;
				break;
			}
			if (!ok) {
				return;
			}
		}

		this.onLoadLanguage = function (lang, langFrom) {
			var onTabSwitchFunctionsLoad = qTranslateConfig.onTabSwitchFunctionsLoad;
			for (var i = 0; i < onTabSwitchFunctionsLoad.length; ++i) {
				onTabSwitchFunctionsLoad[i].call(qTranslateConfig.qtx, lang, langFrom);
			}
		};

		/**
		 * former switchTab
		 * @since 3.3.2
		 */
		this.switchActiveLanguage = function (lang) {
			//co('switchActiveLanguage: this=',this);
			if (qTranslateConfig.activeLanguage === lang) {
				return;
			}
			if (qTranslateConfig.activeLanguage) {
				var ok2switch = true;
				var onTabSwitchFunctionsSave = qTranslateConfig.onTabSwitchFunctionsSave;
				for (var i = 0; i < onTabSwitchFunctionsSave.length; ++i) {
					var ok = onTabSwitchFunctionsSave[i].call(qTranslateConfig.qtx, qTranslateConfig.activeLanguage, lang);
					if (ok === false)
						ok2switch = false;
				}
				if (!ok2switch)
					return;//cancel button switch, if one of onTabSwitchFunctionsSave returned 'false'.

				var tabSwitches = qTranslateConfig.tabSwitches[qTranslateConfig.activeLanguage];
				for (var i = 0; i < tabSwitches.length; ++i) {
					tabSwitches[i].classList.remove(qTranslateConfig.lsb_style_active_class);
					$(tabSwitches[i]).find('.button').removeClass('active');
				}
			}
			var langFrom = qTranslateConfig.activeLanguage;
			qTranslateConfig.activeLanguage = lang;
			{
				var tabSwitches = qTranslateConfig.tabSwitches[qTranslateConfig.activeLanguage];
				for (var i = 0; i < tabSwitches.length; ++i) {
					tabSwitches[i].classList.add(qTranslateConfig.lsb_style_active_class);
					$(tabSwitches[i]).find('.button').addClass('active');
				}
			}
			var onTabSwitchFunctions = qTranslateConfig.onTabSwitchFunctions;
			for (var i = 0; i < onTabSwitchFunctions.length; ++i) {
				onTabSwitchFunctions[i].call(qTranslateConfig.qtx, lang, langFrom);
			}
			qtx.onLoadLanguage(lang, langFrom);
		};

		this.clickSwitchLanguage = function () {
			var tabSwitch = $(this).hasClass('button') ? this.parentNode : this;
			var lang = tabSwitch.lang;
			if (!lang) {
				alert('qTranslate-X: This should not have happened: Please, report this incident to the developers: !lang');
				return;
			}
			if ($('.qtranxs-lang-switch-wrap').hasClass('copying')) {
				qtx.copyContentFrom(lang);
				$(tabSwitch).find('.button').blur();	// remove focus of source language in case of layout with button
			} else {
				qtx.switchActiveLanguage(lang);
			}
			$('.qtranxs-lang-switch-wrap').removeClass('copying');
			$('.qtranxs-lang-copy .button').removeClass('active');
		};

		this.toggleCopyFrom = function () {
			$('.qtranxs-lang-switch-wrap').toggleClass('copying');
			$('.qtranxs-lang-copy .button').toggleClass('active');
			// store or restore original title according to current mode (copy or switch)
			if ($('.qtranxs-lang-switch-wrap').hasClass('copying')) {
				$('.qtranxs-lang-switch').each(function () {
					$(this).attr('orig-title', $(this).attr('title'));
					if ($(this).attr('lang') == qTranslateConfig.activeLanguage)
						$(this).attr('title', qTranslateConfig.strings.CopyFromAlt);
					else
						$(this).attr('title', qTranslateConfig.strings.CopyFrom + ' [:' + $(this).attr('lang') + ']');
				});
			}
			else {
				$('.qtranxs-lang-switch').each(function () {
					$(this).attr('title', $(this).attr('orig-title'));
				});
			}
		};

		this.copyContentFrom = function (langFrom) {
			var lang = qTranslateConfig.activeLanguage;
			var changed = false;
			for (var key in contentHooks) {
				var h = contentHooks[key];
				var mce = h.mce && !h.mce.hidden;
				var value = mce ? h.mce.getContent({format: 'html'}) : h.contentField.value;
				if (value)
					continue; //do not overwrite existent content
				value = h.fields[langFrom].value;
				if (!value)
					continue; //there is nothing to copy
				h.contentField.value = value;
				if (mce)
					updateTinyMCE(h);
				changed = true;
			}
			if (changed)
				qtx.onLoadLanguage(lang, langFrom);
		};

		/**
		 * @since 3.3.2
		 */
		this.createSetOfLSBwith = function (lsb_style_extra_wrap_classes) {
			var langSwitchWrap = qtranxj_ce('ul', {className: 'qtranxs-lang-switch-wrap ' + lsb_style_extra_wrap_classes});
			var langs = qTranslateConfig.language_config;
			if (!qTranslateConfig.tabSwitches)
				qTranslateConfig.tabSwitches = {};
			for (var lang in langs) {
				var lang_conf = langs[lang];
				var flag_location = qTranslateConfig.flag_location;
				var li_title = qTranslateConfig.strings.ShowIn + lang_conf.admin_name + ' [:' + lang + ']';
				var tabSwitch = qtranxj_ce('li', {
					lang: lang,
					className: 'qtranxs-lang-switch qtranxs-lang-switch-' + lang,
					title: li_title,
					onclick: qtx.clickSwitchLanguage
				}, langSwitchWrap);
				var tabItem = tabSwitch;
				if (qTranslateConfig.lsb_style_subitem == 'button') {
					// reuse WordPress secondary button
					tabItem = qtranxj_ce('button', {className: 'button button-secondary', type: 'button'}, tabSwitch);
				}
				qtranxj_ce('img', {src: flag_location + lang_conf.flag}, tabItem);
				qtranxj_ce('span', {innerHTML: lang_conf.name}, tabItem);
				if (qTranslateConfig.activeLanguage == lang) {
					tabSwitch.classList.add(qTranslateConfig.lsb_style_active_class);
					$(tabSwitch).find('.button').addClass('active');
				}
				if (!qTranslateConfig.tabSwitches[lang])
					qTranslateConfig.tabSwitches[lang] = [];
				qTranslateConfig.tabSwitches[lang].push(tabSwitch);
			}
			if (!qTranslateConfig.hide_lsb_copy_content) {
				var tab = qtranxj_ce('li', {className: 'qtranxs-lang-copy'}, langSwitchWrap);
				var btn = qtranxj_ce('button', {
					className: 'button button-secondary',
					type: 'button',
					title: qTranslateConfig.strings.CopyFromAlt,
					onclick: qtx.toggleCopyFrom
				}, tab);
				qtranxj_ce('span', {innerHTML: qTranslateConfig.strings.CopyFrom}, btn);
			}
			return langSwitchWrap;
		};

		/**
		 * @since 3.4.8
		 */
		this.createSetOfLSB = function () {
			return qtx.createSetOfLSBwith(qTranslateConfig.lsb_style_wrap_class + ' widefat');
		};

		var setupMetaBoxLSB = function () {
			var mb = document.getElementById('qtranxs-meta-box-lsb');
			if (!mb)
				return;

			var inside_elems = mb.getElementsByClassName('inside');
			if (!inside_elems.length)
				return; //consistency check in case WP did some changes

			mb.className += ' closed';
			$(mb).find('.hndle').remove(); //original h3 element is replaced with span below

			var sp = document.createElement('span');
			mb.insertBefore(sp, inside_elems[0]);
			sp.className = 'hndle ui-sortable-handle';

			var langSwitchWrap = qtx.createSetOfLSBwith(qTranslateConfig.lsb_style_wrap_class);
			sp.appendChild(langSwitchWrap);
			$('#qtranxs-meta-box-lsb .hndle').unbind('click.postboxes');
		};

		//co('qTranslateConfig.LSB=',qTranslateConfig.LSB);
		if (qTranslateConfig.LSB) {
			//additional initialization
			this.addContentHooksTinyMCE();
			setupMetaBoxLSB();

			//create sets of LSB
			var anchors = [];
			if (qTranslateConfig.page_config && qTranslateConfig.page_config.anchors) {
				for (var id in qTranslateConfig.page_config.anchors) {
					var anchor = qTranslateConfig.page_config.anchors[id];
					//co('anchor: ', anchor);
					var f = document.getElementById(id);
					if (f) {
						anchors.push({f: f, where: anchor.where});
					} else if (anchor.jquery) {
						var list = $(anchor.jquery);
						for (var i = 0; i < list.length; ++i) {
							var f = list[i];
							anchors.push({f: f, where: anchor.where});
						}
					}
				}
			}
			//co('anchors: ', anchors);
			if (!anchors.length) {
				var f = pg.langSwitchWrapAnchor;
				if (!f) {
					f = getWrapForm();
				}
				if (f) anchors.push({f: f, where: 'before'});
			}
			for (var i = 0; i < anchors.length; ++i) {
				var anchor = anchors[i];
				//co('anchor['+i+']: ', anchor);
				if (!anchor.where || anchor.where.indexOf('before') >= 0) {
					var langSwitchWrap = qtx.createSetOfLSB();
					anchor.f.parentNode.insertBefore(langSwitchWrap, anchor.f);
				}
				if (anchor.where && anchor.where.indexOf('after') >= 0) {
					var langSwitchWrap = qtx.createSetOfLSB();
					anchor.f.parentNode.insertBefore(langSwitchWrap, anchor.f.nextSibling);
				}
				if (anchor.where && anchor.where.indexOf('first') >= 0) {
					var langSwitchWrap = qtx.createSetOfLSB();
					anchor.f.insertBefore(langSwitchWrap, anchor.f.firstChild);
				}
				if (anchor.where && anchor.where.indexOf('last') >= 0) {
					var langSwitchWrap = qtx.createSetOfLSB();
					anchor.f.insertBefore(langSwitchWrap, null);
				}
			}

			/**
			 * @since 3.2.4 Synchronization of multiple sets of Language Switching Buttons
			 */
			this.addLanguageSwitchListener(onTabSwitch);
			if (pg.onTabSwitch) {
				this.addLanguageSwitchListener(pg.onTabSwitch);
			}
		}
	};

	/**
	 * Designed as interface for other plugin integration. The documentation is available at
	 * https://qtranslatexteam.wordpress.com/integration/
	 *
	 * qTranslateX instance is saved in global variable qTranslateConfig.qtx,
	 * which can be used by theme or plugins to dynamically change content hooks.
	 *
	 * Note: be sure to enqueue this script before using it in other plugin (!)
	 *
	 * @since 3.4
	 */
	qTranslateConfig.js.get_qtx = function () {
		if (!qTranslateConfig.qtx)
			qTranslateConfig.qtx = new qTranslateX(qTranslateConfig.js);
		//co('get_qtx: qtx: ', qTranslateConfig.qtx);
		return qTranslateConfig.qtx;
	};

	$(function() {
		qTranslateConfig.js.get_qtx();
	});
})(jQuery);

Cyb3r Drag0nz Team • Google Edition