/**
 * @author Stepan Reznikov (stepan.reznikov@gmail.com)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 */


try {
	document.execCommand("BackgroundImageCache", false, true);
}
catch (e) {}


var Utilities = {

	extend: function (subClass, superClass) {
		var F = function () {};
		F.prototype = superClass.prototype;
		subClass.prototype = new F();
		subClass.prototype.constructor = subClass;

		subClass.superclass = superClass.prototype;
		if (superClass.prototype.constructor === Object.prototype.constructor) {
			superClass.prototype.constructor = superClass;
		}
	},

	fixPNG: function (element, sizingMethod) {
		if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) {
			var src;

			if (element.tagName === 'IMG') {
				if (/\.png$/.test(element.src)) {
					src = element.src;
					element.src = "/f/1/global/i/0.gif";
				}
			}
			else {
				src = element.currentStyle.backgroundImage.match(/url\("(.+\.png)"\)/i);
				if (src) {
					src = src[1];
					element.runtimeStyle.backgroundImage = "none";
				}
			}

			sizingMethod = sizingMethod || 'scale';

			if (src) {
				element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='" + sizingMethod + "')";
			}
		}
	},

	/**
	 * @param {jQuery} control1 Первая кнопка
	 * @param {jQuery} control2 Вторая кнопка
	 * @param {jQuery} [control1Callback] Функция вызывающаяся при клике на первую кнопку
	 * @param {jQuery} [control2Callback] Функция вызывающаяся при клике на вторую кнопку
	 */

	toggleControls: function (control1, control2, control1Callback, control2Callback) {

		control1.find('a').click(function (event) {
			event.stopPropagation();
			event.preventDefault();
			$.ajax({
				url: $(this).attr('href'),
				type: "GET",
				dataType: "html",
				success: function () {
					control1.addClass('hidden');
					control2.removeClass('hidden');
					if (control1Callback && typeof control1Callback === 'function') {
						control1Callback();
					}
				}
			});
		});

		control2.find('a').click(function (event) {
			event.stopPropagation();
			event.preventDefault();
			$.ajax({
				url: $(this).attr('href'),
				type: "GET",
				dataType: "html",
				success: function () {
					control2.addClass('hidden');
					control1.removeClass('hidden');
					if (control2Callback && typeof control2Callback === 'function') {
						control2Callback();
					}
				}
			});
		});

	},

	/**
	 * @param {jQuery} contol Селектор ajax ссылок
	 * @param {} controlCallback Функция вызывающаяся при клике ссылку
	 */
	ajaxLinks: function (control, controlCallback) {

		control.click(function (event) {
			event.stopPropagation();
			event.preventDefault();
			$.ajax({
				url: $(this).attr('href'),
				type: "GET",
				dataType: "html",
				success: function (msg) {
					if (controlCallback && typeof controlCallback === 'function') {
						controlCallback(msg);
					}
				}
			});
		});

	}
};


jQuery.extend(Number.prototype, {

	/* Возвращает красиво оформленное число: 1234567.0981 => 1 234 567,10 */
	nice: function (iRoundBase) {
		var re = /^(-)?(\d+)([\.,](\d+))?$/;
		var iNum = Number(this);
		var sNum = String(iNum);
		var aMatches;
		var sDecPart = '';
		var sMinusSign = '&minus;';
		var sTSeparator = '&nbsp;';
		if ((aMatches = sNum.match(re))) {
			var sSign = aMatches[1] ? sMinusSign : '';
			var sIntPart = aMatches[2];
			var iDecPart = aMatches[4] ? Number('0.' + aMatches[4]) : 0;

			if (iDecPart) {
				var iRF = Math.pow(10, iRoundBase ? iRoundBase : 2);
				iDecPart = Math.round(iDecPart * iRF);
				sDecPart = iDecPart ? ',' + iDecPart : '';
			}

			if (Number(sIntPart) < 10000) {
				return sSign + sIntPart + sDecPart;
			}
			else {
				var sNewNum = '';
				var i;
				for (i = 1; i * 3 < sIntPart.length; i++) {
					sNewNum = sTSeparator + sIntPart.substring(sIntPart.length - i * 3, sIntPart.length - (i - 1) * 3) + sNewNum;
				}
				return sSign + sIntPart.substr(0, 3 - i * 3 + sIntPart.length) + sNewNum + sDecPart;
			}
		}
		else { // нам что-то не то подсунули
			return sNum;
		}
	}

});


jQuery.extend(String.prototype, {

	entityify: function () {

	    var character = {
		    '<' : '&lt;',
		    '>' : '&gt;',
		    '&' : '&amp;',
		    '"' : '&quot;'
		};

		// Return the string.entityify method, which
		// returns the result of calling the replace method.
		// Its replaceValue function returns the result of
		// looking a character up in an object. This use of
		// an object usually outperforms switch statements.

		return function () {
			return this.replace(/[<>&"]/g, function (c) {
				return character[c];
			});
		};
	}()

});