/**
* Главный объект, управляющий всей системой связи.
* @version 0.5
*/


var messenger = new function() {

	this.cfg = {
		"base_url" : "http://onlinesaler.ru/", // Основной адрес сервера
		"source_url" : "http://onlinesaler.ru/", // Адрес сервера, обслуживающего 
		"engine_url" : "http://chat.onlinesaler.ru/", // Адрес сервера-реалплексора
		"website" : "", // Сайт-клиента
		"namespace" : "", // Пространство имен сайта
		"client" : { // Параметры клиента
			"ip" : "", // IP адрес
			"name" : "", // Идентификатор клиента (vis_IP)
			"room" : "" // Канал клиента для связи
			}
		};
		
	/**
	 * Метод, инициализирующий систему, создающий прокс-iframe, формы, окна и прочее.
	 * @param data объект с настройками системы.
	 * data.website имя сайта, с которого производится запрос инициализации.
	 * data.namespace пространство имен, к которому относится сайт.
	 * data.panelVisible отображать панель со списком операторов или нет.
	 */
	this.init = function(data)
	{
		messenger.include.css(this.cfg.source_url+"css/common/jquery-ui-1.8.custom.css");

		this.cfg.website=data.website;
		this.cfg.namespace=data.namespace;
		var panelVisible=data.panelVisible;
		
		/* Получение IP адреса клиента */
		$.getJSON("http://jsonip.appspot.com/?callback=?",function(client_http) { 
			
			messenger.cfg.client.ip=client_http.ip;
			messenger.cfg.client.name="vis_"+messenger.cfg.client.ip.replace(/\./g, "_"); // Замена точек в IP адресе на _
			messenger.cfg.client.room="roo_"+messenger.cfg.client.ip.replace(/\./g, "_");

			wmanager.createPanel(panelVisible); // Создание панели со списком операторов

			$("body").append("<iframe id=\"messenger_proxy\" src=\""+messenger.cfg.base_url+"v5.php?namespace="+messenger.cfg.namespace+"&website="+messenger.cfg.website+"\" style=\"display: none;\"></iframe>");
			
			messenger.buildOnlineOperators(); // Построение списка операторов в онлайне

			/* Запуск системы межоконного кросс-доменного взаимодействия */
			v5.init({"target_domain" : messenger.cfg.base_url, "window" : document.getElementById("messenger_proxy").contentWindow}); 
			
		});
	}
	
	/**
	 * Отправить сообщение.
	 * @param id идентификатор получателя.
	 * @param text текст сообщения.
	 */
	this.send = function(id,json) {
		v5.postMessage("send(\""+this.cfg.client.ip+"\",\""+this.cfg.website+"\",\""+id+"\","+$.quoteString($.toJSON(json))+");");
	}
	
	/**
	 * Обработчик события получения сообщения.
	 * @param object входящее сообщение
	 * @param id хуй знает что такое)
	 */
	this.onReceive = function(object,id) {
	object=$.evalJSON(object);
		switch(object.type) {
			case "text" :
				messenger.onTextMessage(object.author,object.text);
			break;
			
			case "service" :
				messenger.onServiceMessage(object.author,object);
		}
	}
	
	/**
	 * Обработчик поступления текстового сообщения.
	 * @param author Автор сообщения.
	 * @param text Текст сообщения.
	 */
	 this.onTextMessage = function(author,text) { 

		var id=author;
		
		wmanager.createDialogWindow(id,function() {
			var log = $("#dw_"+id).find(".dialog-window-text-log").html();
		
			var d = new Date();
			var time = d.toLocaleTimeString();
			
			var reach_text="<span class=\"GUI-msg-sender\">"+author+"</span> : "+ text;
	
			$("#dw_"+id).find(".dialog-window-text-log").html(log+"("+time+") "+reach_text+"<br>");
			$("#dw_"+id).find(".dialog-window-text-log").scrollDown();
		});
	 }

	/**
	 * Обработчик поступления сервисного сообщения.
	 * @param author Автор сообщения.
	 * @param object JSON сообщения.
	 */
	this.onServiceMessage = function(author,object) { 
	switch(object.message_type) {
		case "getinfo" : 

			messenger.send(author, { 
				"type" : "info",
				"country_code" : geoip_country_code(), 
				"country" : geoip_country_name() ,
				"city" : geoip_city() ,
				"url" : (String)(window.location),
				"pagetitle" : document.title,
				"referrer" : document.referrer,
				"useragent" : navigator.userAgent
			});
		break
	}

	}

	/** 
	 * Метод, строящий элементы интерфейса в списке операторов.
	 */
	this.buildOnlineOperators = function() {
		$.getJSON(this.cfg.base_url+"engine/controller.php?website="+this.cfg.website+"&action=get_operators_online&callback=?",function(data) {
			$.each(data,function(k,v) { 
				wmanager.panelAddOperator(v); 
				});	
			});

	}
	
	/**
	 * Класс для подключения в код стилей и скриптов.
	 * @method css подключить стиль.
	 * @method javascript подключить JavaScript.
	 **/
	this.include = new function() { 
		
		/* Подключение стиля */
		this.css = function(file) {
			if($("link[href*='"+file+"']").length == 0)
				$("head").append("<link type='text/css' href='"+file+"' rel='stylesheet' />");
		}
		
		/* Подключение JavaScript */
		this.javascript = function(file) {
			if($("script[src*='"+file+"']").length == 0)
				$("head").append("<script type='text/javascript' src='"+file+"'/>");
		}
	
	}

}

