/**
 * @author Vlad Yakovlev (red.scorpix@gmail.com)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * @link www.scorpix.ru
 * @requires jQuery
 * @version 0.1
 */

/**
 * Исправляет неправильное масштабирование SVG-элементов при масштабировании страницы в браузерах
 * на движке Вебкит.
 */
var webkitSvgFix = (function() {

	var
		/**
		 * Коэффициент изменения размеров.
		 */
		factor = 1,
		/**
		 * Элемент-родитель для проверки.
		 * @type {jQuery}
		 */
		rootEl,
		/**
		 * SVG-элемент для проверки.
		 * @type {Element}
		 */
		svgEl,
		/**
		 * Привязанные к изменению коэффициента обработчики.
		 */
		funcs = [],
		svgNs = 'http://www.w3.org/2000/svg',
		/**
		 * Интервал мониторинга, в мс.
		 */
		timeout = 100;

	/**
	 * Следит за размерами контрольных блоков.
	 * При изменении коэффициента запускаются подписанные функции.
	 */
	function check() {

		// Вычисляем коэффициент.
		var newFactor = rootEl.width() / svgEl.clientWidth;

		// Если коэффициент изменился, запускаем обработчики.
		if (newFactor != factor) {
			factor = newFactor;

			$.each(funcs, function() {
				this(factor);
			});
		}

		// Мониторим дальше.
		setTimeout(check, timeout);
	}

	/**
	 * Инициализирует элементы для проверки масштабирования страницы.
	 */
	function init() {
		var
			width = 1000,
			height = 1;

		// Создаем дивчик такой, чтобы его никто не увидел.
		rootEl = $('<div></div>').css({
			height: height,
			left: -10000,
			margin: 0,
			padding: 0,
			position: 'absolute',
			top: -10000,
			visibility: 'hidden',
			width: width
		}).appendTo('body');

		// И кладем в него SVG-элемент.
		svgEl = document.createElementNS(svgNs, 'svg');
		svgEl.setAttribute('version', '1.1');
		svgEl.setAttribute('width', width);
		svgEl.setAttribute('height', height);
		svgEl.style.position = 'absolute';
		rootEl.append(svgEl);

		// Начинаем мониторинг.
		check();
	}

	return {
		bind: function(func) {
			if ($.browser.safari) {
				// Инициализация только по первому привязанному обработчику.
				rootEl || init();
				funcs.push(func);
			}
		}
	};
})();
