  /**
 * @fileoverview EGRID-client. API.
 */
 /**
 -------------------------------------------------------------------
 File    : emuc.js
 Description : EGRID-client. API
 Created : 06 Dec 2011 by Alexandr Vorkov <AlexandrVorkov@gmail.com> 
 -------------------------------------------------------------------
  */
 /**@license 
  @author IQOM <iqom@isqom.org> [http:isqom.org]
  @copyright 2008 IQOM R&D Group.
  @version $Revision$
  */ 
 /**
 @author IQOM <iqom@isqom.org> [http:isqom.org]
 @copyright 2008 IQOM R&D Group. 

 The contents of this file are subject to the GNU GPL license,
 Version 3, (the "License"); you may not use this file except in
 compliance with the License. You should have received a copy of the
 GNU GPL license along with this software. If not, it can be
 retrieved via the world wide web at http:www.gnu.org/copyleft/gpl.html.

 Software distributed under the License is distributed on an "AS IS"
 basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 the License for the specific language governing rights and limitations
 under the License.

 The Initial Developer of the Original Code is IQOM R&D Group.
 All Rights Reserved.
 */
/**
 * Класс инициализации EMUC
 * @class
 * @param {Object} conf хеш-массив инициализации 
 * @param {String} conf.hostEMUC хост сервера, по умолчанию относительный (""), Пример: <br/> alpha4.dev:8004
 */
function EMUC(conf){
	/**
     * Хост для джаббера
     * @type String
     */
    this.host = conf.host?('http://'+conf.host.replace(/(^http:\/\/|\/$)/ig,'')+'/'):'http://'+window.location.host+'/';
	this.widthEMUC=760;
	this.heightEMUC=645;
	this.leftEMUC = 10;
	this.nameWinEMUC="EMUCclient";
	this.widthUsedIt=750;
	this.heightUsedIt=635;
	this.leftUsedIt = 50;
	this.ifr = conf.ifr||false;
	this.prov = conf.prov;
	/**
	 * данные для истории
	 * this.historymsg.last последнее сообщение
	 * @type Object
	 */	
	this.historymsg = {
		last:0
	};
}
/**
 * Инициализация ссылок на EMUC клиент
 * @param {Object} conf
 * @param {Object} conf.login вход в киент(id html)
 * @param {Object} conf.links Инициализация ссылок на виджеты чатов
 * Пример:
 *  {
 *  	login:{
 *  			htmlId:"htmlId",
 *              callback:function(){}//функция которая обрабатывает ответ
 *             },
 *      links:[
 *      	{
 *             htmlId:'htmlId',//id куда вставлять ответ
 *             roomId:'roomId',//если чат хоть раз был инициализирован 
 *             crinfo:'crinfo',//или crinfo если не разу или не известно
 *             callback:function(){}//функция которая обрабатывает ответ 
 *          }
 *      ]
 *  } 
 */
EMUC.prototype.init = function(conf){
	if (conf.login && conf.login.htmlId) {
		this.login(conf.login);
	}
	if (conf.links && conf.links.length) {
		this.links(conf.links);
	}
	if (conf.activity && conf.activity.htmlId&& conf.activity.f) {
		this.activity(conf.activity);
	}
	if (conf.usedIt&&conf.usedIt.length) {
		this.usedIt(conf.usedIt);
	}
	if (conf.usedItPanel&&conf.usedItPanel.eTag) {
		this.usedItPanel(conf.usedItPanel);
	}
	if (conf.chatHistory && conf.chatHistory.htmlId&&conf.chatHistory.roomId) {
		this.chatHistory(conf.chatHistory);
	}
	//открытие клиента с параметрами
	if (conf.open) {
		var confPar = conf.open.slice(2);
		var sendParam = confPar.replace(/\/crid=([^\/]+)/ig,'');
		var pCrid = RegExp.$1;
		sendParam=sendParam.replace(/\[|\]|\/$/ig,'').replace(/\//g,'&');
		this.openEMUCClient({
						crid: pCrid||'',
						cj: encodeURIComponent(sendParam)						
					},{
						open:confPar
					},{
						pp:true
					});				
	}	
};
/**
 * отображение ссылки на вход(или авторизацию)
 * @param {Object} login
 * @param {String} login.htmlId - html id элемента для отображения
 * @param {Function} login.callback - функция которая обрабатывает ответ сервера. Необязательный параметр.
 */
EMUC.prototype.login = function(login){	
	var scope = this;
	EMUCJsonpRequest.send({
		url:this.host+'pipe/muc/query/{callback}/',
		params:{
			cp:encodeURIComponent('crid=')
		},
		callback:function(param){
			if (typeof login.callback == 'function') {
				login.callback(login,param);
			}else{
				scope.drawLogin(login,param);				 
			}
			if (typeof login.onfinish == 'function') {
				login.onfinish(login,param);
			}			
			var el = document.getElementById(login.htmlId);
			if(el){
				//TODO: избавиться el.children[0] и по отдельности добавлять обработчики к войти и зарегистрироваться 
				scope.addClick(el.children[0],function(){
					var optParam = '';
					if(param.users&&param.users.length&&param.users[0].self&&param.users[0].iwaR){
						optParam = 'focusClient';
					}else{
						optParam = 'entryClient';
					}
					scope.openEMUCClient({
						cp: encodeURIComponent('crid='),
						cj: encodeURIComponent('opt='+optParam)						
					},{
						opt:optParam
					},{
						pp:true
					});
				});	
			}
		}
	});
};
/**
 * отображение список активных комнат
 * @param {Object} activity
 * @param {String} activity.htmlId - html id элемента для отображения
 * @param {Function} activity.callback - функция которая обрабатывает ответ сервера. Необязательный параметр.
 */
EMUC.prototype.activity = function(activity){	
	var scope = this;
	EMUCJsonpRequest.send({
		url:[this.host,'js/usedit/activity/',activity.f,'/{callback}/'].join(''),		
		callback:function(param){
			if (typeof activity.callback == 'function') {
				activity.callback(activity,param);
			}else{
				scope.drawActivity(activity,param);				 
			}
			if (typeof activity.onfinish == 'function') {
				activity.onfinish(activity,param);
			}
		}
	});
};
/**
 * отображение блока с историей
 * @param {Object} par
 * @param {String} par.htmlId - html id элемента для отображения
 * @param {String} par.roomId - id чата
 * @param {Function} par.callback - функция которая обрабатывает ответ сервера. Необязательный параметр.
 */
EMUC.prototype.chatHistory = function(par){
	if(this.drawChatHistoryPanel(par)){
		this.sendHistory(par,'col=10&last=0&room='+par.roomId);
	}	
};
/**
 * отправка запроса на получение истории
 * @param {String} urlpar - параметры запроса
 * @param {Object} par
 * @param {String} par.htmlId - html id элемента для отображения
 * @param {String} par.roomId - id чата
 * @param {Function} par.callback - функция которая обрабатывает ответ сервера. Необязательный параметр.
 */
EMUC.prototype.sendHistory = function(par,urlpar){
	var scope = this;
	EMUCJsonpRequest.send({
		url:this.host + 'js/usedit/h/{callback}/?'+urlpar,		
		callback:function(param){
			if (typeof par.callback == 'function') {
				par.callback(par,param);
			}else{
				scope.drawMsgHistory(par,param);				
			}
			if (typeof par.onfinish == 'function') {
					par.onfinish(par,param);
			}
		}
	});
};
/**
 * Отрисовка панели для истории
 * @param {Object} startPar
 * @return Boolean отрисована ли панель
 */
EMUC.prototype.drawChatHistoryPanel = function(startPar){
		var el = document.getElementById(startPar.htmlId);
		if(el){
			el.innerHTML = '<div class="hPan" style="font-family: Tahoma,Arial;margin: 0;border: 1px solid #999;outline: none;"><div class="msgs" style="height: 300px;overflow-y: scroll;border: 1px solid #999;margin: 5px;" id="emucHP'+startPar.roomId+'"></div><div style="background: url('+this.host+'ems/img/img/big_button.png) repeat scroll 0 0 transparent;border-radius: 3px 3px 3px 3px;border-top: 1px solid #D0EBFF;box-shadow: 0 1px 2px #94969D;cursor: pointer;text-align: center;width: 180px;color: white;font-size: 14px;font-weight: bold;height: 40px;line-height: 36px;text-shadow: 0 -1px 1px black;margin:0px auto 5px;" class="send" id="shEmuc">Ответить</div></div>';			
			var scope = this;
			this.addClick(el, function(event){
				event = event || window.event;
  				var t = event.target || event.srcElement;
				if("send" === t.className){ 
					scope.openEMUCClient({
						cp: encodeURIComponent('crid='),
						cj: encodeURIComponent('rooms='+startPar.roomId+'&qfo=r,ru')				
					}, {
						rooms: startPar.roomId
					});
				}
					return false;
			});
		}else{
			return  false;
		}		
		return true;
};
/**
 * Отрисовка сообщений в историю
 * @param {Object} startPar
 * @param {Object} ServParam
 */
EMUC.prototype.drawMsgHistory = function(startPar,ServParam){
	var scope = this;
	if(ServParam.msgs&&ServParam.msgs.length){
		var el = document.getElementById("emucHP"+startPar.roomId);
		if("replace"===ServParam['do']){
			el.innerHTML ="";
		}
		//TODO: нужно добавить форматирование текста
		var fEl = el.childNodes[0];
		for(var ii=0,l= ServParam.msgs.length ;ii<l;ii++){
			msg = ServParam.msgs[ii];
			chEl = document.createElement('div');
			chEl.setAttribute('style','padding: 5px 10px;overflow: hidden;');
			chEl.setAttribute('class','line');
			chEl.innerHTML = '<div class="avat" style="float: left;"><img src="'+this.host+'media/h/'+(msg.hjid||'guest')+'/avatar" height="32" width="32"/></div>'+
			'<div class="msg" style="margin-left: 45px;font-size: 13px;overflow: hidden;"><div class="w" style="font-size: 13px;font-weight: bold;white-space: nowrap;overflow: hidden;margin-bottom: 5px;"><span class="nk">'+this.htmlFullEnc(msg.fromNick)+'</span><span class="t" style="color: #ABABCE;font-size: 11px;margin-left: 5px;font-weight: normal;">'+this.jbFDate(msg.dateMSG)+'</span></div>'+this.msgFormat(msg.msg)+'</div>';
			el.insertBefore(chEl,fEl||null);
			fEl = chEl;
		}
		this.historymsg.last = msg.id; 
	}
	setTimeout(function(){
		scope.sendHistory(startPar,'col=10&last='+scope.historymsg.last+'&room='+startPar.roomId);
	},30000);
};
/**
 * Эскейпирование текста
 * @param {String} str
 * @return {String}
 */
EMUC.prototype.htmlFullEnc = function(str) {
    if (!str||typeof str.replace!='function') return '';
    str = str.replace(/&/g,"&amp;");
    str = str.replace(/</g,"&lt;");
    str = str.replace(/>/g,"&gt;");
    str = str.replace(/\'/g,"&quot;");
    str = str.replace(/\"/g,"&quot;");
    return str;
}
/**
 * Форматирование текста 
 * TODO: вынести в отдельный файл и делать подгрузку при необходимости
 * @return {String}
 */
EMUC.prototype.msgFormat = function (msg) {
	var scope = this;
	function msgComment(msg){
	msg = msg.replace(/\[comment\](.*?)\[\/comment\]/g,'<div style="background: url('+scope.host+'ems/img/img/q.png) no-repeat left top;margin-bottom: 5px;" class="quote"><div style="margin-left: 15px;border-left: 1px solid #BBB;color: #666;font-size: 11px;padding-left: 5px;" class="quoted-text">$1</div></div>');
	if(msg.search(/\[comment\](.*)\[\/comment\]/g) != -1)
		return msgComment(msg);
	else
		return msg;
	};
	function msgImg(msg){
		msg = msg.replace(/\[img\](.*?)\[\/img\]/g,"<a href='$1' target='_blank'><img src='$1' width='125'/></a>");
		return msg;	
	};
	function msgVideo(msg){
		msg = msg.replace(/\[youtube\]([0-9a-zA-Z\-\_]{11})\[\/youtube\]/g,'<div style="cursor: pointer;" onclick="window.open(\'http://www.youtube.com/v/$1?fs=1&amp;hl=ru_RU&amp;rel=0\',\'\',\'width=350,height=267\');"><div style="color: #0000FF;">видео</div><img src="http://img.youtube.com/vi/$1/default.jpg"/></div>');
		return msg;	
	};
	if (!msg) return null;
    msg = this.htmlFullEnc(msg);    

    // replace http://<url>
    msg = msg.replace(/(\s|^)(https?:\/\/\S+)/gi,"$1<a href=\"$2\" target=\"_blank\">$2</a>");

    // replace ftp://<url>
    msg = msg.replace(/(\s|^)(ftp:\/\/\S+)/gi,"$1<a href=\"$2\" target=\"_blank\">$2</a>");
  
    // replace mail-links
    msg = msg.replace(/(\s|^)(\w+\@\S+\.\S+)/g,"$1<a href=\"mailto:$2\">$2</a>");
  
    // replace *<pattern>*
    msg = msg.replace(/(\s|^)\*([^\*\r\n]+)\*/g,"$1<b>\$2\</b>");

    // replace _bla_ 
    msg = msg.replace(/(\s|^)\_([^\*\r\n]+)\_/g,"$1<u>$2</u>");

    msg = msg.replace(/\n/g,"<br>");
    //replace [nik]test[/nik] <font color='green'>test</font>
    msg = msg.replace(/\[nick\](.*?)\[\/nick\]/g,'<div style="font-weight: bold;" class="whois">$1</div>');        
    //replace [comment]test[/comment] <div class="comment">test</div>
    msg = msgComment(msg);
    msg = msgImg(msg);
    msg = msgVideo(msg);
	//смайлы
    //TODO: поставить смайлы
	//msg = emoticonsEmuc.emoticonMe(msg);
    return msg;
};
/**
 * формирование даты в нужном формате
 * @param {String} dt дата от джаббера
 * @return {String}
 */
EMUC.prototype.jbFDate = function(dt){
	dt = dt.substring(0,dt.indexOf('.'));
	fdate =  dt.substring(0,dt.indexOf('T'))+" " + dt.substring(dt.indexOf('T')+1); 
	return fdate;
}; 
/**
 * Отрисовка входа в EMUC килент
 * @param {Object} startPar
 * @param {Object} ServParam
 */
EMUC.prototype.drawLogin = function(startPar,ServParam){
	var el = document.getElementById(startPar.htmlId);
	if(el){
		var text ='';
		if(ServParam.users&&ServParam.users.length&&ServParam.users[0].self&&ServParam.users[0].iwaR){
			text = ServParam.users[0].nick + "</span>";
		}else{
			text ='Войти</span><a target="_blank" style="margin-left:4px;" href="'+this.host.replace('eims','www')+'profile">Зарегистрироваться</a>';
		}
		el.innerHTML = "<span style='color: #0000FF;cursor: pointer;'>"+text;		
	}
};
/**
 * Отрисовка список активных комнат
 * @param {Object} startPar
 * @param {Object} ServParam
 */
EMUC.prototype.drawActivity = function(startPar,ServParam){
	if(ServParam.length){
		var el = document.getElementById(startPar.htmlId);
		if(el){
			var htmlEl = ['<ul style=" font-family: Verdana,sans-serif;font-size: 14px;">'];
			var title;
			for(var ii= ServParam.length - 1 ;ii>=0;ii--){
				 title = ServParam[ii].opts.title;
				if(-1 == title.indexOf(' ')){
					title = 'чат о ' + title.substring(title.indexOf('.')+1,title.length).replace('.',' ');
				}
				htmlEl.push(['<li style="list-style-type:none;"><span id="EMS',ServParam[ii].room,'" style="color: #0000FF;cursor: pointer;">',title,'</span>','<span>(',ServParam[ii].r,')</span>','</li>'].join(''));	
			}
			htmlEl.push('</ul>');			
			el.innerHTML = htmlEl.join('');
			
			var scope = this;
			this.addClick(el.childNodes[0], function(event){
				event = event || window.event;
  				var t = event.target || event.srcElement;
				if(t.id){
					var roomid = t.id.slice(3); 
					scope.openEMUCClient({
						cp: encodeURIComponent('crid='),
						cj: encodeURIComponent('rooms='+roomid+'&qfo=r,ru')				
					}, {
						rooms: roomid
					});
				}
				return false;
		});
		}
	}	
};
/**
 * отображение usedIt(использовал)
 * @param {[Object]} usedIt
 * @param {String} usedIt.htmlId - html id элемента для отображения
 * @param {String} usedIt.eTag - название тега
 * @param {Function} usedIt.callback - функция которая обрабатывает ответ сервера. Необязательный параметр.
 */
EMUC.prototype.usedIt = function(usedIt){	
	var scope = this;
	var etag = '';
	var hUsedIt = {};	 
	for(var ii=0;ii<usedIt.length;ii++){
		var pusedIt = usedIt[ii];		
		if(pusedIt.eTag&&pusedIt.htmlId){
			pusedIt.eTag = this.escapeEtag(pusedIt.eTag);
			//создаем более удобный массив по тегу, и нужно учесть что может быть один тег, но вставка в несколько мест
			if(hUsedIt[pusedIt.eTag]){
				hUsedIt[pusedIt.eTag].push(pusedIt);
				//если такой тег есть, то зачем дублировать :) в параметрах запроса
				continue;
			}else{
				hUsedIt[pusedIt.eTag] = [pusedIt];
			}
			if('' !== etag){
				etag +=',';
			}
			etag += pusedIt.eTag;
		}
	};
	if ('' !== etag) {
		EMUCJsonpRequest.send({
			url:this.host+'js/usedit/list/{callback}/',
			params: {
				etag:etag
			},
			/*
			 * ответ:
			 * [
			 * 	{t:'eteg1',k:'10'},
			 * 	{t:'eteg2',k:'15'}
			 * ] 
			 */
			callback:function(param){
				if(param&&param.length){
					for(var ii=0;ii<param.length;ii++){
						var pParam = param[ii];
						var phUsedIt = hUsedIt[pParam.ot];
						if(phUsedIt){
							for(var jj=0;jj<phUsedIt.length;jj++){
								var pphUsedIt = phUsedIt[jj];
								if (typeof pphUsedIt.callback == 'function') {
									pphUsedIt.callback(pphUsedIt,pParam);					
								}else{
									scope.drawUsedIt(pphUsedIt,pParam);				 
								}
								if (typeof pphUsedIt.onfinish == 'function') {
									pphUsedIt.onfinish(pphUsedIt,pParam);
								}
							}
						}
					}
				}
			}
		});
	}	
};
EMUC.prototype.escapeEtag = function (p){
		return p.replace(/[%\s\,\]\[\=]/g,'_').toLowerCase();
	};
/**
 * отображение usedIt(использовал) отдельной кнопкой с возможностью отобрадать особые кнопки(какие определит провайдер)
 * @param {[Object]} usedIt
 * @param {String} usedIt.eTag - название тега
 * @param {String} usedIt.ifr - открывать ли в ифрейме для незарегистрированых пользователей
 * @param {Function} usedIt.callback - функция которая обрабатывает ответ сервера. Необязательный параметр.
 */
EMUC.prototype.usedItPanel = function(usedIt){	
	var scope = this;
	var defEtag = false;
	var urlR = '';
	var paramR = {};
	//если нет eTag, то берем значение по умолчанию или выходим
	if('default' === usedIt.eTag){
		if(this.prov){
			defEtag = true;
		}else{
			return;		
		}
	}	
	usedIt.eTag = this.escapeEtag(usedIt.eTag);	
	if(defEtag){
		//urlR = this.host+'js/usedit/list/'+this.prov+'/default/{callback}/';
		urlR = this.host+'js/usedit/p/'+this.prov+'/usedits/{callback}/';
	}else{
		urlR = this.host+'js/usedit/list/{callback}/';
		paramR = {
			etag:usedIt.eTag
		};		
	}
	
	EMUCJsonpRequest.send({
		url:urlR,
		params: paramR,
		/*
		 * ответ:
		 * [
		 * 	{t:'eteg1',k:'10'},
		 * 	{t:'eteg2',k:'15'}
		 * ] 
		 */
		callback:function(param){
			if(param&&param.length){
				param[0].title = param[0].title||usedIt.title;
				if (typeof usedIt.callback == 'function') {
							usedIt.callback(param[0]);					
						}else{
							scope.drawUsedItPanel(param[0],usedIt);				 
						}
				if (typeof usedIt.onfinish == 'function') {
					usedIt.onfinish(usedIt,param[0]);
				}
			}
		}
		});
		
};
/**
 * Отрисовка список активных комнат
 * @param {Object} startPar
 * @param {Object} ServParam
 */
EMUC.prototype.drawUsedIt = function(startPar,ServParam){
	var scope = this;
	var el = document.getElementById(startPar.htmlId);
	if (el) {				
		el.innerHTML = "<div><span title='Имеется ввиду использование данной модели или знание о похожей модели, а также знание о варианте услуги упомянутой в объявлении' class='usedIteCon' style='background: url(\""+this.host+"ems/img/disc_btn.png\") repeat-x scroll 0 0 transparent;border: 1px solid #CCCCCC;border-radius: 4px 4px 4px 4px;color: #000000;cursor: pointer;"+
		    "display: inline-block;height: 18px;line-height: 1.4;font-size:12px;text-align:center;"+
			"width:94px;margin-right:5px;'>Пользовался</span>" +
		"<span style='border: 1px solid #CCCCCC;display: inline-block;height: 18px;line-height: 1.4;"+
		    "padding-left: 3px;padding-right: 3px;font-size:12px;'>"+ServParam.k+
		"</span><span class='callusedIteCon' style='background: url(\""+this.host+"ems/img/disc_btn.png\") repeat-x scroll 0 0 transparent;"+
		    "border: 1px solid #CCCCCC;border-radius: 4px 4px 4px 4px;color: #000000;cursor: pointer;"+
		    "display: inline-block;height: 18px;line-height: 1.4;font-size:12px;text-align:center;width:94px;margin-left:5px;'>Консультация</span></div>";
		this.addClick(el, function(event){
  			event = event || window.event;
  			var t = event.target || event.srcElement;
  			if('usedIteCon'===t.className){
  					window.open(scope.host + "usedit/"+ServParam.t+"/" ,'', "left=" + scope.leftUsedIt + ",width=" + scope.widthUsedIt + ",height=" + scope.heightUsedIt + ",resizable=yes,scrollbars=yes,status=yes");
  				}else if('callusedIteCon'===t.className){  					
 					var cusedit = '';
  					var serPar = {usedit:ServParam.t};
  					var crinfUsedIt =ServParam.c||startPar.c; 
  					if(crinfUsedIt){
  						cusedit = '&cusedit='+crinfUsedIt;
  						serPar['cusedit'] = crinfUsedIt;
  					}
					scope.openEMUCClient({
						cp: encodeURIComponent('crid='),
						cj: encodeURIComponent('usedit='+ServParam.t+cusedit)						
					},serPar);
  				}
  			return false;
		});
	}
};
/**
 * отображение ссылки на переход в EMUC клиент
 * @param {[Object]} links - html id элемента для отображения
 *  Пример links:[
 *      	{
 *      	   htmlId:'htmlId',//id куда вставлять ответ
 *             roomId:'roomId',//есле чат хоть раз был иницыализирован 
 *             crinfo:'crinfo',//или crinfo если не разу или не известно
 *             callback:function(){}//функция которая обрабатывает ответ 
 *          }
 */
EMUC.prototype.links = function(links){
	var scope = this;
	var crinfo = '';
	var roomId = '';
	var crinfos= {};
	var roomIds ={};
	for (var ii = 0; ii < links.length; ii++) {
		var pLinks = links[ii]; 
		if (pLinks.crinfo && ('' != pLinks.crinfo)) {
			crinfo += pLinks.crinfo + ',';
			crinfos[pLinks.crinfo] = pLinks;
		}
		//TODO: Т.к. на сервере не верно обрабатывается crinfo, пока коментируем 
		//else {
			if (pLinks.roomId && ('' != pLinks.roomId)) {
				roomId += pLinks.roomId + ',';
				roomIds[pLinks.roomId] = pLinks;
			}
		//}
	}
	roomId = roomId.replace(/,$/, '');
	crinfo = crinfo.replace(/,$/, '');
	var qPar = '';
	if ('' != roomId) {
		qPar += 'rooms=' + roomId;
	}
	if ('' != crinfo) {
		qPar += ('' != qPar ? '&' : '') + 'crinfos=' + crinfo;
	}
	if ('' != qPar) {
		qPar +='&qfo=r,ru';
		EMUCJsonpRequest.send({
			disableCaching:false,
			url: this.host + 'pipe/muc/query/{callback}/',
			params: {
				cp: encodeURIComponent(qPar)
			},
			callback: function(param){
				/**
				 * переводим данные в хеш параметры
				 * для быстрого поиска
				 * TODO: возможно их и нужно так передавать
				 */
				var hashParam ={rooms:{},users:{},crinfos:{}};
				//Если нет данных, то выходим
				if(!param.users){
					return false;
				}
				for(var jj = 0; jj < param.users.length; jj++){
					var pUsr = param.users[jj];
					hashParam.users[pUsr.puid] = pUsr; 
					pUsr.rooms =[];
					for(var ii = 0; ii < pUsr.puids.length; ii++){
						var puidsUsr = pUsr.puids[ii]; 			
						hashParam.users[puidsUsr] = pUsr;
						pUsr.rooms =[];	
					}
				}
				for (var ii = 0; ii < param.rooms.length; ii++) {
					var pRm = param.rooms[ii];
					hashParam.rooms[pRm.room] = pRm; 
					pRm.users = [];
					if(pRm.opts.crinfo){
						hashParam.crinfos[pRm.opts.crinfo] = pRm;
						pRm.users = [];	
					}					
				}				
				for (var ii = 0; ii < param.affiliations.length; ii++) {
					var afs = param.affiliations[ii].key;
					var roomEl = hashParam.rooms[afs.room];
					var userEl = hashParam.users[afs.puid];
					if(roomEl){
						roomEl.users = roomEl.users.concat(afs.puid);
						var pParam =hashParam.crinfos[roomEl.opts.crinfo]; 
						if(pParam){
							pParam = roomEl.users.concat(afs.puid);
						}	
					}					
					if(userEl){
						userEl.rooms =userEl.rooms.concat(afs.room); 
					}					
				}
				for (var ii = 0; ii < param.rooms.length; ii++) {
					var pRm = param.rooms[ii];
					var pIdRm =roomIds[param.rooms[ii].room]||crinfos[pRm.opts.crinfo]; 			 
					if (pIdRm) {
						if (typeof pIdRm.callback == 'function') {
							pIdRm.callback(pIdRm, pRm, hashParam);
						}
						else {
							scope.drawRooms(pIdRm, pRm, hashParam);							
						}
					} 
					if (typeof pIdRm.onfinish == 'function') {
						pIdRm.onfinish(pIdRm, pRm, hashParam);
					}
				}			
			}
		});
	}
};
/**
 * Отрисовка информацию по чату
 * @param {Object} userData - данные пользователь что ввел(id html)
 * @param {Object} serverDataRoom - данные по данной комнате
 * @param {Object} serverData - все данные что получили
 */
EMUC.prototype.drawRooms = function(userData,serverDataRoom,serverData){
	var scope = this;
	var el = document.getElementById(userData.htmlId);
	var status = '';
	if (el) {
		var pSerRoomUs = serverData.rooms[serverDataRoom.room].users;
		for(var ii=0; ii<pSerRoomUs.length;ii++){
			var pUsrI =pSerRoomUs[ii]; 
			if(pUsrI){
				status = serverData.users[pUsrI].status;
				break;
			}
		}
		if(''!=status){
			status = "<span style='color: #"+('online'==status?'008000':'FF0000')+";cursor: pointer;'> "+status+" </span>";
		}		
		el.innerHTML = "<div style='color: #0000FF;cursor: pointer;'>"+status+"Войти в чат "+serverDataRoom.room+"</div>";
		this.addClick(el.childNodes[0], function(){
			scope.openEMUCClient({
				cp:encodeURIComponent('crid='),
				cj: encodeURIComponent('rooms='+serverDataRoom.room+'&qfo=r,ru')				
			}, {
				rooms: serverDataRoom.room
			});
		});
	}	
};
/**
 * Прикрепление события клик на элементы
 */
EMUC.prototype.addClick = function(elem,handle){
	if (elem.addEventListener){
		elem.addEventListener('click', handle, false);
	}else{
		elem.attachEvent("onclick", handle);
	}	          
};
/**
 * открытие EMUC клиента
 * @param {Object} conf параметры для запроса
 * @param {Object} parClient параметры для вставки в url
 * @param {Object} oParam дополнительные параметры
 */
EMUC.prototype.openEMUCClient = function(conf, parClient,oParam){
	var scope = this;		
	/**
	 * открывать ли в отдельном окне
	 */
	var oParam = scope.ifr?((oParam||{}).pp||false):true; 	
	EMUCJsonpRequest.send({
		url: this.host + 'pipe/muc/query/{callback}/',
		params: conf,
		callback: function(par){
			if (!par.users||!par.users.length || ('offline' == scope.statusUserSelf(par.users))) {
				var urlparams = '';
				if (parClient) {
					for (var prop in parClient) {
						if ((prop == 'open') && (typeof parClient['open'] == 'string')) {
							urlparams += parClient['open'];
						}
						else {
							urlparams += prop + '=[' + parClient[prop] + ']/';
						}
					}
				}
				if ('' != urlparams) {
					urlparams = '/' + urlparams;
				}
				var urlP = scope.host + "ems/#" + urlparams;
				if(oParam||par.users&&par.users.length&&par.users[0].iwaR){
					scope.drawWindow(urlP, scope.nameWinEMUC, "left=" + scope.leftEMUC + ",width=" + scope.widthEMUC + ",height=" + scope.heightEMUC + ",resizable=yes,scrollbars=yes,status=yes");	
				}else{
					scope.drawIframeWindow(urlP);
				}				
			}else{
				scope.drawAlertWindow('Перейдите в клиент.<br/>Он уже открыт.');
			}
		}
	});
};
/**
 * Определяем статус текущкго пользователя
 * @param {Object} users список владельцев
 * @return {String}
 */
EMUC.prototype.statusUserSelf = function(users){
	for(var puid in users){
		var pUser = users[puid]; 
		if(pUser.self){
			return pUser.status;
		}		
	}
	return "offline";
};
/**
 * Отрисовка окна для открытия клиента
 * @param {String} url
 * @param {String} name
 * @param {String} param
 */
EMUC.prototype.drawWindow = function(url,name,param){
	var el =document.getElementById("EMUCWindow"); 
	if(!el){
		el = document.createElement('div');
		el.setAttribute('id', 'EMUCWindow');	
	}
	var viewport = this.getViewportHeightWidth();
	var topW = Math.round(viewport.height/2 - 25) + viewport.vScroll;
	var leftW = Math.round(viewport.width/2 - 75) + viewport.hScroll;
	el.innerHTML = ['<div style="height: ',viewport.height+ viewport.vScroll,'px;width: 100%;left:0;z-index: 1001;background: none repeat-x scroll 50% 50% #AAAAAA;opacity: 0.3;position: absolute;top: 0;"></div><div style="position: absolute;top: ',topW,'px;left:',leftW,'px;width:150px;height:62px;z-index: 1002;opacity: 1;"><div style="border:2px solid #73BF00;border-radius: 14px 14px 14px 14px;box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.3);float: left;height: 108px;margin-bottom: 14px;margin-top: 22px;width: 193px;background:url('+this.host+'ems/img/img/tooltip.png) repeat-x;"><div style="background: url('+this.host+'ems/img/img/x.png) no-repeat scroll 0 0 transparent;float: right;height: 9px;margin-right: 10px;margin-top: 10px;width: 9px;cursor:pointer;" onclick="document.getElementById(\'EMUCWindow\').innerHTML = \'\';"> </div><div style="clear: both;color: #00f;font:13px Tahoma;margin-left: 13px;margin-right: 10px;cursor:pointer;margin-bottom:10px;" onclick="document.getElementById(\'EMUCWindow\').innerHTML = \'\'; window.open(\'',url,'\',\''+name+'\',\'',param,'\');">открыть в новом окне</div>',
	'<a href="',url,'" style="margin-left:13px;color:#00f;text-decoration:none;font:13px Tahoma;outline:0px;" target="_blank" onclick="document.getElementById(\'EMUCWindow\').innerHTML = \'\'">открыть в новой вкладке</a></div></div>'].join('');
	document.body.appendChild(el);
};
/**
 * Отрисовка iframe
 * @param {String} url
 */
EMUC.prototype.drawIframeWindow = function(url){
	var el =document.getElementById("EMUCWindow"); 
	if(!el){
		el = document.createElement('div');
		el.setAttribute('id', 'EMUCWindow');	
	}
	var viewport = this.getViewportHeightWidth();	
	var topW = Math.round(viewport.height/2 - 300) + viewport.vScroll;
	topW = (topW < 0) ? 0:topW;
	var leftW = Math.round(viewport.width/2 - 250) + viewport.hScroll;		
	el.innerHTML = ['<div style="height: ',((viewport.dheight<600)?600:viewport.dheight),'px;width: 100%;left:0;z-index: 1001;background: none repeat-x scroll 50% 50% #AAAAAA;opacity: 0.8;filter:alpha(opacity=80);zoom:1;position: absolute;top: 0;"></div><div style="position: absolute;top: ',topW,'px;left:',leftW,'px;z-index: 1002;opacity: 1;"><div title="закрыть" style="background: url('+this.host+'ems/img/img/close.png) no-repeat scroll 0 0 transparent;height: 16px;width: 16px;position:absolute;top:11px;right:3px;cursor:pointer;" onclick="document.getElementById(\'EMUCWindow\').innerHTML = \'\';"> </div><iframe style="width:500px;height:645px;border:1px solid #999" src="',url,'"/></div>'].join('');
	document.body.appendChild(el);
};
/**
 * Отрисовка окна с сообщением
 * @param {String} text - текст сообщения
 */
EMUC.prototype.drawAlertWindow = function(text){
	var el = document.getElementById("EMUCWindow"); 
	if(!el){
		el = document.createElement('div');
		el.setAttribute('id', 'EMUCWindow');	
	}
	var viewport = this.getViewportHeightWidth();
	var topW = Math.round(viewport.height/2 - 25) + viewport.vScroll;
	topW = (topW < 0) ? 0:topW;
	var leftW = Math.round(viewport.width/2 - 75) + viewport.hScroll;
	//el.innerHTML = ['<div style="height: ',viewport.height+ viewport.vScroll,'px;width: 100%;left:0;z-index: 1001;background: none repeat-x scroll 50% 50% #AAAAAA;opacity: 0.3;position: absolute;top: 0;"></div><div style="text-align: center;position: absolute;top: ',topW,'px;left:',leftW,'px;width:150px;height:62px;z-index: 1002;background: none repeat scroll 50% 50% #fff;opacity: 1;"><div style="color: #0000FF;cursor: pointer;text-align: right;" onclick="document.getElementById(\'EMUCWindow\').innerHTML = \'\';">закрыть</div><div>',text,'</div></div>'].join('');
	el.innerHTML = ['<div style="height: ',viewport.dheight,'px;width: 100%;left:0;z-index: 1001;background: none repeat-x scroll 50% 50% #AAAAAA;opacity: 0.3;filter:alpha(opacity=30);zoom:1;position: absolute;top: 0;"></div><div style="position: absolute;top: ',topW,'px;left:',leftW,'px;width:150px;height:62px;z-index: 1002;opacity: 1;"><div style="border:2px solid #73BF00;border-radius: 14px 14px 14px 14px;box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.3);float: left;height: 108px;margin-bottom: 14px;margin-top: 22px;width: 193px;background:url('+this.host+'ems/img/img/tooltip.png) repeat-x;"><div style="background: url('+this.host+'ems/img/img/x.png) no-repeat scroll 0 0 transparent;float: right;height: 9px;margin-right: 10px;margin-top: 10px;width: 9px;cursor:pointer;" onclick="document.getElementById(\'EMUCWindow\').innerHTML = \'\';"> </div><div style="clear: both;color: #444444;font-family: Tahoma;font-size: 13px;margin-left: 18px;margin-right: 10px;">Обсуждение открыто в окне клиента (другое окно браузера), можете перейти в него.</div></div></div>'].join('');
	document.body.appendChild(el);
};
/**
 * Определяем ширину и высоту экрана пользователя для отображения drawWindow  
 * @return {Object}
 */
EMUC.prototype.getViewportHeightWidth = function(){
	var vp = {};
	if (window.innerWidth) { 
		vp =  {
			width: window.innerWidth,
			height: window.innerHeight,
			hScroll: window.pageXOffset,
			vScroll: window.pageYOffset
		};
	}
	else 
		if (document.documentElement && document.documentElement.clientWidth) {			
			vp =  {
				width: document.documentElement.clientWidth,
				height: document.documentElement.clientHeight,
				hScroll: document.documentElement.scrollLeft,
				vScroll: document.documentElement.scrollTop
			};
		}
		else 
			if (document.body.clientWidth) {
				vp =  {
					width: document.body.clientWidth,
					height: document.body.clientHeight,
					hScroll: document.body.scrollLeft,
					vScroll: document.body.scrollTop
				};
			}
	vp['dheight'] = Math.max(document.compatMode != 'CSS1Compat' ? document.body.scrollHeight : document.documentElement.scrollHeight, vp.height);
	return vp;	
};
/**
 * отрисовка боковой панели для UsedIt
 * @param {Object} ServParam - парматры от сервера
 * @param {String} usedIt.ifr - открывать ли в ифрейме для незарегистрированых пользователей
 * @param {String} ServParam.tс название для кнопки входа в чат
 * @param {String} ServParam.tui название для кнопки пользовался
 * @param {Object} locParam - параметры от клиента
 */
EMUC.prototype.drawUsedItPanel = function(ServParam,locParam){		
	var scope = this;
	ServParam.tui = validText(ServParam.tui||locParam.tui);
	ServParam.tc = validText(ServParam.tc||locParam.tc);	
	if((!ServParam.tc&&!ServParam.tc)||(ServParam.tc==="-"&&ServParam.tui==="-")){
		return;
	}
	function validText(str){
		if(str.length > 35){
			return str.substr(0,32) + '...';
		}else{
			return str;
		}
	}
	var el =document.getElementById("msgWindowEmucUsedIt");
	if(!el){
		el = document.createElement('div');
		el.setAttribute('id', 'msgWindowEmucUsedIt');	
	}
	function isIE (){
		var ua = navigator.userAgent.toLowerCase();;
		return (-1 < ua.indexOf('msie'));
	}			
	el.innerHTML = '<div style="position: '+ ((isIE() && document.compatMode == 'BackCompat')?'absolute;width:18%;':'fixed;') +'white-space:nowrap;top: 50%;right:1px;z-index: 1000;opacity: 1;"><div style="border:2px solid #73BF00;border-radius: 14px 14px 14px 14px;box-shadow: 0 0 10px 5px rgba(0, 0, 0, 0.3);height: 60px;margin-bottom: 14px;margin-top: 22px;padding-left:8px;padding-right:8px;background:url('+this.host+'ems/img/img/tooltip.png) repeat-x;">'+
	"<div style='text-align:center;'>"+
			(ServParam.tui !=="-"?"<span class='usedIteCon' style='background: url(\""+this.host+"ems/img/disc_btn.png\") repeat-x scroll 0 0 transparent;border: 1px solid #CCCCCC;border-radius: 4px 4px 4px 4px;color: #000000;cursor: pointer;"+
		    "display:block;height: 18px;line-height: 1.4;padding:0px 7px;font-size:13px;text-align:center;"+
			"margin-top:7px;'>"+ServParam.tui+"</span>":"")+
			(ServParam.tc !=="-"?"<span class='callusedIteCon' style='background: url(\""+this.host+"ems/img/disc_btn.png\") repeat-x scroll 0 0 transparent;"+
		    "border: 1px solid #CCCCCC;border-radius: 4px 4px 4px 4px;color: #000000;cursor: pointer;"+
		    "display:block;height: 18px;padding:0px 5px;margin-top:5px;line-height: 1.4;font-size:12px;text-align:center;'>"+ServParam.tc+"</span>":"")+
		    "</div>"
	+'</div></div>';
	this.addClick(el, function(event){
  			event = event || window.event;
  			var t = event.target || event.srcElement;
  			if('usedIteCon'===t.className){
  					window.open(scope.host + "usedit/"+ServParam.t+"/"+(locParam.c||ServParam.c||"") ,'', "left=" + scope.leftUsedIt + ",width=" + scope.widthUsedIt + ",height=" + scope.heightUsedIt + ",resizable=yes,scrollbars=yes,status=yes");
  				}else if('callusedIteCon'===t.className){
  					var cusedit = '';
  					var serPar = {usedit:ServParam.t};
  					var crinfUsedIt =ServParam.c||locParam.c; 
  					if(crinfUsedIt){
  						cusedit = '&cusedit='+crinfUsedIt;
  						serPar['cusedit'] = crinfUsedIt;
  					}
					scope.openEMUCClient({
						cp: encodeURIComponent('crid='),
						cj: encodeURIComponent('usedit='+ServParam.t+cusedit)						
					},serPar,{
						pp:!locParam.ifr
					});
  				}
  			return false;
		});
	document.body.appendChild(el);	
};

