/*!
 This is client module for chat
 Written by Perlover, (c) Perlover, 2011 year.
 http://traffic.perlover.com/
*/
String.prototype.escapeHTML=function(){return(this.replace(/&/g,"&amp;").replace(/>/g,"&gt;").replace(/</g,"&lt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"))};Chat.chatFields=["#chPhrase input","#chNick input",'div#chat select[name="cn"]','div#chat select[name="cl"]','div#chat select[name="hl"]'];function Chat(){var a=this;a.defParams={cache:false,dataType:"json",scriptCharset:"utf-8",url:"/chat/"};a.maxMessages=200;a.currentMessages=0;a.status={chatFieldsDisabled:false,bmUsers:{}};a.start=function(){if($.cookie("bmusers")){a.status.bmUsers=$.deparam($.cookie("bmusers"),true)}if($.cookie("session")){a.restoreSession($.cookie("session"))}else{a.requestSession()}};a.localization=function(){var b=[["#chTitleText","f:text",__("The realtime chat of all our sites visitors")],["#chMinimizeText","f:text",__p("Please keep a square brackets","[Minimize]")],["#chOpenChatText","f:text",__p("Please keep a square brackets","[Open]")],["#chCloseText span","f:text",__p("Please keep a square brackets","[Close]")],["#chYourChannelText","f:text",__("Your channel:")],["#chYourLangText","f:text",__("Your language:")],["#chLocaleText","f:text",__("Interface language:")],["#chYourNickText","f:text",__("Your Nick:")],["#chPhrase span","f:text",__("Your message:")],["#chMembersText","f:text",__p("The common name of channel users","Members:")],["div#chEnterButton div","f:text",__("Send")]];$.each(b,function(){var d=arguments[1];var c=d[1].match(/^(\w):(\w+)/);if(c[1]=="f"){$(d[0])[c[2]](d[2])}else{$(d[0])[c[2]]=d[2]}});$("#chChannelProps select[name=cn] option").each(function(){var d=$(this).data("notTranslated");var c;$(this).text((c=d.match(/^Room (.*)/))?(__("Room %s").replace(/%s/,c[1])):__(d))});if($("#chPhrase input").val()==""||$("#chPhrase input").hasClass("chEmptyField")){a.uninitChatFields();$("#chPhrase input").addClass("chEmptyField").val(__("What do you want to tell?"));a.initChatFields()}};a.waitConnect={msec:0,start:function(b){a.waitConnect.msec=4000+Math.round(Math.random()*10000);a.waitConnect.print();a.waitConnect.waitInterval=window.setInterval(function(){a.waitConnect.print();a.waitConnect.msec-=1000},1000);window.setTimeout(function(){if(a.waitConnect.waitInterval){window.clearInterval(a.waitConnect.waitInterval)}a.waitConnect.waitInterval=null;b()},a.waitConnect.msec)},print:function(){var b=Math.round(a.waitConnect.msec/1000);a.printError(__n("The chat server doesn't work now. Please wait one second","The chat server doesn't work now. Please wait %s seconds!",b).replace(/%s/,b))}};a.postShowPanel=function(){if(typeof a.status.siteid!=="undefined"){$("div#chat div.addthis_toolbox").attr("addthis:url",a.sites[a.status.siteid].url+"#chat").attr("addthis:title","Chat @ "+a.sites[a.status.siteid].title);if(window.location.href.indexOf("#chat")>0){$("div#chMinimalLayer").click()}}};a.showPanel=function(){var b='<div id="chat" class="chMinimal"><div id="chMainWindow"><div id="chMinimalLayer"></div><div id="chTitle"><div id="chWindowTitle"><div id="chCloseText"><span>[Close]</span></div><div id="chMinimizeText">[Minimize]</div><div id="chOpenChatText">[Open]</div><div id="chTitleText">The realtime cross-site chat</div><div id="chAddthisButton"><!-- AddThis Button BEGIN --><div class="addthis_toolbox addthis_default_style "><a href="http://www.addthis.com/bookmark.php?v=250&amp;pubid=perlover" class="addthis_button_compact">Share</a><span class="addthis_separator">|</span><a class="addthis_button_preferred_1"></a><a class="addthis_button_preferred_2"></a><a class="addthis_button_preferred_3"></a><a class="addthis_button_preferred_4"></a></div><!-- AddThis Button END --></div></div></div><div id="chTopBlocks"><div id="chChatWin"><div><div id="chChannelProps"><span id="chYourChannelText">Your channel:</span><select name="cn"></select>&nbsp;<span id="chYourLangText">Channel language:</span><select name="cl"></select>&nbsp;<span id="chLocaleText">Interface language:</span><select name="hl"></select></div><div id="chMessages"></div></div></div><div id="chMemberWin"><div><span id="chMembersText">Members</span><div id="chUserList"></div></div></div></div><div id="chChatFields"><div id="chNick"><span id="chYourNickText">Your Nick:</span><input type="text" value="">@<span id="chSiteOfNick"></span></div><div id="chPhrase"><div id="chPhraseInput"><input type="text" value=""></div><div id="chPhraseYourMsg"><span>Your message:</span></div></div><div id="chEnterButton"><div>&nbsp;Send&nbsp;</div></div></div><div id="chStatusBar"><div><span id="chError" class="chError">Здесь будут ошибки</span></div></div></div></div>';if(a.status.showedPanel){return}$("body").append(b);$("div#chMinimalLayer").click(function(){$("div#chat").removeClass("chMinimal");var c=$("#chMessages").get(0);c.scrollTop=c.scrollHeight-c.clientHeight;if(window.addthis){window.addthis.ost=0;window.addthis.ready()}});$("#chMinimizeText").click(function(){$("div#chat").addClass("chMinimal");var c=$("#chMessages").get(0);c.scrollTop=c.scrollHeight-c.clientHeight});$("div#chEnterButton > div").click(function(){var c=$("#chPhrase input");if(c.attr("disabled")){return}c.focus();a.sendMessage(c)});$("#chCloseText").click(function(){a.closePanel()});a.status.showedPanel=true};a.closePanel=function(){a.commandHandler.stopPolling();a.status.closed=true;$("div#chat").remove()};a.requestSession=function(){var b=a.ajax({data:{action:"requestSession",domain:document.domain},success:function(c){a.showPanel();a.commands(c);a.postShowPanel()},error:function(){a.disableChatFields();if(b.status==502){a.waitConnect.start(a.requestSession)}else{a.serverError(b.status)}}})};a.restoreSession=function(b){var c=a.ajax({data:{action:"restoreSession",session:b},success:function(d){a.showPanel();a.commands(d);a.postShowPanel()},error:function(){a.disableChatFields();if(c.status==502){a.waitConnect.start(a.restoreSession)}else{a.serverError(c.status)}}})};a.commands=function(c){if(a.status.closed){return}a.enableChatFields();var d=$("#chMessages").get(0);var b=d.scrollTop+d.clientHeight>=d.scrollHeight;a.commands.deletedMessageHeights=0;$.each(c,function(e,f){if(f.action&&$.isFunction(a.commandHandler[f.action])){a.commandHandler[f.action](f)}});if(b||$("div#chat").hasClass("chMinimal")){d.scrollTop=d.scrollHeight-d.clientHeight}else{if(d.scrollTop>0){d.scrollTop-=a.commands.deletedMessageHeights}}};a.appendUserView=function(c,b){return a.appendSiteView(c.append(document.createTextNode(b.nick+"@")),b.siteid)};a.appendSiteView=function(c,b){$("<a/>").appendTo(c).attr({href:a.sites[b].url,title:a.sites[b].title,target:"_blank"}).text(a.sites[b].title);return c};a.setLocale=function(b){gt=new Gettext({domain:a.status.locale,locale_data:b});a.localization()};a.sendPoolRequest=function(){if(a.pollRequest||a.status.stopped){return}if(!$.cookie("session")){return}a.enableChatFields();a.pollRequest=true;a.poolTimeout=window.setTimeout(function(){a.printStatus(__("Chat is active. You are online!"));a.poolTimeout=null},2000);var b=a.ajax({data:{action:"poll"},success:function(c){if(a.poolTimeout){window.clearTimeout(a.poolTimeout);a.poolTimeout=null}a.pollRequest=false;a.commands(c);if(!a.pollRequest){a.sendPoolRequest()}},error:function(){if(a.poolTimeout){window.clearTimeout(a.poolTimeout);a.poolTimeout=null}a.pollRequest=false;if(b.status==502){a.waitConnect.start(a.sendPoolRequest)}else{a.serverError(b.status);window.setTimeout(a.sendPoolRequest,2000)}}})};a.initChatFields=function(){a.uninitChatFields();$("#chPhrase input").addClass(function(){return $(this).val()==""?"chEmptyField":""}).bind("keypress.chat",function(b){if(b.which==13){a.sendMessage($(b.target))}}).bind("focus.chat",function(){var b;if((b=$(this)).hasClass("chEmptyField")){b.val("").removeClass("chEmptyField")}});$("#chNick input").bind("keypress.chat",function(b){if(b.which==13){a.setNick($(b.target))}}).bind("focus.chat",function(){var b;if((b=$(this)).hasClass("chEmptyField")){b.val("").removeClass("chEmptyField")}}).bind("change.chat",function(){a.setNick($(this))})};a.uninitChatFields=function(){$("#chPhrase input").unbind(".chat");$("#chNick input").unbind(".chat")};a.enableChatFields=function(){if(a.status.chatFieldsDisabled){$.each(Chat.chatFields,function(){$(String(this)).removeAttr("disabled")});a.status.chatFieldsDisabled=false}};a.disableChatFields=function(){if(!a.status.chatFieldsDisabled){$.each(Chat.chatFields,function(){$(String(this)).attr("disabled",1)});a.status.chatFieldsDisabled=true}};a.commandHandler={requestSession:function(){a.requestSession()},startPolling:function(){a.printStatus(__("Chat is active. You are online!"));a.status.stopped=false;a.sendPoolRequest();a.initChatFields();a.enableChatFields()},stopPolling:function(){a.status.stopped=true;a.uninitChatFields();a.disableChatFields()},setLocale:function(c){if(a.status.locale==c.hl){return}a.status.locale=c.hl;$.getScript(chatParams.locales+"/"+c.hl+".js");var d=$("#chChannelProps select[name=hl]").empty();$.each(c.locales,function(e,g){var f=$("<option />").appendTo(d).attr("value",g.hl).text(g.name);if(g.hl==c.hl){f.attr("selected",1)}});var b;d.change(b=function(f){$(this).unbind("change");var e=a.ajax({data:{action:"setLocale",hl:$(this).val()},success:function(g){a.commands(g)},error:function(){a.serverError(e.status);b(f)}})})},setSiteList:function(b){a.sites=b.sites},setUserList:function(b){if(b.users){var c=$("#chUserList").empty();$.each(b.users,function(){var d;a.appendUserView($("span.chNick",d=$('<div><div class="chBookmark"></div><span class="chNick"></span></div>').appendTo(c)).data(arguments[1]),arguments[1]);if(a.status.bmUsers[arguments[1].siteid]&&a.status.bmUsers[arguments[1].siteid][arguments[1].nick.toLowerCase()]){$("div.chBookmark",d).addClass("chMarked")}});$("#chUserList div.chBookmark").click(function(){var f=$(this).toggleClass("chMarked");var e=f.next().data();var d=0;if(f.hasClass("chMarked")){d=(a.status.bmUsers[e.siteid]||(a.status.bmUsers[e.siteid]={}))[e.nick.toLowerCase()]=1}else{delete a.status.bmUsers[e.siteid][e.nick.toLowerCase()]}$("#chMessages div.chBookmark").each(function(){var g=$(this).data();if(e.siteid==g.siteid&&e.nick.toLowerCase()==g.nick.toLowerCase()){$(this)[d?"addClass":"removeClass"]("chMarked")}});$.cookie("bmusers",$.param(a.status.bmUsers),{expires:7,path:"/"})})}},setNick:function(b){if(b.nick==null){$("#chNick input").val(__("Enter your nick")).addClass("chEmptyField")}else{$("#chNick input").val(b.nick).removeClass("chEmptyField")}a.appendSiteView($("#chSiteOfNick").empty(),a.status.siteid=b.siteid)},setChannel:function(e){a.status.cn=e.cn;a.status.cl=e.cl;$("#chMessages").empty();a.commands(e.messages);var b=$("#chChannelProps select[name=cn]").empty();$.each(e.channels,function(g,j){var f;var h=$("<option />").appendTo(b).attr("value",j.cn).text(j.name).data("notTranslated",j.name);if(e.cn==j.cn){h.attr("selected",1)}});var c=$("#chChannelProps select[name=cl]").empty();$.each(e.clangs,function(f,h){var g=$("<option />").appendTo(c).attr("value",h.cl).text(h.name);if(e.cl==h.cl){g.attr("selected",1)}});var d=function(g){b.unbind("change");c.unbind("change");var f=a.ajax({data:{action:"changeChannel",cn:b.val(),cl:c.val()},success:function(h){a.commands(h)},error:function(){a.serverError(f.status);d(g)}})};a.localization();b.change(d);c.change(d)},changeUser:function(c){var b;$("#chMessages").append(b=$("<div/>").text(__(c.message)));b.html(b.html().replace(/\{oldNick\}/,"<span/>"));a.appendUserView($("span",b).not(".chNickSpan"),c.oldUser).addClass("chNickSpan");b.html(b.html().replace(/\{newNick\}/,"<span/>"));a.appendUserView($("span",b).not(".chNickSpan"),c.newUser).addClass("chNickSpan")},message:function(b){var d;var c=$("#chMessages").append($("<div/>").append(a.appendUserView($("<div/>"),b.user).addClass("chNickSpan")).append(d=$('<div class="chBookmark"/>')).append($('<div class="chMessage"/>').text(b.text))).children("div");if(a.status.bmUsers[b.user.siteid]&&a.status.bmUsers[b.user.siteid][b.user.nick.toLowerCase()]){d.addClass("chMarked")}d.data(b.user);if(c.length>a.maxMessages){c.slice(0,c.length-a.maxMessages).each(function(){a.commands.deletedMessageHeights+=this.offsetHeight}).remove()}},error:function(b){a.printError(b.message)},urgentError:function(b){alert(__(b.message))},logout:function(){a.printStatus(__("The exit command has arrived from server"))},alreadyHaveChat:function(){a.closePanel()}};a.ajax=function(b){return $.ajax($.extend({},a.defParams,b))};a.printError=function(b){$("#chError").attr("class","chError").text(__(b))};a.printStatus=function(b){$("#chError").attr("class","chStatus").text(b)};a.sendMessage=function(b){if(/^\s*$/.test(b.val())){return}var c=function(e){var d=a.ajax({data:{action:"sendMessage",text:e},type:"POST",success:function(g){b.removeAttr("disabled").val("");var f;(f=$("#chMessages").get(0)).focus();f.scrollTop=f.scrollHeight-f.clientHeight;a.commands(g);b.get(0).focus()},error:function(){window.setTimeout(function(){c(e)},500);a.serverError(d.status)}})};c(b.val());b.val(__("Your message is sending. Please wait!")).attr("disabled",1)};a.setNick=function(c){if(a.status.nick==c.val()){return}var b=function(d){var e=a.ajax({data:{action:"setNick",newNick:(a.status.nick=d)},type:"POST",success:function(f){a.commands(f)},error:function(){window.setTimeout(function(){b(d)},500);a.serverError(e.status)}})};b(c.val())};a.serverError=function(b){switch(b){case 503:a.printError(__("You are sending messages too frequently!"));break;case 504:a.printError(__("Timeout error. Please wait!"));break;default:a.printError(__("Unknown server error"))}};return a}var gt;function __(a){return gt?gt.gettext(a):a}function __p(){return gt?gt.pgettext.apply(gt,arguments):arguments[1]}function __n(){return gt?gt.ngettext.apply(gt,arguments):(arguments[2]>1?arguments[1]:arguments[0])}$(function(){var a=chatParams.chatObj=new Chat();a.start()});function debug(a){if(typeof console!=="undefined"&&console.log){console.log(a)}};
