/**
 * @include  "_lk_scripts.js"
 * @include  "_lk_messages.js"
 */

/**
 * создает объект для хранения настроек сайта
 * @class
 */
function lk_object_class()
{
	/**
	 * URL к корню сайта на локалке 
	 * @private
	 * @type String
	 */
	var root_local = 'http://lkasa2:280/';

	/**
	 * URL к корню сайта на сервере 
	 * @private
	 * @type String
	 */
	var root_host = 'http://l-kasa.org.ua/';
//	var root_host = 'http://lk.ab-design.com.ua/';

	/**
	 * URL к домену с CSS на локалке 
	 * @private
	 * @type String
	 */
	var css_local = 'http://css.lkasa2:280/';

	/**
	 * URL к домену с CSS на сервере 
	 * @private
	 * @type String
	 */
	var css_host  = 'http://css.l-kasa.org.ua/';
//	var css_host  = 'http://css.l-kasa.org.ua/';

	/**
	 * URL к общим JS-скриптам на локалке 
	 * @private
	 * @type String
	 */
	var js_cmn_local = 'http://localhost:280/_common/js/';

	/**
	 * URL к общим JS-скриптам на сервере
	 * @private
	 * @type String
	 */
	var js_cmn_host = 'http://js.l-kasa.org.ua/';
//	var js_cmn_host = 'http://js.ab-design.com.ua/';

	var css_cmn_local = 'http://localhost:280/_common/css/';

	var css_cmn_host = 'http://css.l-kasa.org.ua/l2/';
//	var css_cmn_host = 'http://css.ab-design.com.ua/l2/';

	/**
	 * URL к корню сайта
	 * @type String
	 */
	this.root = _get_site_root.call(this);

	/**
	 * URL к домену с CSS-файлами
	 * @type String
	 */
	this.css_path = _get_css_path.call(this);

	/**
	 * URL к домену с общими JS-скриптами
	 * @type String
	 */
	this.js_cmn = _get_js_cmn.call(this);

	this.css_cmn = _get_css_cmn.call(this);

	/**
	 * путь к скрипту jquery-ui
	 * @type String
	 */
	this.jquery_ui_js = 'jquery-ui-1-8-6-start-min.js';

	/**
	 * текущий язык
	 * @type String
	 */
	this.cur_lang = _get_cur_lang();

	/**
	 * TRUE - значит юзер залогинен
	 * @type Boolean
	 */
	this.logined = _check_logined();

	/**
	 * массив с именами файлов JS-скриптов для постзагрузки
	 * @type String[]
	 */
	this.postScripts = null;

	/**
	 * массив с именами CSS-файлов для постзагрузки
	 * @type 
	 */
	this.postStyles = null;

	/**
	 * уровень прозрачности для объектов "перекрытие"
	 * @type Number
	 */
	this.opacity = 30;

	/**
	 * сколько времени (в секундах) будет проявляться объект перекрытие
	 * @type Number
	 */
	this.fade = 5;

	/**
	 * минимальная высота
	 * @type Number
	 */
	this.rollageMinH = 500;

	/**
	 * минимальная ширина псевдоокна в пикселах 
	 * @type Number
	 */
	this.pwinW = 800;

	/**
	 * минимальная высота псевдоокна в пикселах 
	 * @type Number
	 */
	this.pwinH = 400;

	/**
	 * минимальная ширина псевдоокна для показа одной фотки 
	 * @type Number
	 */
	this.photoW = 700;

	/**
	 * минимальная ширина псевдоокна для показа одного видеоролика 
	 * @type Number
	 */
	this.videoW = 500;

	/**
	 * минимальная высота псевдоокна для показа одного видеоролика 
	 * @type Number
	 */
	this.videoH = 300;

	/**
	 * ширина псевдоокна для показа диалога
	 * @type Number
	 */
	this.dialogW = 900;

	/**
	 * минимальная высота псевдоокна для показа одного видеоролика
	 * @type Number
	 */
	this.dialogH = 400;

	/**
	 * имя куки в которой хранится язык
	 * @type String
	 */
	this.cookieLang = 'lklang';

	/**
	 * минимальная длина текста для поиска
	 * @type Number
	 */
	this.searchMinLength = 4;

	/**
	 * максимальная длина текста для поиска
	 * @type Number
	 */
	this.searchMaxLength = 50;

	/**
	 * максимальное количество слов для поиска
	 * @type Number
	 */
	this.searchMaxWords = 5;

	/**
	 * путь к форме отправки сообщения
	 * @type String
	 */
	this.feed_form_url = '/feed-form/';

	/**
	 * путь к скрипту сохранения сообщения
	 * @type String
	 */
	this.feed_save_url = '/feed-send/';

	/**
	 * максимальная длина сообщения
	 * @type Number
	 */
	this.maxFeedLen = 1000;

	/**
	 * путь к форме задания вопроса
	 * @type String
	 */
	this.ask_form_url = '/ask-form/';

	/**
	 * путь к скрипту сохранения вопроса
	 * @type String
	 */
	this.ask_save_url = '/ask-send/';

	this.mapMarkerIcon = "pix/bk-logo-32.png";

	this.mapMarkerSize = 32;

	this.navi_w = 300;

	this.side_margin = 40;

	/**
	 * URL по которому сохраняется заявка юзера на участие в БК 
	 * @type String
	 */
	this.order_save_url = 'order-save/';

	this.town_suggester_url = 'get-town/';

	/**
	 * URL по которому сохраняется подписка 
	 * @type String
	 */
	this.scribe_save_url = 'scribe-save/';

/****************************************************************************
 ****************************************************************************
 ****************************************************************************/

	/**
	 * вычисляет запускался ли скрипт с локалки
	 * 
	 * @return {Boolean} - TRUE если скрипт запускался с локалки
	 */
	this.isLocal = function()
	{
		return (this.root == root_local) ? true : false;
	}

	/**
	 * вычисляет запускался ли скрипт с сервера
	 * 
	 * @return {Boolean} - TRUE если скрипт запускался с сервера
	 */
	this.isHost = function()
	{
		return (this.root == root_host) ? true : false;
	}

	/**
	 * @private
	 * возвращает URL к корню сайта
	 * 
	 * @return {String} - URL к корню сайта
	 */
	function _get_site_root()
	{
		var lcURL = window.location.hostname;

		return (lcURL.toLowerCase() == 'lkasa2') ? root_local : root_host;
	}

	/**
	 * заполняет объект openGraph значениями
	 * 
	 * @return {openGraph_class} - 
	 */
	function openGraphLoad()
	{
		try
		{
			var loOG = 
			{
				url: window.location.href,
				title: $('title').text(),
				description: $('meta[name=description]').attr('content'),
				image_src: $('link[rel=image_src]').attr('href')
			};
		}
		catch(e)
		{
			var loOG = 	{ url: '', title: '', description: '', image_src: '' };			
		}

		return loOG;
	}

	/**
	 * @private
	 * возвращает путь к домену с CSS-файлами
	 * 
	 * @return {String} - URL к домену с CSS-файлами
	 */
	function _get_css_path()
	{
		var lcURL = window.location.hostname;

		return (lcURL.toLowerCase() == 'lkasa2') ? css_local : css_host;
	}

	/**
	 * @private
	 * возвращает URL к домену с общими JS-скриптами
	 * 
	 * @return {String} - URL к домену с общими JS-скриптами
	 */
	function _get_js_cmn()
	{
		var lcURL = window.location.hostname;

		return (lcURL.toLowerCase() == 'lkasa2') ? js_cmn_local : js_cmn_host;
	}

	function _get_css_cmn()
	{
		var lcURL = window.location.hostname;

		return (lcURL.toLowerCase() == 'lkasa2') ? css_cmn_local : css_cmn_host;
	}

	/**
	 * @private
	 * проверяет залогиненность юзера
	 * 
	 * @return {Boolean} - TRUE если юзер залогинен
	 */
	function _check_logined()
	{
		return false;
	}

	/**
	 * определяет какой сейчас язык выбран для сайта
	 * @return {String} - текуший язык сайта (всегда RU)
	 */
	function _get_cur_lang()
	{
		return 'ru';
	}

	/**
	 * исправляет раскладку
	 *
	 * @param {String} tcStr - строка, которую правим
	 * @param {String} tcNeedLanguage - нужный нам язык (ru, ua, en)
	 * @return {String} - исправленная строка
	 */
	function punto(tcStr, tcNeedLanguage)
	{
		if (!tcNeedLanguage) tcNeedLanguage = 'ru';
		var lcRet = new String(tcStr);
	
		var lcEn = "qwertyuiop[]asdfghjkl;'zxcvbnm,.`";
		var lcRu = "йцукенгшщзхъфывапролджэячсмитьбюё";
		var lcUa = "йцукенгшщзхїфівапролджєячсмитьбюё";
	
		if (tcNeedLanguage=='ua'  ||  tcNeedLanguage=='uk')	lcRu = lcUa;	//	немного подравляем для украинского языка
	
		if (tcNeedLanguage=='ru'  ||  tcNeedLanguage=='ua'  ||  tcNeedLanguage=='uk')
		{
			var lcFrom = lcEn;
			var lcTo = lcRu;
			lcRet = lcRet.replace('@', '"');
		}
		else
		{
			var lcFrom = lcRu;
			var lcTo = lcEn;
			lcRet = lcRet.replace('"', '@');
		}
	
		for (var i=0; i < lcFrom.length; i++)
	 	{
	 		var lcF = new String(lcFrom[i]);
			var lcT = new String(lcTo[i]);
	 		lcRet = lcRet.replace(lcF, lcT);
			lcRet = lcRet.replace(lcF.toUpperCase(), lcT.toUpperCase());
	 	}

	 	return lcRet;
	}

	/**
	 * исправление раскладки в поле ввода
	 * вешаем на OnKeyUp или OnBlur
	 *
	 * @param {Event} e - ссылка на объект-событие
	 * @return
	 */
	this.punto_switcher = function (e)
	{
	    e = (e) ? e : window.event;    // получить ссылку на событие
	    var loTarget = e.target || e.srcElement; // получить ссылку на приемник события

		var lcLang = (loTarget.lang) ? loTarget.lang : 'ru';
		loTarget.value = punto(loTarget.value, lcLang);
	}

	/**
	 * проверяет валидности адреса e-mail
	 *
	 * @param {String} tcEmail - значение которое проверяем
	 * @return {Boolean} - TRUE если с e-mail'ом все Ok, иначе FALSE
	 */
	this.checkEmail = function(tcEmail)
	{
		tcEmail = prepare_check(tcEmail);

		return tcEmail.match(/^[0-9a-z_\-\.]+@[0-9a-z_\-\.]+\.[a-z]{2,4}$/i);
	}

	/**
	 * возвращает значение элемента ввода
	 * 
	 * @param {String/HTMLInputElement} tcValue - ссылка на элемент ввода или его ID
	 * @return {String} - значение элемента ввода
	 */
	function prepare_check(tcValue)
	{
		if (tcValue.constructor == String)
		{
			var loElem = $(tcValue).get(0);
			return  (loElem) ? loElem.value : tcValue;
		}
		else
		{
			return (tcValue.value) ? tcValue.value : tcValue;
		}

		return tcValue;
	}

	/**
	 * правильно делает Escape для кириллицы
	 *
	 * @param {String} str - строчка, которую нужно "отискейпить"
	 * @return {String} - "отискейпеная" строка
	 */
    this.escape1251 = function(str)
    {
    	if (!str  ||  str == '') return '';
        // Инициализируем таблицу перевода
        var trans = new Array();
        for (var i = 0x410; i <= 0x44F; i++)  trans[i] = i - 0x350; // А-Яа-я
        trans[0x401] = 0xA8;    // Ё
        trans[0x451] = 0xB8;    // ё

//	TGA - добавлено для поддержки украинского языка
        trans[0x490] = 0xA5;    // Ґ
        trans[0x491] = 0xB4;    // ґ

        trans[0x404] = 0xAA;    // Є
        trans[0x454] = 0xBA;    // є

        trans[0x406] = 0xB2;    // І
        trans[0x456] = 0xB3;    // і

        trans[0x407] = 0xAF;    // Ї
        trans[0x457] = 0xBF;    // ї

        var ret = [];
        // Составляем массив кодов символов, попутно переводим кириллицу
        for (var i = 0; i < str.length; i++)
        {
            var n = str.charCodeAt(i);
            if (typeof trans[n] != 'undefined') n = trans[n];
            if (n <= 0xFF) ret.push(n);
        }
        return escape(String.fromCharCode.apply(null, ret));
    }

    /**
     * путь к файлу с иконкой ошибки
     * @type String
     */
    this.alertErrorIcon = 'pix/alert_icon_error.png';

    /**
     * путь к файлу с иконкой предупреждения
     * @type String
     */
    this.alertWarningIcon = 'pix/alert_icon_warning.png';

    /**
     * путь к файлу с иконкой информации
     * @type String
     */
    this.alertInfoIcon = 'pix/alert_icon_info.png';

    /**
     * @public
     * показывает сообщение об ошибке с иконкой ошибки
     * 
     * @param {String} tcMsg - сообщение об ошибке
     * @param {String} tcTitle - [опц] заголовок окошка с сообщением 
     * @param {String} tcIcon - [опц] иконка для сообщения
     */
    this.erlert = function(tcMsg, tcTitle, tcIcon)
    {
    	innerAlert('error', tcMsg, tcTitle, tcIcon);
    }

    /**
     * @public
     * показывает предупреждение с иконкой предупреждения
     * 
     * @param {String} tcMsg - текст предупреждения
     * @param {String} tcTitle - [опц] заголовок окошка с сообщением 
     * @param {String} tcIcon - [опц] иконка для сообщения
     */
    this.walert = function(tcMsg, tcTitle, tcIcon)
    {
    	innerAlert('warning', tcMsg, tcTitle, tcIcon);
    }

    /**
     * @public
     * показывает информационное сообщение с иконкой информации
     * 
     * @param {String} tcMsg - текст сообщения
     * @param {String} tcTitle - [опц] заголовок окошка с сообщением 
     * @param {String} tcIcon - [опц] иконка для сообщения
     */
    this.inlert = function(tcMsg, tcTitle, tcIcon)
    {
    	innerAlert('info', tcMsg, tcTitle, tcIcon);
    }

    /**
     * показывает окошко с сообщением (ошибка, предупреждение, инфо)
     * 
     * @param {String} tcMode - режим работы 
     * @param {String} tcMsg - текст сообщения
     * @param {String} tcTitle - [опц] заголовок окошка с сообщением
     * @param {String} tcIcon - [опц] иконка для сообщения
     */
	function innerAlert(tcMode, tcMsg, tcTitle, tcIcon)
	{
		tcMode = (tcMode) ? tcMode : 'warning';
		
		switch(tcMode)
		{
			case 'error':
				tcMsg = (tcMsg) ? tcMsg : lk_msg.errMsgTitle;
				tcTitle = (tcTitle) ? tcTitle : lk_msg.errMsgTitle;
				tcIcon = (tcIcon) ? tcIcon : lk_obj.alertErrorIcon;
				break;
			case 'warning':
				tcMsg = (tcMsg) ? tcMsg : lk_msg.wrnMsgTitle;
				tcTitle = (tcTitle) ? tcTitle : lk_msg.wrnMsgTitle;
				tcIcon = (tcIcon) ? tcIcon : lk_obj.alertWarningIcon;
				break;
			case 'info':
				tcMsg = (tcMsg) ? tcMsg : lk_msg.infoMsgTitle;
				tcTitle = (tcTitle) ? tcTitle : lk_msg.infoMsgTitle;
				tcIcon = (tcIcon) ? tcIcon : lk_obj.alertInfoIcon;
				break;
		}

		if (window.jqalerter) jqalert(tcMsg, tcTitle, { icon: tcIcon });
		else alert(tcTitle + '\n\n' + tcMsg);
	}

}

/**
 * здесь храним все глобальные настройки
 *
 * @type svn_object_class
 */
var lk_obj = new lk_object_class();

/**
 * 
 * @class
 */
function openGraph_class()
{
	this.url = '';
	this.title = '';
	this.description = '';
	this.image_src = ''
};

function win2unicode(str)
{
   var charmap   = unescape(
      "%u0402%u0403%u201A%u0453%u201E%u2026%u2020%u2021%u20AC%u2030%u0409%u2039%u040A%u040C%u040B%u040F"+
      "%u0452%u2018%u2019%u201C%u201D%u2022%u2013%u2014%u0000%u2122%u0459%u203A%u045A%u045C%u045B%u045F"+
      "%u00A0%u040E%u045E%u0408%u00A4%u0490%u00A6%u00A7%u0401%u00A9%u0404%u00AB%u00AC%u00AD%u00AE%u0407"+
      "%u00B0%u00B1%u0406%u0456%u0491%u00B5%u00B6%u00B7%u0451%u2116%u0454%u00BB%u0458%u0405%u0455%u0457");

   var code2char = function(code)
   {
               if(code >= 0xC0 && code <= 0xFF) return String.fromCharCode(code - 0xC0 + 0x0410);
               if(code >= 0x80 && code <= 0xBF) return charmap.charAt(code - 0x80);
               return String.fromCharCode(code);
   }

   var res = "";
   for (var i = 0; i < str.length; i++) res = res + code2char(str.charCodeAt(i));
   return res;
}

