123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263 |
- <?php
- if (!defined('SMF'))
- die('Hacking attempt...');
- function updateStats($type, $parameter1 = null, $parameter2 = null)
- {
- global $sourcedir, $modSettings, $smcFunc;
- switch ($type)
- {
- case 'member':
- $changes = array(
- 'memberlist_updated' => time(),
- );
-
- if (is_numeric($parameter1))
- {
- $changes['latestMember'] = $parameter1;
- $changes['latestRealName'] = $parameter2;
- updateSettings(array('totalMembers' => true), true);
- }
-
- else
- {
-
- $result = $smcFunc['db_query']('', '
- SELECT COUNT(*), MAX(id_member)
- FROM {db_prefix}members
- WHERE is_activated = {int:is_activated}',
- array(
- 'is_activated' => 1,
- )
- );
- list ($changes['totalMembers'], $changes['latestMember']) = $smcFunc['db_fetch_row']($result);
- $smcFunc['db_free_result']($result);
-
- $result = $smcFunc['db_query']('', '
- SELECT real_name
- FROM {db_prefix}members
- WHERE id_member = {int:id_member}
- LIMIT 1',
- array(
- 'id_member' => (int) $changes['latestMember'],
- )
- );
- list ($changes['latestRealName']) = $smcFunc['db_fetch_row']($result);
- $smcFunc['db_free_result']($result);
-
- if ((!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 2) || !empty($modSettings['approveAccountDeletion']))
- {
-
- $result = $smcFunc['db_query']('', '
- SELECT COUNT(*)
- FROM {db_prefix}members
- WHERE is_activated IN ({array_int:activation_status})',
- array(
- 'activation_status' => array(3, 4),
- )
- );
- list ($changes['unapprovedMembers']) = $smcFunc['db_fetch_row']($result);
- $smcFunc['db_free_result']($result);
- }
- }
- updateSettings($changes);
- break;
- case 'message':
- if ($parameter1 === true && $parameter2 !== null)
- updateSettings(array('totalMessages' => true, 'maxMsgID' => $parameter2), true);
- else
- {
-
- $result = $smcFunc['db_query']('', '
- SELECT SUM(num_posts + unapproved_posts) AS total_messages, MAX(id_last_msg) AS max_msg_id
- FROM {db_prefix}boards
- WHERE redirect = {string:blank_redirect}' . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? '
- AND id_board != {int:recycle_board}' : ''),
- array(
- 'recycle_board' => isset($modSettings['recycle_board']) ? $modSettings['recycle_board'] : 0,
- 'blank_redirect' => '',
- )
- );
- $row = $smcFunc['db_fetch_assoc']($result);
- $smcFunc['db_free_result']($result);
- updateSettings(array(
- 'totalMessages' => $row['total_messages'] === null ? 0 : $row['total_messages'],
- 'maxMsgID' => $row['max_msg_id'] === null ? 0 : $row['max_msg_id']
- ));
- }
- break;
- case 'subject':
-
- $smcFunc['db_query']('', '
- DELETE FROM {db_prefix}log_search_subjects
- WHERE id_topic = {int:id_topic}',
- array(
- 'id_topic' => (int) $parameter1,
- )
- );
-
- if ($parameter2 !== null)
- {
- $parameter1 = (int) $parameter1;
- $parameter2 = text2words($parameter2);
- $inserts = array();
- foreach ($parameter2 as $word)
- $inserts[] = array($word, $parameter1);
- if (!empty($inserts))
- $smcFunc['db_insert']('ignore',
- '{db_prefix}log_search_subjects',
- array('word' => 'string', 'id_topic' => 'int'),
- $inserts,
- array('word', 'id_topic')
- );
- }
- break;
- case 'topic':
- if ($parameter1 === true)
- updateSettings(array('totalTopics' => true), true);
- else
- {
-
-
- $result = $smcFunc['db_query']('', '
- SELECT SUM(num_topics + unapproved_topics) AS total_topics
- FROM {db_prefix}boards' . (!empty($modSettings['recycle_enable']) && $modSettings['recycle_board'] > 0 ? '
- WHERE id_board != {int:recycle_board}' : ''),
- array(
- 'recycle_board' => !empty($modSettings['recycle_board']) ? $modSettings['recycle_board'] : 0,
- )
- );
- $row = $smcFunc['db_fetch_assoc']($result);
- $smcFunc['db_free_result']($result);
- updateSettings(array('totalTopics' => $row['total_topics'] === null ? 0 : $row['total_topics']));
- }
- break;
- case 'postgroups':
-
- if ($parameter2 !== null && !in_array('posts', $parameter2))
- return;
- $postgroups = cache_get_data('updateStats:postgroups', 360);
- if ($postgroups == null || $parameter1 == null)
- {
-
- $request = $smcFunc['db_query']('', '
- SELECT id_group, min_posts
- FROM {db_prefix}membergroups
- WHERE min_posts != {int:min_posts}',
- array(
- 'min_posts' => -1,
- )
- );
- $postgroups = array();
- while ($row = $smcFunc['db_fetch_assoc']($request))
- $postgroups[$row['id_group']] = $row['min_posts'];
- $smcFunc['db_free_result']($request);
-
- arsort($postgroups);
- cache_put_data('updateStats:postgroups', $postgroups, 360);
- }
-
- if (empty($postgroups))
- return;
-
- $conditions = '';
- $lastMin = 0;
- foreach ($postgroups as $id => $min_posts)
- {
- $conditions .= '
- WHEN posts >= ' . $min_posts . (!empty($lastMin) ? ' AND posts <= ' . $lastMin : '') . ' THEN ' . $id;
- $lastMin = $min_posts;
- }
-
- $smcFunc['db_query']('', '
- UPDATE {db_prefix}members
- SET id_post_group = CASE ' . $conditions . '
- ELSE 0
- END' . ($parameter1 != null ? '
- WHERE ' . (is_array($parameter1) ? 'id_member IN ({array_int:members})' : 'id_member = {int:members}') : ''),
- array(
- 'members' => $parameter1,
- )
- );
- break;
- default:
- trigger_error('updateStats(): Invalid statistic type \'' . $type . '\'', E_USER_NOTICE);
- }
- }
- function updateMemberData($members, $data)
- {
- global $modSettings, $user_info, $smcFunc;
- $parameters = array();
- if (is_array($members))
- {
- $condition = 'id_member IN ({array_int:members})';
- $parameters['members'] = $members;
- }
- elseif ($members === null)
- $condition = '1=1';
- else
- {
- $condition = 'id_member = {int:member}';
- $parameters['member'] = $members;
- }
-
- $knownInts = array(
- 'date_registered', 'posts', 'id_group', 'last_login', 'instant_messages', 'unread_messages',
- 'new_pm', 'pm_prefs', 'gender', 'hide_email', 'show_online', 'pm_email_notify', 'pm_receive_from', 'karma_good', 'karma_bad',
- 'notify_announcements', 'notify_send_body', 'notify_regularity', 'notify_types',
- 'id_theme', 'is_activated', 'id_msg_last_visit', 'id_post_group', 'total_time_logged_in', 'warning',
- );
- $knownFloats = array(
- 'time_offset',
- );
- if (!empty($modSettings['integrate_change_member_data']))
- {
-
- $integration_vars = array(
- 'member_name',
- 'real_name',
- 'email_address',
- 'id_group',
- 'gender',
- 'birthdate',
- 'website_title',
- 'website_url',
- 'location',
- 'hide_email',
- 'time_format',
- 'time_offset',
- 'avatar',
- 'lngfile',
- );
- $vars_to_integrate = array_intersect($integration_vars, array_keys($data));
-
- if (count($vars_to_integrate) != 0)
- {
-
- if ((!is_array($members) && $members === $user_info['id']) || (is_array($members) && count($members) == 1 && in_array($user_info['id'], $members)))
- $member_names = array($user_info['username']);
- else
- {
- $member_names = array();
- $request = $smcFunc['db_query']('', '
- SELECT member_name
- FROM {db_prefix}members
- WHERE ' . $condition,
- $parameters
- );
- while ($row = $smcFunc['db_fetch_assoc']($request))
- $member_names[] = $row['member_name'];
- $smcFunc['db_free_result']($request);
- }
- if (!empty($member_names))
- foreach ($vars_to_integrate as $var)
- call_integration_hook('integrate_change_member_data', array($member_names, $var, $data[$var], $knownInts, $knownFloats));
- }
- }
- $setString = '';
- foreach ($data as $var => $val)
- {
- $type = 'string';
- if (in_array($var, $knownInts))
- $type = 'int';
- elseif (in_array($var, $knownFloats))
- $type = 'float';
- elseif ($var == 'birthdate')
- $type = 'date';
-
- if ($type == 'int' && ($val === '+' || $val === '-'))
- {
- $val = $var . ' ' . $val . ' 1';
- $type = 'raw';
- }
-
- if (in_array($var, array('posts', 'instant_messages', 'unread_messages')))
- {
- if (preg_match('~^' . $var . ' (\+ |- |\+ -)([\d]+)~', $val, $match))
- {
- if ($match[1] != '+ ')
- $val = 'CASE WHEN ' . $var . ' <= ' . abs($match[2]) . ' THEN 0 ELSE ' . $val . ' END';
- $type = 'raw';
- }
- }
- $setString .= ' ' . $var . ' = {' . $type . ':p_' . $var . '},';
- $parameters['p_' . $var] = $val;
- }
- $smcFunc['db_query']('', '
- UPDATE {db_prefix}members
- SET' . substr($setString, 0, -1) . '
- WHERE ' . $condition,
- $parameters
- );
- updateStats('postgroups', $members, array_keys($data));
-
- if (!empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 2 && !empty($members))
- {
- if (!is_array($members))
- $members = array($members);
- foreach ($members as $member)
- {
- if ($modSettings['cache_enable'] >= 3)
- {
- cache_put_data('member_data-profile-' . $member, null, 120);
- cache_put_data('member_data-normal-' . $member, null, 120);
- cache_put_data('member_data-minimal-' . $member, null, 120);
- }
- cache_put_data('user_settings-' . $member, null, 60);
- }
- }
- }
- function updateSettings($changeArray, $update = false, $debug = false)
- {
- global $modSettings, $smcFunc;
- if (empty($changeArray) || !is_array($changeArray))
- return;
-
- if ($update)
- {
- foreach ($changeArray as $variable => $value)
- {
- $smcFunc['db_query']('', '
- UPDATE {db_prefix}settings
- SET value = {' . ($value === false || $value === true ? 'raw' : 'string') . ':value}
- WHERE variable = {string:variable}',
- array(
- 'value' => $value === true ? 'value + 1' : ($value === false ? 'value - 1' : $value),
- 'variable' => $variable,
- )
- );
- $modSettings[$variable] = $value === true ? $modSettings[$variable] + 1 : ($value === false ? $modSettings[$variable] - 1 : $value);
- }
-
- cache_put_data('modSettings', null, 90);
- return;
- }
- $replaceArray = array();
- foreach ($changeArray as $variable => $value)
- {
-
- if (isset($modSettings[$variable]) && $modSettings[$variable] == $value)
- continue;
-
- elseif (!isset($modSettings[$variable]) && empty($value))
- continue;
- $replaceArray[] = array($variable, $value);
- $modSettings[$variable] = $value;
- }
- if (empty($replaceArray))
- return;
- $smcFunc['db_insert']('replace',
- '{db_prefix}settings',
- array('variable' => 'string-255', 'value' => 'string-65534'),
- $replaceArray,
- array('variable')
- );
-
- cache_put_data('modSettings', null, 90);
- }
- function constructPageIndex($base_url, &$start, $max_value, $num_per_page, $flexible_start = false, $show_prevnext = true)
- {
- global $modSettings, $context, $txt;
-
- $start = (int) $start;
- $start_invalid = $start < 0;
-
- if ($start_invalid)
- $start = 0;
-
- elseif ($start >= $max_value)
- $start = max(0, (int) $max_value - (((int) $max_value % (int) $num_per_page) == 0 ? $num_per_page : ((int) $max_value % (int) $num_per_page)));
-
- else
- $start = max(0, (int) $start - ((int) $start % (int) $num_per_page));
- $context['current_page'] = $start / $num_per_page;
-
- if (WIRELESS)
- $base_url .= ';' . WIRELESS_PROTOCOL;
- $base_link = '<a class="navPages" href="' . ($flexible_start ? $base_url : strtr($base_url, array('%' => '%%')) . ';start=%1$d') . '">%2$s</a> ';
-
- if (empty($modSettings['compactTopicPagesEnable']))
- {
-
- $pageindex = $start == 0 ? ' ' : sprintf($base_link, $start - $num_per_page, '<span class="previous_page">' . $txt['prev'] . '</span>');
-
- $display_page = 1;
- for ($counter = 0; $counter < $max_value; $counter += $num_per_page)
- $pageindex .= $start == $counter && !$start_invalid ? '<span class="current_page"><strong>' . $display_page++ . '</strong></span> ' : sprintf($base_link, $counter, $display_page++);
-
- $display_page = ($start + $num_per_page) > $max_value ? $max_value : ($start + $num_per_page);
- if ($start != $counter - $max_value && !$start_invalid)
- $pageindex .= $display_page > $counter - $num_per_page ? ' ' : sprintf($base_link, $display_page, '<span class="next_page">' . $txt['next'] . '</span>');
- }
- else
- {
-
- $PageContiguous = (int) ($modSettings['compactTopicPagesContiguous'] - ($modSettings['compactTopicPagesContiguous'] % 2)) / 2;
-
- if (!empty($start) && $show_prevnext)
- $pageindex = sprintf($base_link, $start - $num_per_page, '<span class="previous_page">' . $txt['prev'] . '</span>');
- else
- $pageindex = '';
-
- if ($start > $num_per_page * $PageContiguous)
- $pageindex .= sprintf($base_link, 0, '1');
-
- if ($start > $num_per_page * ($PageContiguous + 1))
- $pageindex .= '<span class="expand_pages" onclick="' . htmlspecialchars('expandPages(this, ' . JavaScriptEscape(($flexible_start ? $base_url : strtr($base_url, array('%' => '%%')) . ';start=%1$d')) . ', ' . $num_per_page . ', ' . ($start - $num_per_page * $PageContiguous) . ', ' . $num_per_page . ');') . '" onmouseover="this.style.cursor = \'pointer\';"><strong> ... </strong></span>';
-
- for ($nCont = $PageContiguous; $nCont >= 1; $nCont--)
- if ($start >= $num_per_page * $nCont)
- {
- $tmpStart = $start - $num_per_page * $nCont;
- $pageindex.= sprintf($base_link, $tmpStart, $tmpStart / $num_per_page + 1);
- }
-
- if (!$start_invalid)
- $pageindex .= '<span class="current_page"><strong>' . ($start / $num_per_page + 1) . '</strong></span>';
- else
- $pageindex .= sprintf($base_link, $start, $start / $num_per_page + 1);
-
- $tmpMaxPages = (int) (($max_value - 1) / $num_per_page) * $num_per_page;
- for ($nCont = 1; $nCont <= $PageContiguous; $nCont++)
- if ($start + $num_per_page * $nCont <= $tmpMaxPages)
- {
- $tmpStart = $start + $num_per_page * $nCont;
- $pageindex .= sprintf($base_link, $tmpStart, $tmpStart / $num_per_page + 1);
- }
-
- if ($start + $num_per_page * ($PageContiguous + 1) < $tmpMaxPages)
- $pageindex .= '<span class="expand_pages" onclick="' . htmlspecialchars('expandPages(this, ' . JavaScriptEscape(($flexible_start ? $base_url : strtr($base_url, array('%' => '%%')) . ';start=%1$d')) . ', ' . ($start + $num_per_page * ($PageContiguous + 1)) . ', ' . $tmpMaxPages . ', ' . $num_per_page . ');') . '" onmouseover="this.style.cursor=\'pointer\';"><strong> ... </strong></span>';
-
- if ($start + $num_per_page * $PageContiguous < $tmpMaxPages)
- $pageindex .= sprintf($base_link, $tmpMaxPages, $tmpMaxPages / $num_per_page + 1);
-
- if ($start != $tmpMaxPages && $show_prevnext)
- $pageindex .= sprintf($base_link, $start + $num_per_page, '<span class="next_page">' . $txt['next'] . '</span>');
- }
- return $pageindex;
- }
- function comma_format($number, $override_decimal_count = false)
- {
- global $txt;
- static $thousands_separator = null, $decimal_separator = null, $decimal_count = null;
-
- if ($decimal_separator === null)
- {
-
- if (empty($txt['number_format']) || preg_match('~^1([^\d]*)?234([^\d]*)(0*?)$~', $txt['number_format'], $matches) != 1)
- return $number;
-
- $thousands_separator = $matches[1];
- $decimal_separator = $matches[2];
- $decimal_count = strlen($matches[3]);
- }
-
- return number_format($number, (float) $number === $number ? ($override_decimal_count === false ? $decimal_count : $override_decimal_count) : 0, $decimal_separator, $thousands_separator);
- }
- function timeformat($log_time, $show_today = true, $offset_type = false)
- {
- global $context, $user_info, $txt, $modSettings, $smcFunc;
- static $non_twelve_hour;
-
- if (!$offset_type)
- $time = $log_time + ($user_info['time_offset'] + $modSettings['time_offset']) * 3600;
-
- elseif ($offset_type == 'forum')
- $time = $log_time + $modSettings['time_offset'] * 3600;
- else
- $time = $log_time;
-
- if ($log_time < 0)
- $log_time = 0;
-
- if ($modSettings['todayMod'] >= 1 && $show_today === true)
- {
-
- $nowtime = forum_time();
- $then = @getdate($time);
- $now = @getdate($nowtime);
-
- $s = strpos($user_info['time_format'], '%S') === false ? '' : ':%S';
- if (strpos($user_info['time_format'], '%H') === false && strpos($user_info['time_format'], '%T') === false)
- {
- $h = strpos($user_info['time_format'], '%l') === false ? '%I' : '%l';
- $today_fmt = $h . ':%M' . $s . ' %p';
- }
- else
- $today_fmt = '%H:%M' . $s;
-
- if ($then['yday'] == $now['yday'] && $then['year'] == $now['year'])
- return $txt['today'] . timeformat($log_time, $today_fmt, $offset_type);
-
- if ($modSettings['todayMod'] == '2' && (($then['yday'] == $now['yday'] - 1 && $then['year'] == $now['year']) || ($now['yday'] == 0 && $then['year'] == $now['year'] - 1) && $then['mon'] == 12 && $then['mday'] == 31))
- return $txt['yesterday'] . timeformat($log_time, $today_fmt, $offset_type);
- }
- $str = !is_bool($show_today) ? $show_today : $user_info['time_format'];
- if (setlocale(LC_TIME, $txt['lang_locale']))
- {
- if (!isset($non_twelve_hour))
- $non_twelve_hour = trim(strftime('%p')) === '';
- if ($non_twelve_hour && strpos($str, '%p') !== false)
- $str = str_replace('%p', (strftime('%H', $time) < 12 ? $txt['time_am'] : $txt['time_pm']), $str);
- foreach (array('%a', '%A', '%b', '%B') as $token)
- if (strpos($str, $token) !== false)
- $str = str_replace($token, !empty($txt['lang_capitalize_dates']) ? $smcFunc['ucwords'](strftime($token, $time)) : strftime($token, $time), $str);
- }
- else
- {
-
- foreach (array('%a' => 'days_short', '%A' => 'days', '%b' => 'months_short', '%B' => 'months') as $token => $text_label)
- if (strpos($str, $token) !== false)
- $str = str_replace($token, $txt[$text_label][(int) strftime($token === '%a' || $token === '%A' ? '%w' : '%m', $time)], $str);
- if (strpos($str, '%p') !== false)
- $str = str_replace('%p', (strftime('%H', $time) < 12 ? $txt['time_am'] : $txt['time_pm']), $str);
- }
-
- if ($context['server']['is_windows'] && strpos($str, '%e') !== false)
- $str = str_replace('%e', ltrim(strftime('%d', $time), '0'), $str);
-
- return strftime($str, $time);
- }
- function un_htmlspecialchars($string)
- {
- static $translation = array();
- if (empty($translation))
- $translation = array_flip(get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES)) + array(''' => '\'', ' ' => ' ');
- return strtr($string, $translation);
- }
- function shorten_subject($subject, $len)
- {
- global $smcFunc;
-
- if ($smcFunc['strlen']($subject) <= $len)
- return $subject;
-
- return $smcFunc['substr']($subject, 0, $len) . '...';
- }
- function forum_time($use_user_offset = true, $timestamp = null)
- {
- global $user_info, $modSettings;
- if ($timestamp === null)
- $timestamp = time();
- elseif ($timestamp == 0)
- return 0;
- return $timestamp + ($modSettings['time_offset'] + ($use_user_offset ? $user_info['time_offset'] : 0)) * 3600;
- }
- function permute($array)
- {
- $orders = array($array);
- $n = count($array);
- $p = range(0, $n);
- for ($i = 1; $i < $n; null)
- {
- $p[$i]--;
- $j = $i % 2 != 0 ? $p[$i] : 0;
- $temp = $array[$i];
- $array[$i] = $array[$j];
- $array[$j] = $temp;
- for ($i = 1; $p[$i] == 0; $i++)
- $p[$i] = 1;
- $orders[] = $array;
- }
- return $orders;
- }
- function parse_bbc($message, $smileys = true, $cache_id = '', $parse_tags = array())
- {
- global $txt, $scripturl, $context, $modSettings, $user_info, $smcFunc;
- static $bbc_codes = array(), $itemcodes = array(), $no_autolink_tags = array();
- static $disabled;
-
- if ($message === '')
- return '';
-
- if (!isset($context['utf8']))
- $context['utf8'] = (empty($modSettings['global_character_set']) ? $txt['lang_character_set'] : $modSettings['global_character_set']) === 'UTF-8';
-
- $message = sanitizeMSCutPaste($message);
-
- if (!empty($context['load_average']) && !empty($modSettings['bbc']) && $context['load_average'] >= $modSettings['bbc'])
- {
- $context['disabled_parse_bbc'] = true;
- return $message;
- }
-
- if (WIRELESS)
- $smileys = false;
- elseif ($smileys !== null && ($smileys == '1' || $smileys == '0'))
- $smileys = (bool) $smileys;
- if (empty($modSettings['enableBBC']) && $message !== false)
- {
- if ($smileys === true)
- parsesmileys($message);
- return $message;
- }
-
- if (!empty($parse_tags) && !empty($bbc_codes))
- {
- $temp_bbc = $bbc_codes;
- $bbc_codes = array();
- }
-
- call_integration_hook('integrate_pre_parsebbc', array(&$message, &$smileys, &$cache_id, &$parse_tags));
-
- if (empty($bbc_codes) || $message === false || !empty($parse_tags))
- {
- if (!empty($modSettings['disabledBBC']))
- {
- $temp = explode(',', strtolower($modSettings['disabledBBC']));
- foreach ($temp as $tag)
- $disabled[trim($tag)] = true;
- }
- if (empty($modSettings['enableEmbeddedFlash']))
- $disabled['flash'] = true;
-
- $codes = array(
- array(
- 'tag' => 'abbr',
- 'type' => 'unparsed_equals',
- 'before' => '<abbr title="$1">',
- 'after' => '</abbr>',
- 'quoted' => 'optional',
- 'disabled_after' => ' ($1)',
- ),
- array(
- 'tag' => 'acronym',
- 'type' => 'unparsed_equals',
- 'before' => '<acronym title="$1">',
- 'after' => '</acronym>',
- 'quoted' => 'optional',
- 'disabled_after' => ' ($1)',
- ),
- array(
- 'tag' => 'anchor',
- 'type' => 'unparsed_equals',
- 'test' => '[#]?([A-Za-z][A-Za-z0-9_\-]*)\]',
- 'before' => '<span id="post_$1">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'b',
- 'before' => '<strong>',
- 'after' => '</strong>',
- ),
- array(
- 'tag' => 'bdo',
- 'type' => 'unparsed_equals',
- 'before' => '<bdo dir="$1">',
- 'after' => '</bdo>',
- 'test' => '(rtl|ltr)\]',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'black',
- 'before' => '<span style="color: black;" class="bbc_color">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'blue',
- 'before' => '<span style="color: blue;" class="bbc_color">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'br',
- 'type' => 'closed',
- 'content' => '<br />',
- ),
- array(
- 'tag' => 'center',
- 'before' => '<div align="center">',
- 'after' => '</div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'code',
- 'type' => 'unparsed_content',
- 'content' => '<div class="codeheader">' . $txt['code'] . ': <a href="javascript:void(0);" onclick="return smfSelectText(this);" class="codeoperation">' . $txt['code_select'] . '</a></div>' . (isBrowser('gecko') || isBrowser('opera') ? '<pre style="margin: 0; padding: 0;">' : '') . '<code class="bbc_code">$1</code>' . (isBrowser('gecko') || isBrowser('opera') ? '</pre>' : ''),
-
- 'validate' => isset($disabled['code']) ? null : create_function('&$tag, &$data, $disabled', '
- global $context;
- if (!isset($disabled[\'code\']))
- {
- $php_parts = preg_split(\'~(<\?php|\?>)~\', $data, -1, PREG_SPLIT_DELIM_CAPTURE);
- for ($php_i = 0, $php_n = count($php_parts); $php_i < $php_n; $php_i++)
- {
- // Do PHP code coloring?
- if ($php_parts[$php_i] != \'<?php\')
- continue;
- $php_string = \'\';
- while ($php_i + 1 < count($php_parts) && $php_parts[$php_i] != \'?>\')
- {
- $php_string .= $php_parts[$php_i];
- $php_parts[$php_i++] = \'\';
- }
- $php_parts[$php_i] = highlight_php_code($php_string . $php_parts[$php_i]);
- }
- // Fix the PHP code stuff...
- $data = str_replace("<pre style=\"display: inline;\">\t</pre>", "\t", implode(\'\', $php_parts));
- $data = str_replace("\t", "<span style=\"white-space: pre;\">\t</span>", $data);
- // Recent Opera bug requiring temporary fix. &nsbp; is needed before </code> to avoid broken selection.
- if ($context[\'browser\'][\'is_opera\'])
- $data .= \' \';
- }'),
- 'block_level' => true,
- ),
- array(
- 'tag' => 'code',
- 'type' => 'unparsed_equals_content',
- 'content' => '<div class="codeheader">' . $txt['code'] . ': ($2) <a href="#" onclick="return smfSelectText(this);" class="codeoperation">' . $txt['code_select'] . '</a></div>' . (isBrowser('gecko') || isBrowser('opera') ? '<pre style="margin: 0; padding: 0;">' : '') . '<code class="bbc_code">$1</code>' . (isBrowser('gecko') || isBrowser('opera') ? '</pre>' : ''),
-
- 'validate' => isset($disabled['code']) ? null : create_function('&$tag, &$data, $disabled', '
- global $context;
- if (!isset($disabled[\'code\']))
- {
- $php_parts = preg_split(\'~(<\?php|\?>)~\', $data[0], -1, PREG_SPLIT_DELIM_CAPTURE);
- for ($php_i = 0, $php_n = count($php_parts); $php_i < $php_n; $php_i++)
- {
- // Do PHP code coloring?
- if ($php_parts[$php_i] != \'<?php\')
- continue;
- $php_string = \'\';
- while ($php_i + 1 < count($php_parts) && $php_parts[$php_i] != \'?>\')
- {
- $php_string .= $php_parts[$php_i];
- $php_parts[$php_i++] = \'\';
- }
- $php_parts[$php_i] = highlight_php_code($php_string . $php_parts[$php_i]);
- }
- // Fix the PHP code stuff...
- $data[0] = str_replace("<pre style=\"display: inline;\">\t</pre>", "\t", implode(\'\', $php_parts));
- $data[0] = str_replace("\t", "<span style=\"white-space: pre;\">\t</span>", $data[0]);
- // Recent Opera bug requiring temporary fix. &nsbp; is needed before </code> to avoid broken selection.
- if ($context[\'browser\'][\'is_opera\'])
- $data[0] .= \' \';
- }'),
- 'block_level' => true,
- ),
- array(
- 'tag' => 'color',
- 'type' => 'unparsed_equals',
- 'test' => '(#[\da-fA-F]{3}|#[\da-fA-F]{6}|[A-Za-z]{1,20}|rgb\(\d{1,3}, ?\d{1,3}, ?\d{1,3}\))\]',
- 'before' => '<span style="color: $1;" class="bbc_color">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'email',
- 'type' => 'unparsed_content',
- 'content' => '<a href="mailto:$1" class="bbc_email">$1</a>',
-
- 'validate' => create_function('&$tag, &$data, $disabled', '$data = strtr($data, array(\'<br />\' => \'\'));'),
- ),
- array(
- 'tag' => 'email',
- 'type' => 'unparsed_equals',
- 'before' => '<a href="mailto:$1" class="bbc_email">',
- 'after' => '</a>',
-
- 'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
- 'disabled_after' => ' ($1)',
- ),
- array(
- 'tag' => 'flash',
- 'type' => 'unparsed_commas_content',
- 'test' => '\d+,\d+\]',
- 'content' => (isBrowser('ie') ? '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="$2" height="$3"><param name="movie" value="$1" /><param name="play" value="true" /><param name="loop" value="true" /><param name="quality" value="high" /><param name="AllowScriptAccess" value="never" /><embed src="$1" width="$2" height="$3" play="true" loop="true" quality="high" AllowScriptAccess="never" /><noembed><a href="$1" target="_blank" class="new_win">$1</a></noembed></object>' : '<embed type="application/x-shockwave-flash" src="$1" width="$2" height="$3" play="true" loop="true" quality="high" AllowScriptAccess="never" /><noembed><a href="$1" target="_blank" class="new_win">$1</a></noembed>'),
- 'validate' => create_function('&$tag, &$data, $disabled', '
- if (isset($disabled[\'url\']))
- $tag[\'content\'] = \'$1\';
- elseif (strpos($data[0], \'http://\') !== 0 && strpos($data[0], \'https://\') !== 0)
- $data[0] = \'http://\' . $data[0];
- '),
- 'disabled_content' => '<a href="$1" target="_blank" class="new_win">$1</a>',
- ),
- array(
- 'tag' => 'font',
- 'type' => 'unparsed_equals',
- 'test' => '[A-Za-z0-9_,\-\s]+?\]',
- 'before' => '<span style="font-family: $1;" class="bbc_font">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'ftp',
- 'type' => 'unparsed_content',
- 'content' => '<a href="$1" class="bbc_ftp new_win" target="_blank">$1</a>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- $data = strtr($data, array(\'<br />\' => \'\'));
- if (strpos($data, \'ftp://\') !== 0 && strpos($data, \'ftps://\') !== 0)
- $data = \'ftp://\' . $data;
- '),
- ),
- array(
- 'tag' => 'ftp',
- 'type' => 'unparsed_equals',
- 'before' => '<a href="$1" class="bbc_ftp new_win" target="_blank">',
- 'after' => '</a>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- if (strpos($data, \'ftp://\') !== 0 && strpos($data, \'ftps://\') !== 0)
- $data = \'ftp://\' . $data;
- '),
- 'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
- 'disabled_after' => ' ($1)',
- ),
- array(
- 'tag' => 'glow',
- 'type' => 'unparsed_commas',
- 'test' => '[#0-9a-zA-Z\-]{3,12},([012]\d{1,2}|\d{1,2})(,[^]]+)?\]',
- 'before' => isBrowser('ie') ? '<table border="0" cellpadding="0" cellspacing="0" style="display: inline; vertical-align: middle; font: inherit;"><tr><td style="filter: Glow(color=$1, strength=$2); font: inherit;">' : '<span style="text-shadow: $1 1px 1px 1px">',
- 'after' => isBrowser('ie') ? '</td></tr></table> ' : '</span>',
- ),
- array(
- 'tag' => 'green',
- 'before' => '<span style="color: green;" class="bbc_color">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'html',
- 'type' => 'unparsed_content',
- 'content' => '$1',
- 'block_level' => true,
- 'disabled_content' => '$1',
- ),
- array(
- 'tag' => 'hr',
- 'type' => 'closed',
- 'content' => '<hr />',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'i',
- 'before' => '<em>',
- 'after' => '</em>',
- ),
- array(
- 'tag' => 'img',
- 'type' => 'unparsed_content',
- 'parameters' => array(
- 'alt' => array('optional' => true),
- 'width' => array('optional' => true, 'value' => ' width="$1"', 'match' => '(\d+)'),
- 'height' => array('optional' => true, 'value' => ' height="$1"', 'match' => '(\d+)'),
- ),
- 'content' => '<img src="$1" alt="{alt}"{width}{height} class="bbc_img resized" />',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- $data = strtr($data, array(\'<br />\' => \'\'));
- if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
- $data = \'http://\' . $data;
- '),
- 'disabled_content' => '($1)',
- ),
- array(
- 'tag' => 'img',
- 'type' => 'unparsed_content',
- 'content' => '<img src="$1" alt="" class="bbc_img" />',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- $data = strtr($data, array(\'<br />\' => \'\'));
- if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
- $data = \'http://\' . $data;
- '),
- 'disabled_content' => '($1)',
- ),
- array(
- 'tag' => 'iurl',
- 'type' => 'unparsed_content',
- 'content' => '<a href="$1" class="bbc_link">$1</a>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- $data = strtr($data, array(\'<br />\' => \'\'));
- if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
- $data = \'http://\' . $data;
- '),
- ),
- array(
- 'tag' => 'iurl',
- 'type' => 'unparsed_equals',
- 'before' => '<a href="$1" class="bbc_link">',
- 'after' => '</a>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- if (substr($data, 0, 1) == \'#\')
- $data = \'#post_\' . substr($data, 1);
- elseif (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
- $data = \'http://\' . $data;
- '),
- 'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
- 'disabled_after' => ' ($1)',
- ),
- array(
- 'tag' => 'left',
- 'before' => '<div style="text-align: left;">',
- 'after' => '</div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'li',
- 'before' => '<li>',
- 'after' => '</li>',
- 'trim' => 'outside',
- 'require_parents' => array('list'),
- 'block_level' => true,
- 'disabled_before' => '',
- 'disabled_after' => '<br />',
- ),
- array(
- 'tag' => 'list',
- 'before' => '<ul class="bbc_list">',
- 'after' => '</ul>',
- 'trim' => 'inside',
- 'require_children' => array('li', 'list'),
- 'block_level' => true,
- ),
- array(
- 'tag' => 'list',
- 'parameters' => array(
- 'type' => array('match' => '(none|disc|circle|square|decimal|decimal-leading-zero|lower-roman|upper-roman|lower-alpha|upper-alpha|lower-greek|lower-latin|upper-latin|hebrew|armenian|georgian|cjk-ideographic|hiragana|katakana|hiragana-iroha|katakana-iroha)'),
- ),
- 'before' => '<ul class="bbc_list" style="list-style-type: {type};">',
- 'after' => '</ul>',
- 'trim' => 'inside',
- 'require_children' => array('li'),
- 'block_level' => true,
- ),
- array(
- 'tag' => 'ltr',
- 'before' => '<div dir="ltr">',
- 'after' => '</div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'me',
- 'type' => 'unparsed_equals',
- 'before' => '<div class="meaction">* $1 ',
- 'after' => '</div>',
- 'quoted' => 'optional',
- 'block_level' => true,
- 'disabled_before' => '/me ',
- 'disabled_after' => '<br />',
- ),
- array(
- 'tag' => 'move',
- 'before' => '<marquee>',
- 'after' => '</marquee>',
- 'block_level' => true,
- 'disallow_children' => array('move'),
- ),
- array(
- 'tag' => 'nobbc',
- 'type' => 'unparsed_content',
- 'content' => '$1',
- ),
- array(
- 'tag' => 'php',
- 'type' => 'unparsed_content',
- 'content' => '<span class="phpcode">$1</span>',
- 'validate' => isset($disabled['php']) ? null : create_function('&$tag, &$data, $disabled', '
- if (!isset($disabled[\'php\']))
- {
- $add_begin = substr(trim($data), 0, 5) != \'<?\';
- $data = highlight_php_code($add_begin ? \'<?php \' . $data . \'?>\' : $data);
- if ($add_begin)
- $data = preg_replace(array(\'~^(.+?)<\?.{0,40}?php(?: |\s)~\', \'~\?>((?:</(font|span)>)*)$~\'), \'$1\', $data, 2);
- }'),
- 'block_level' => false,
- 'disabled_content' => '$1',
- ),
- array(
- 'tag' => 'pre',
- 'before' => '<pre>',
- 'after' => '</pre>',
- ),
- array(
- 'tag' => 'quote',
- 'before' => '<div class="quoteheader"><div class="topslice_quote">' . $txt['quote'] . '</div></div><blockquote>',
- 'after' => '</blockquote><div class="quotefooter"><div class="botslice_quote"></div></div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'quote',
- 'parameters' => array(
- 'author' => array('match' => '(.{1,192}?)', 'quoted' => true),
- ),
- 'before' => '<div class="quoteheader"><div class="topslice_quote">' . $txt['quote_from'] . ': {author}</div></div><blockquote>',
- 'after' => '</blockquote><div class="quotefooter"><div class="botslice_quote"></div></div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'quote',
- 'type' => 'parsed_equals',
- 'before' => '<div class="quoteheader"><div class="topslice_quote">' . $txt['quote_from'] . ': $1</div></div><blockquote>',
- 'after' => '</blockquote><div class="quotefooter"><div class="botslice_quote"></div></div>',
- 'quoted' => 'optional',
-
- 'parsed_tags_allowed' => array('url', 'iurl', 'ftp'),
- 'block_level' => true,
- ),
- array(
- 'tag' => 'quote',
- 'parameters' => array(
- 'author' => array('match' => '([^<>]{1,192}?)'),
- 'link' => array('match' => '(?:board=\d+;)?((?:topic|threadid)=[\dmsg#\./]{1,40}(?:;start=[\dmsg#\./]{1,40})?|action=profile;u=\d+)'),
- 'date' => array('match' => '(\d+)', 'validate' => 'timeformat'),
- ),
- 'before' => '<div class="quoteheader"><div class="topslice_quote"><a href="' . $scripturl . '?{link}">' . $txt['quote_from'] . ': {author} ' . $txt['search_on'] . ' {date}</a></div></div><blockquote>',
- 'after' => '</blockquote><div class="quotefooter"><div class="botslice_quote"></div></div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'quote',
- 'parameters' => array(
- 'author' => array('match' => '(.{1,192}?)'),
- ),
- 'before' => '<div class="quoteheader"><div class="topslice_quote">' . $txt['quote_from'] . ': {author}</div></div><blockquote>',
- 'after' => '</blockquote><div class="quotefooter"><div class="botslice_quote"></div></div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'red',
- 'before' => '<span style="color: red;" class="bbc_color">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'right',
- 'before' => '<div style="text-align: right;">',
- 'after' => '</div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 'rtl',
- 'before' => '<div dir="rtl">',
- 'after' => '</div>',
- 'block_level' => true,
- ),
- array(
- 'tag' => 's',
- 'before' => '<del>',
- 'after' => '</del>',
- ),
- array(
- 'tag' => 'shadow',
- 'type' => 'unparsed_commas',
- 'test' => '[#0-9a-zA-Z\-]{3,12},(left|right|top|bottom|[0123]\d{0,2})\]',
- 'before' => isBrowser('ie') ? '<span style="display: inline-block; filter: Shadow(color=$1, direction=$2); height: 1.2em;">' : '<span style="text-shadow: $1 $2">',
- 'after' => '</span>',
- 'validate' => isBrowser('ie') ? create_function('&$tag, &$data, $disabled', '
- if ($data[1] == \'left\')
- $data[1] = 270;
- elseif ($data[1] == \'right\')
- $data[1] = 90;
- elseif ($data[1] == \'top\')
- $data[1] = 0;
- elseif ($data[1] == \'bottom\')
- $data[1] = 180;
- else
- $data[1] = (int) $data[1];') : create_function('&$tag, &$data, $disabled', '
- if ($data[1] == \'top\' || (is_numeric($data[1]) && $data[1] < 50))
- $data[1] = \'0 -2px 1px\';
- elseif ($data[1] == \'right\' || (is_numeric($data[1]) && $data[1] < 100))
- $data[1] = \'2px 0 1px\';
- elseif ($data[1] == \'bottom\' || (is_numeric($data[1]) && $data[1] < 190))
- $data[1] = \'0 2px 1px\';
- elseif ($data[1] == \'left\' || (is_numeric($data[1]) && $data[1] < 280))
- $data[1] = \'-2px 0 1px\';
- else
- $data[1] = \'1px 1px 1px\';'),
- ),
- array(
- 'tag' => 'size',
- 'type' => 'unparsed_equals',
- 'test' => '([1-9][\d]?p[xt]|small(?:er)?|large[r]?|x[x]?-(?:small|large)|medium|(0\.[1-9]|[1-9](\.[\d][\d]?)?)?em)\]',
- 'before' => '<span style="font-size: $1;" class="bbc_size">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'size',
- 'type' => 'unparsed_equals',
- 'test' => '[1-7]\]',
- 'before' => '<span style="font-size: $1;" class="bbc_size">',
- 'after' => '</span>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- $sizes = array(1 => 0.7, 2 => 1.0, 3 => 1.35, 4 => 1.45, 5 => 2.0, 6 => 2.65, 7 => 3.95);
- $data = $sizes[$data] . \'em\';'
- ),
- ),
- array(
- 'tag' => 'sub',
- 'before' => '<sub>',
- 'after' => '</sub>',
- ),
- array(
- 'tag' => 'sup',
- 'before' => '<sup>',
- 'after' => '</sup>',
- ),
- array(
- 'tag' => 'table',
- 'before' => '<table class="bbc_table">',
- 'after' => '</table>',
- 'trim' => 'inside',
- 'require_children' => array('tr'),
- 'block_level' => true,
- ),
- array(
- 'tag' => 'td',
- 'before' => '<td>',
- 'after' => '</td>',
- 'require_parents' => array('tr'),
- 'trim' => 'outside',
- 'block_level' => true,
- 'disabled_before' => '',
- 'disabled_after' => '',
- ),
- array(
- 'tag' => 'time',
- 'type' => 'unparsed_content',
- 'content' => '$1',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- if (is_numeric($data))
- $data = timeformat($data);
- else
- $tag[\'content\'] = \'[time]$1[/time]\';'),
- ),
- array(
- 'tag' => 'tr',
- 'before' => '<tr>',
- 'after' => '</tr>',
- 'require_parents' => array('table'),
- 'require_children' => array('td'),
- 'trim' => 'both',
- 'block_level' => true,
- 'disabled_before' => '',
- 'disabled_after' => '',
- ),
- array(
- 'tag' => 'tt',
- 'before' => '<tt class="bbc_tt">',
- 'after' => '</tt>',
- ),
- array(
- 'tag' => 'u',
- 'before' => '<span class="bbc_u">',
- 'after' => '</span>',
- ),
- array(
- 'tag' => 'url',
- 'type' => 'unparsed_content',
- 'content' => '<a href="$1" class="bbc_link" target="_blank">$1</a>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- $data = strtr($data, array(\'<br />\' => \'\'));
- if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
- $data = \'http://\' . $data;
- '),
- ),
- array(
- 'tag' => 'url',
- 'type' => 'unparsed_equals',
- 'before' => '<a href="$1" class="bbc_link" target="_blank">',
- 'after' => '</a>',
- 'validate' => create_function('&$tag, &$data, $disabled', '
- if (strpos($data, \'http://\') !== 0 && strpos($data, \'https://\') !== 0)
- $data = \'http://\' . $data;
- '),
- 'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
- 'disabled_after' => ' ($1)',
- ),
- array(
- 'tag' => 'white',
- 'before' => '<span style="color: white;" class="bbc_color">',
- 'after' => '</span>',
- ),
- );
-
- call_integration_hook('integrate_bbc_codes', array(&$codes));
-
- if ($message === false)
- {
- if (isset($temp_bbc))
- $bbc_codes = $temp_bbc;
- return $codes;
- }
-
- $itemcodes = array(
- '*' => 'disc',
- '@' => 'disc',
- '+' => 'square',
- 'x' => 'square',
- '#' => 'square',
- 'o' => 'circle',
- 'O' => 'circle',
- '0' => 'circle',
- );
- if (!isset($disabled['li']) && !isset($disabled['list']))
- {
- foreach ($itemcodes as $c => $dummy)
- $bbc_codes[$c] = array();
- }
-
- $no_autolink_tags = array(
- 'url',
- 'iurl',
- 'ftp',
- 'email',
- );
-
- if (!isset($disabled['color']))
- {
- $codes[] = array(
- 'tag' => 'chrissy',
- 'before' => '<span style="color: #cc0099;">',
- 'after' => ' :-*</span>',
- );
- $codes[] = array(
- 'tag' => 'kissy',
- 'before' => '<span style="color: #cc0099;">',
- 'after' => ' :-*</span>',
- );
- }
- foreach ($codes as $code)
- {
-
- if (empty($parse_tags) || in_array($code['tag'], $parse_tags))
- $bbc_codes[substr($code['tag'], 0, 1)][] = $code;
- }
- $codes = null;
- }
-
- if ($cache_id != '' && !empty($modSettings['cache_enable']) && (($modSettings['cache_enable'] >= 2 && strlen($message) > 1000) || strlen($message) > 2400) && empty($parse_tags))
- {
-
- $cache_key = 'parse:' . $cache_id . '-' . md5(md5($message) . '-' . $smileys . (empty($disabled) ? '' : implode(',', array_keys($disabled))) . serialize($context['browser']) . $txt['lang_locale'] . $user_info['time_offset'] . $user_info['time_format']);
- if (($temp = cache_get_data($cache_key, 240)) != null)
- return $temp;
- $cache_t = microtime();
- }
- if ($smileys === 'print')
- {
-
- $disabled['glow'] = true;
- $disabled['shadow'] = true;
- $disabled['move'] = true;
-
- $disabled['color'] = true;
- $disabled['black'] = true;
- $disabled['blue'] = true;
- $disabled['white'] = true;
- $disabled['red'] = true;
- $disabled['green'] = true;
- $disabled['me'] = true;
-
- $disabled['php'] = true;
-
- $disabled['ftp'] = true;
- $disabled['url'] = true;
- $disabled['iurl'] = true;
- $disabled['email'] = true;
- $disabled['flash'] = true;
-
- if (!isset($_GET['images']))
- $disabled['img'] = true;
-
- }
- $open_tags = array();
- $message = strtr($message, array("\n" => '<br />'));
-
- $non_breaking_space = $context['utf8'] ? '\x{A0}' : '\xA0';
-
- if (!empty($modSettings['fixLongWords']) && $modSettings['fixLongWords'] > 5)
- {
- if (isBrowser('gecko') || isBrowser('konqueror'))
- $breaker = '<span style="margin: 0 -0.5ex 0 0;"> </span>';
-
- elseif (isBrowser('opera'))
- $breaker = '<span style="margin: 0 -0.65ex 0 -1px;"> </span>';
-
- else
- $breaker = '<span style="width: 0; margin: 0 -0.6ex 0 -1px;"> </span>';
-
- $modSettings['fixLongWords'] = (int) min(65535, $modSettings['fixLongWords']);
- }
- $pos = -1;
- while ($pos !== false)
- {
- $last_pos = isset($last_pos) ? max($pos, $last_pos) : $pos;
- $pos = strpos($message, '[', $pos + 1);
-
- if ($pos === false || $last_pos > $pos)
- $pos = strlen($message) + 1;
-
- if ($last_pos < $pos - 1)
- {
-
- $last_pos = max($last_pos, 0);
-
- $data = substr($message, $last_pos, $pos - $last_pos);
-
- if (!empty($modSettings['enablePostHTML']) && strpos($data, '<') !== false)
- {
- $data = preg_replace('~<a\s+href=((?:")?)((?:https?://|ftps?://|mailto:)\S+?)\\1>~i', '[url=$2]', $data);
- $data = preg_replace('~</a>~i', '[/url]', $data);
-
- $empty_tags = array('br', 'hr');
- foreach ($empty_tags as $tag)
- $data = str_replace(array('<' . $tag . '>', '<' . $tag . '/>', '<' . $tag . ' />'), '[' . $tag . ' /]', $data);
-
- $closable_tags = array('b', 'u', 'i', 's', 'em', 'ins', 'del', 'pre', 'blockquote');
- foreach ($closable_tags as $tag)
- {
- $diff = substr_count($data, '<' . $tag . '>') - substr_count($data, '</' . $tag . '>');
- $data = strtr($data, array('<' . $tag . '>' => '<' . $tag . '>', '</' . $tag . '>' => '</' . $tag . '>'));
- if ($diff > 0)
- $data = substr($data, 0, -1) . str_repeat('</' . $tag . '>', $diff) . substr($data, -1);
- }
-
- preg_match_all('~<img\s+src=((?:")?)((?:https?://|ftps?://)\S+?)\\1(?:\s+alt=(".*?"|\S*?))?(?:\s?/)?>~i', $data, $matches, PREG_PATTERN_ORDER);
- if (!empty($matches[0]))
- {
- $replaces = array();
- foreach ($matches[2] as $match => $imgtag)
- {
- $alt = empty($matches[3][$match]) ? '' : ' alt=' . preg_replace('~^"|"$~', '', $matches[3][$match]);
-
- if (preg_match('~action(=|%3d)(?!dlattach)~i', $imgtag) != 0)
- $imgtag = preg_replace('~action(?:=|%3d)(?!dlattach)~i', 'action-', $imgtag);
-
- if (!empty($modSettings['max_image_width']) && !empty($modSettings['max_image_height']))
- {
- list ($width, $height) = url_image_size($imgtag);
- if (!empty($modSettings['max_image_width']) && $width > $modSettings['max_image_width'])
- {
- $height = (int) (($modSettings['max_image_width'] * $height) / $width);
- $width = $modSettings['max_image_width'];
- }
- if (!empty($modSettings['max_image_height']) && $height > $modSettings['max_image_height'])
- {
- $width = (int) (($modSettings['max_image_height'] * $width) / $height);
- $height = $modSettings['max_image_height'];
- }
-
- $replaces[$matches[0][$match]] = '[img width=' . $width . ' height=' . $height . $alt . ']' . $imgtag . '[/img]';
- }
- else
- $replaces[$matches[0][$match]] = '[img' . $alt . ']' . $imgtag . '[/img]';
- }
- $data = strtr($data, $replaces);
- }
- }
- if (!empty($modSettings['autoLinkUrls']))
- {
-
- $no_autolink_area = false;
- if (!empty($open_tags))
- {
- foreach ($open_tags as $open_tag)
- if (in_array($open_tag['tag'], $no_autolink_tags))
- $no_autolink_area = true;
- }
-
-
- $lastAutoPos = isset($lastAutoPos) ? $lastAutoPos : 0;
- if ($pos < $lastAutoPos)
- $no_autolink_area = true;
- $lastAutoPos = $pos;
- if (!$no_autolink_area)
- {
-
- if (!isset($disabled['url']) && (strpos($data, '://') !== false || strpos($data, 'www.') !== false) && strpos($data, '[url') === false)
- {
-
- $data = strtr($data, array(''' => '\'', ' ' => $context['utf8'] ? "\xC2\xA0" : "\xA0", '"' => '>">', '"' => '<"<', '<' => '<lt<'));
-
- if (is_string($result = preg_replace(array(
- '~(?<=[\s>\.(;\'"]|^)((?:http|https)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+)?(?:/[\w\-_\~%\.@!,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\]?)~i',
- '~(?<=[\s>\.(;\'"]|^)((?:ftp|ftps)://[\w\-_%@:|]+(?:\.[\w\-_%]+)*(?::\d+)?(?:/[\w\-_\~%\.@,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\]?)~i',
- '~(?<=[\s>(\'<]|^)(www(?:\.[\w\-_]+)+(?::\d+)?(?:/[\w\-_\~%\.@!,\?&;=#(){}+:\'\\\\]*)*[/\w\-_\~%@\?;=#}\\\\])~i'
- ), array(
- '[url]$1[/url]',
- '[ftp]$1[/ftp]',
- '[url=http://$1]$1[/url]'
- ), $data)))
- $data = $result;
- $data = strtr($data, array('\'' => ''', $context['utf8'] ? "\xC2\xA0" : "\xA0" => ' ', '>">' => '"', '<"<' => '"', '<lt<' => '<'));
- }
-
- if (!isset($disabled['email']) && strpos($data, '@') !== false && strpos($data, '[email') === false)
- {
- $data = preg_replace('~(?<=[\?\s' . $non_breaking_space . '\[\]()*\\\;>]|^)([\w\-\.]{1,80}@[\w\-]+\.[\w\-\.]+[\w\-])(?=[?,\s' . $non_breaking_space . '\[\]()*\\\]|$|<br />| |>|<|"|'|\.(?:\.|;| |\s|$|<br />))~' . ($context['utf8'] ? 'u' : ''), '[email]$1[/email]', $data);
- $data = preg_replace('~(?<=<br />)([\w\-\.]{1,80}@[\w\-]+\.[\w\-\.]+[\w\-])(?=[?\.,;\s' . $non_breaking_space . '\[\]()*\\\]|$|<br />| |>|<|"|')~' . ($context['utf8'] ? 'u' : ''), '[email]$1[/email]', $data);
- }
- }
- }
- $data = strtr($data, array("\t" => ' '));
- if (!empty($modSettings['fixLongWords']) && $modSettings['fixLongWords'] > 5)
- {
-
- if ($smcFunc['strlen']($data) > $modSettings['fixLongWords'])
- {
-
- $data = strtr($data, array($breaker => '< >', ' ' => $context['utf8'] ? "\xC2\xA0" : "\xA0"));
- $data = preg_replace(
- '~(?<=[>;:!? ' . $non_breaking_space . '\]()\n]|^)([\w' . ($context['utf8'] ? '\pL' : '') . '\.]{' . $modSettings['fixLongWords'] . ',})~e' . ($context['utf8'] ? 'u' : ''),
- 'preg_replace(\'/(.{' . ($modSettings['fixLongWords'] - 1) . '})/' . ($context['utf8'] ? 'u' : '') . '\', \'\\$1< >\', \'$1\')',
- $data);
- $data = strtr($data, array('< >' => $breaker, $context['utf8'] ? "\xC2\xA0" : "\xA0" => ' '));
- }
- }
-
- if ($data != substr($message, $last_pos, $pos - $last_pos))
- {
- $message = substr($message, 0, $last_pos) . $data . substr($message, $pos);
-
- $old_pos = strlen($data) + $last_pos;
- $pos = strpos($message, '[', $last_pos);
- $pos = $pos === false ? $old_pos : min($pos, $old_pos);
- }
- }
-
- if ($pos >= strlen($message) - 1)
- break;
- $tags = strtolower($message[$pos + 1]);
- if ($tags == '/' && !empty($open_tags))
- {
- $pos2 = strpos($message, ']', $pos + 1);
- if ($pos2 == $pos + 2)
- continue;
- $look_for = strtolower(substr($message, $pos + 2, $pos2 - $pos - 2));
- $to_close = array();
- $block_level = null;
- do
- {
- $tag = array_pop($open_tags);
- if (!$tag)
- break;
- if (!empty($tag['block_level']))
- {
-
- if ($block_level === false)
- {
- array_push($open_tags, $tag);
- break;
- }
-
- if (strlen($look_for) > 0 && isset($bbc_codes[$look_for[0]]))
- {
- foreach ($bbc_codes[$look_for[0]] as $temp)
- if ($temp['tag'] == $look_for)
- {
- $block_level = !empty($temp['block_level']);
- break;
- }
- }
- if ($block_level !== true)
- {
- $block_level = false;
- array_push($open_tags, $tag);
- break;
- }
- }
- $to_close[] = $tag;
- }
- while ($tag['tag'] != $look_for);
-
- if ((empty($open_tags) && (empty($tag) || $tag['tag'] != $look_for)))
- {
- $open_tags = $to_close;
- continue;
- }
- elseif (!empty($to_close) && $tag['tag'] != $look_for)
- {
- if ($block_level === null && isset($look_for[0], $bbc_codes[$look_for[0]]))
- {
- foreach ($bbc_codes[$look_for[0]] as $temp)
- if ($temp['tag'] == $look_for)
- {
- $block_level = !empty($temp['block_level']);
- break;
- }
- }
-
- if (!$block_level)
- {
- foreach ($to_close as $tag)
- array_push($open_tags, $tag);
- continue;
- }
- }
- foreach ($to_close as $tag)
- {
- $message = substr($message, 0, $pos) . "\n" . $tag['after'] . "\n" . substr($message, $pos2 + 1);
- $pos += strlen($tag['after']) + 2;
- $pos2 = $pos - 1;
-
- if (!empty($tag['block_level']) && substr($message, $pos, 6) == '<br />')
- $message = substr($message, 0, $pos) . substr($message, $pos + 6);
- if (!empty($tag['trim']) && $tag['trim'] != 'inside' && preg_match('~(<br />| |\s)*~', substr($message, $pos), $matches) != 0)
- $message = substr($message, 0, $pos) . substr($message, $pos + strlen($matches[0]));
- }
- if (!empty($to_close))
- {
- $to_close = array();
- $pos--;
- }
- continue;
- }
-
- if (!isset($bbc_codes[$tags]))
- continue;
- $inside = empty($open_tags) ? null : $open_tags[count($open_tags) - 1];
- $tag = null;
- foreach ($bbc_codes[$tags] as $possible)
- {
-
- if (stripos($message, $possible['tag'], $pos + 1) !== $pos + 1)
- continue;
- $next_c = substr($message, $pos + 1 + strlen($possible['tag']), 1);
-
- if (isset($possible['test']) && preg_match('~^' . $possible['test'] . '~', substr($message, $pos + 1 + strlen($possible['tag']) + 1)) == 0)
- continue;
-
- elseif (!empty($possible['parameters']))
- {
- if ($next_c != ' ')
- continue;
- }
- elseif (isset($possible['type']))
- {
-
- if (in_array($possible['type'], array('unparsed_equals', 'unparsed_commas', 'unparsed_commas_content', 'unparsed_equals_content', 'parsed_equals')) && $next_c != '=')
- continue;
-
- if ($possible['type'] == 'closed' && $next_c != ']' && substr($message, $pos + 1 + strlen($possible['tag']), 2) != '/]' && substr($message, $pos + 1 + strlen($possible['tag']), 3) != ' /]')
- continue;
-
- if ($possible['type'] == 'unparsed_content' && $next_c != ']')
- continue;
- }
-
- elseif ($next_c != ']')
- continue;
-
- if (isset($possible['require_parents']) && ($inside === null || !in_array($inside['tag'], $possible['require_parents'])))
- continue;
- elseif (isset($inside['require_children']) && !in_array($possible['tag'], $inside['require_children']))
- continue;
-
- elseif (isset($inside['disallow_children']) && in_array($possible['tag'], $inside['disallow_children']))
- continue;
- $pos1 = $pos + 1 + strlen($possible['tag']) + 1;
-
- if ($possible['tag'] == 'quote')
- {
-
- $quote_alt = false;
- foreach ($open_tags as $open_quote)
- {
-
- if ($open_quote['tag'] == 'quote')
- $quote_alt = !$quote_alt;
- }
-
- $possible['before'] = strtr($possible['before'], array('<blockquote>' => '<blockquote class="bbc_' . ($quote_alt ? 'alternate' : 'standard') . '_quote">'));
- }
-
- if (!empty($possible['parameters']))
- {
- $preg = array();
- foreach ($possible['parameters'] as $p => $info)
- $preg[] = '(\s+' . $p . '=' . (empty($info['quoted']) ? '' : '"') . (isset($info['match']) ? $info['match'] : '(.+?)') . (empty($info['quoted']) ? '' : '"') . ')' . (empty($info['optional']) ? '' : '?');
-
- $match = false;
- $orders = permute($preg);
- foreach ($orders as $p)
- if (preg_match('~^' . implode('', $p) . '\]~i', substr($message, $pos1 - 1), $matches) != 0)
- {
- $match = true;
- break;
- }
-
- if (!$match)
- continue;
- $params = array();
- for ($i = 1, $n = count($matches); $i < $n; $i += 2)
- {
- $key = strtok(ltrim($matches[$i]), '=');
- if (isset($possible['parameters'][$key]['value']))
- $params['{' . $key . '}'] = strtr($possible['parameters'][$key]['value'], array('$1' => $matches[$i + 1]));
- elseif (isset($possible['parameters'][$key]['validate']))
- $params['{' . $key . '}'] = $possible['parameters'][$key]['validate']($matches[$i + 1]);
- else
- $params['{' . $key . '}'] = $matches[$i + 1];
-
- $params['{' . $key . '}'] = strtr($params['{' . $key . '}'], array('$' => '$', '{' => '{'));
- }
- foreach ($possible['parameters'] as $p => $info)
- {
- if (!isset($params['{' . $p . '}']))
- $params['{' . $p . '}'] = '';
- }
- $tag = $possible;
-
- if (isset($tag['before']))
- $tag['before'] = strtr($tag['before'], $params);
- if (isset($tag['after']))
- $tag['after'] = strtr($tag['after'], $params);
- if (isset($tag['content']))
- $tag['content'] = strtr($tag['content'], $params);
- $pos1 += strlen($matches[0]) - 1;
- }
- else
- $tag = $possible;
- break;
- }
-
- if ($smileys !== false && $tag === null && isset($itemcodes[$message[$pos + 1]]) && $message[$pos + 2] == ']' && !isset($disabled['list']) && !isset($disabled['li']))
- {
- if ($message[$pos + 1] == '0' && !in_array($message[$pos - 1], array(';', ' ', "\t", '>')))
- continue;
- $tag = $itemcodes[$message[$pos + 1]];
-
- if ($inside === null || ($inside['tag'] != 'list' && $inside['tag'] != 'li'))
- {
- $open_tags[] = array(
- 'tag' => 'list',
- 'after' => '</ul>',
- 'block_level' => true,
- 'require_children' => array('li'),
- 'disallow_children' => isset($inside['disallow_children']) ? $inside['disallow_children'] : null,
- );
- $code = '<ul class="bbc_list">';
- }
-
- elseif ($inside['tag'] == 'li')
- {
- array_pop($open_tags);
- $code = '</li>';
- }
- else
- $code = '';
-
- $open_tags[] = array(
- 'tag' => 'li',
- 'after' => '</li>',
- 'trim' => 'outside',
- 'block_level' => true,
- 'disallow_children' => isset($inside['disallow_children']) ? $inside['disallow_children'] : null,
- );
-
- $code .= '<li' . ($tag == '' ? '' : ' type="' . $tag . '"') . '>';
- $message = substr($message, 0, $pos) . "\n" . $code . "\n" . substr($message, $pos + 3);
- $pos += strlen($code) - 1 + 2;
-
- $pos2 = strpos($message, '<br />', $pos);
- $pos3 = strpos($message, '[/', $pos);
- if ($pos2 !== false && ($pos2 <= $pos3 || $pos3 === false))
- {
- preg_match('~^(<br />| |\s|\[)+~', substr($message, $pos2 + 6), $matches);
- $message = substr($message, 0, $pos2) . "\n" . (!empty($matches[0]) && substr($matches[0], -1) == '[' ? '[/li]' : '[/li][/list]') . "\n" . substr($message, $pos2);
- $open_tags[count($open_tags) - 2]['after'] = '</ul>';
- }
-
- else
- {
-
- $open_tags[count($open_tags) - 1]['after'] = '';
- $open_tags[count($open_tags) - 2]['after'] = '</li></ul>';
- }
- continue;
- }
-
- if ($tag === null && $inside !== null && !empty($inside['require_children']))
- {
- array_pop($open_tags);
- $message = substr($message, 0, $pos) . "\n" . $inside['after'] . "\n" . substr($message, $pos);
- $pos += strlen($inside['after']) - 1 + 2;
- }
-
- if ($tag === null)
- continue;
-
- if (isset($inside['disallow_children']))
- $tag['disallow_children'] = isset($tag['disallow_children']) ? array_unique(array_merge($tag['disallow_children'], $inside['disallow_children'])) : $inside['disallow_children'];
-
- if (isset($disabled[$tag['tag']]))
- {
- if (!isset($tag['disabled_before']) && !isset($tag['disabled_after']) && !isset($tag['disabled_content']))
- {
- $tag['before'] = !empty($tag['block_level']) ? '<div>' : '';
- $tag['after'] = !empty($tag['block_level']) ? '</div>' : '';
- $tag['content'] = isset($tag['type']) && $tag['type'] == 'closed' ? '' : (!empty($tag['block_level']) ? '<div>$1</div>' : '$1');
- }
- elseif (isset($tag['disabled_before']) || isset($tag['disabled_after']))
- {
- $tag['before'] = isset($tag['disabled_before']) ? $tag['disabled_before'] : (!empty($tag['block_level']) ? '<div>' : '');
- $tag['after'] = isset($tag['disabled_after']) ? $tag['disabled_after'] : (!empty($tag['block_level']) ? '</div>' : '');
- }
- else
- $tag['content'] = $tag['disabled_content'];
- }
-
- if (!empty($tag['block_level']) && $tag['tag'] != 'html' && empty($inside['block_level']))
- {
- $n = count($open_tags) - 1;
- while (empty($open_tags[$n]['block_level']) && $n >= 0)
- $n--;
-
- for ($i = count($open_tags) - 1; $i > $n; $i--)
- {
- $message = substr($message, 0, $pos) . "\n" . $open_tags[$i]['after'] . "\n" . substr($message, $pos);
- $pos += strlen($open_tags[$i]['after']) + 2;
- $pos1 += strlen($open_tags[$i]['after']) + 2;
-
- if (!empty($open_tags[$i]['block_level']) && substr($message, $pos, 6) == '<br />')
- $message = substr($message, 0, $pos) . substr($message, $pos + 6);
- if (!empty($open_tags[$i]['trim']) && $tag['trim'] != 'inside' && preg_match('~(<br />| |\s)*~', substr($message, $pos), $matches) != 0)
- $message = substr($message, 0, $pos) . substr($message, $pos + strlen($matches[0]));
- array_pop($open_tags);
- }
- }
-
- if (!isset($tag['type']))
- {
-
- $open_tags[] = $tag;
- $message = substr($message, 0, $pos) . "\n" . $tag['before'] . "\n" . substr($message, $pos1);
- $pos += strlen($tag['before']) - 1 + 2;
- }
-
- elseif ($tag['type'] == 'unparsed_content')
- {
- $pos2 = stripos($message, '[/' . substr($message, $pos + 1, strlen($tag['tag'])) . ']', $pos1);
- if ($pos2 === false)
- continue;
- $data = substr($message, $pos1, $pos2 - $pos1);
- if (!empty($tag['block_level']) && substr($data, 0, 6) == '<br />')
- $data = substr($data, 6);
- if (isset($tag['validate']))
- $tag['validate']($tag, $data, $disabled);
- $code = strtr($tag['content'], array('$1' => $data));
- $message = substr($message, 0, $pos) . "\n" . $code . "\n" . substr($message, $pos2 + 3 + strlen($tag['tag']));
- $pos += strlen($code) - 1 + 2;
- $last_pos = $pos + 1;
- }
-
- elseif ($tag['type'] == 'unparsed_equals_content')
- {
-
- if (isset($tag['quoted']))
- {
- $quoted = substr($message, $pos1, 6) == '"';
- if ($tag['quoted'] != 'optional' && !$quoted)
- continue;
- if ($quoted)
- $pos1 += 6;
- }
- else
- $quoted = false;
- $pos2 = strpos($message, $quoted == false ? ']' : '"]', $pos1);
- if ($pos2 === false)
- continue;
- $pos3 = stripos($message, '[/' . substr($message, $pos + 1, strlen($tag['tag'])) . ']', $pos2);
- if ($pos3 === false)
- continue;
- $data = array(
- substr($message, $pos2 + ($quoted == false ? 1 : 7), $pos3 - ($pos2 + ($quoted == false ? 1 : 7))),
- substr($message, $pos1, $pos2 - $pos1)
- );
- if (!empty($tag['block_level']) && substr($data[0], 0, 6) == '<br />')
- $data[0] = substr($data[0], 6);
-
- if (isset($tag['validate']))
- $tag['validate']($tag, $data, $disabled);
- $code = strtr($tag['content'], array('$1' => $data[0], '$2' => $data[1]));
- $message = substr($message, 0, $pos) . "\n" . $code . "\n" . substr($message, $pos3 + 3 + strlen($tag['tag']));
- $pos += strlen($code) - 1 + 2;
- }
-
- elseif ($tag['type'] == 'closed')
- {
- $pos2 = strpos($message, ']', $pos);
- $message = substr($message, 0, $pos) . "\n" . $tag['content'] . "\n" . substr($message, $pos2 + 1);
- $pos += strlen($tag['content']) - 1 + 2;
- }
-
- elseif ($tag['type'] == 'unparsed_commas_content')
- {
- $pos2 = strpos($message, ']', $pos1);
- if ($pos2 === false)
- continue;
- $pos3 = stripos($message, '[/' . substr($message, $pos + 1, strlen($tag['tag'])) . ']', $pos2);
- if ($pos3 === false)
- continue;
-
- $data = explode(',', ',' . substr($message, $pos1, $pos2 - $pos1));
- $data[0] = substr($message, $pos2 + 1, $pos3 - $pos2 - 1);
- if (isset($tag['validate']))
- $tag['validate']($tag, $data, $disabled);
- $code = $tag['content'];
- foreach ($data as $k => $d)
- $code = strtr($code, array('$' . ($k + 1) => trim($d)));
- $message = substr($message, 0, $pos) . "\n" . $code . "\n" . substr($message, $pos3 + 3 + strlen($tag['tag']));
- $pos += strlen($code) - 1 + 2;
- }
-
- elseif ($tag['type'] == 'unparsed_commas')
- {
- $pos2 = strpos($message, ']', $pos1);
- if ($pos2 === false)
- continue;
- $data = explode(',', substr($message, $pos1, $pos2 - $pos1));
- if (isset($tag['validate']))
- $tag['validate']($tag, $data, $disabled);
-
- foreach ($data as $k => $d)
- $tag['after'] = strtr($tag['after'], array('$' . ($k + 1) => trim($d)));
- $open_tags[] = $tag;
-
- $code = $tag['before'];
- foreach ($data as $k => $d)
- $code = strtr($code, array('$' . ($k + 1) => trim($d)));
- $message = substr($message, 0, $pos) . "\n" . $code . "\n" . substr($message, $pos2 + 1);
- $pos += strlen($code) - 1 + 2;
- }
-
- elseif ($tag['type'] == 'unparsed_equals' || $tag['type'] == 'parsed_equals')
- {
-
- if (isset($tag['quoted']))
- {
- $quoted = substr($message, $pos1, 6) == '"';
- if ($tag['quoted'] != 'optional' && !$quoted)
- continue;
- if ($quoted)
- $pos1 += 6;
- }
- else
- $quoted = false;
- $pos2 = strpos($message, $quoted == false ? ']' : '"]', $pos1);
- if ($pos2 === false)
- continue;
- $data = substr($message, $pos1, $pos2 - $pos1);
-
- if (isset($tag['validate']))
- $tag['validate']($tag, $data, $disabled);
-
- if ($tag['type'] != 'unparsed_equals')
- $data = parse_bbc($data, !empty($tag['parsed_tags_allowed']) ? false : true, '', !empty($tag['parsed_tags_allowed']) ? $tag['parsed_tags_allowed'] : array());
- $tag['after'] = strtr($tag['after'], array('$1' => $data));
- $open_tags[] = $tag;
- $code = strtr($tag['before'], array('$1' => $data));
- $message = substr($message, 0, $pos) . "\n" . $code . "\n" . substr($message, $pos2 + ($quoted == false ? 1 : 7));
- $pos += strlen($code) - 1 + 2;
- }
-
- if (!empty($tag['block_level']) && substr($message, $pos + 1, 6) == '<br />')
- $message = substr($message, 0, $pos + 1) . substr($message, $pos + 7);
-
- if (!empty($tag['trim']) && $tag['trim'] != 'outside' && preg_match('~(<br />| |\s)*~', substr($message, $pos + 1), $matches) != 0)
- $message = substr($message, 0, $pos + 1) . substr($message, $pos + 1 + strlen($matches[0]));
- }
-
- while ($tag = array_pop($open_tags))
- $message .= "\n" . $tag['after'] . "\n";
-
- if ($smileys === true)
- {
- $message_parts = explode("\n", $message);
- for ($i = 0, $n = count($message_parts); $i < $n; $i += 2)
- parsesmileys($message_parts[$i]);
- $message = implode('', $message_parts);
- }
-
- else
- $message = strtr($message, array("\n" => ''));
- if (substr($message, 0, 1) == ' ')
- $message = ' ' . substr($message, 1);
-
- $message = strtr($message, array(' ' => ' ', "\r" => '', "\n" => '<br />', '<br /> ' => '<br /> ', ' ' => "\n"));
-
- call_integration_hook('integrate_post_parsebbc', array(&$message, &$smileys, &$cache_id, &$parse_tags));
-
- if (isset($cache_key, $cache_t) && array_sum(explode(' ', microtime())) - array_sum(explode(' ', $cache_t)) > 0.05)
- cache_put_data($cache_key, $message, 240);
-
- if (!empty($parse_tags))
- {
- if (empty($temp_bbc))
- $bbc_codes = array();
- else
- {
- $bbc_codes = $temp_bbc;
- unset($temp_bbc);
- }
- }
- return $message;
- }
- function parsesmileys(&$message)
- {
- global $modSettings, $txt, $user_info, $context, $smcFunc;
- static $smileyPregSearch = null, $smileyPregReplacements = array();
-
- if ($user_info['smiley_set'] == 'none' || trim($message) == '')
- return;
-
- if (empty($smileyPregSearch))
- {
-
- if (empty($modSettings['smiley_enable']))
- {
- $smileysfrom = array('>:D', ':D', '::)', '>:(', ':))', ':)', ';)', ';D', ':(', ':o', '8)', ':P', '???', ':-[', ':-X', ':-*', ':\'(', ':-\\', '^-^', 'O0', 'C:-)', '0:)');
- $smileysto = array('evil.gif', 'cheesy.gif', 'rolleyes.gif', 'angry.gif', 'laugh.gif', 'smiley.gif', 'wink.gif', 'grin.gif', 'sad.gif', 'shocked.gif', 'cool.gif', 'tongue.gif', 'huh.gif', 'embarrassed.gif', 'lipsrsealed.gif', 'kiss.gif', 'cry.gif', 'undecided.gif', 'azn.gif', 'afro.gif', 'police.gif', 'angel.gif');
- $smileysdescs = array('', $txt['icon_cheesy'], $txt['icon_rolleyes'], $txt['icon_angry'], '', $txt['icon_smiley'], $txt['icon_wink'], $txt['icon_grin'], $txt['icon_sad'], $txt['icon_shocked'], $txt['icon_cool'], $txt['icon_tongue'], $txt['icon_huh'], $txt['icon_embarrassed'], $txt['icon_lips'], $txt['icon_kiss'], $txt['icon_cry'], $txt['icon_undecided'], '', '', '', '');
- }
- else
- {
-
- if (($temp = cache_get_data('parsing_smileys', 480)) == null)
- {
- $result = $smcFunc['db_query']('', '
- SELECT code, filename, description
- FROM {db_prefix}smileys',
- array(
- )
- );
- $smileysfrom = array();
- $smileysto = array();
- $smileysdescs = array();
- while ($row = $smcFunc['db_fetch_assoc']($result))
- {
- $smileysfrom[] = $row['code'];
- $smileysto[] = $row['filename'];
- $smileysdescs[] = $row['description'];
- }
- $smcFunc['db_free_result']($result);
- cache_put_data('parsing_smileys', array($smileysfrom, $smileysto, $smileysdescs), 480);
- }
- else
- list ($smileysfrom, $smileysto, $smileysdescs) = $temp;
- }
-
- $non_breaking_space = $context['utf8'] ? '\x{A0}' : '\xA0';
-
- $smileyPregReplacements = array();
- $searchParts = array();
- for ($i = 0, $n = count($smileysfrom); $i < $n; $i++)
- {
- $smileyCode = '<img src="' . htmlspecialchars($modSettings['smileys_url'] . '/' . $user_info['smiley_set'] . '/' . $smileysto[$i]) . '" alt="' . strtr(htmlspecialchars($smileysfrom[$i], ENT_QUOTES), array(':' => ':', '(' => '(', ')' => ')', '$' => '$', '[' => '[')). '" title="' . strtr(htmlspecialchars($smileysdescs[$i]), array(':' => ':', '(' => '(', ')' => ')', '$' => '$', '[' => '[')) . '" class="smiley" />';
- $smileyPregReplacements[$smileysfrom[$i]] = $smileyCode;
- $searchParts[] = preg_quote($smileysfrom[$i], '~');
- if ($smileysfrom[$i] != ($specialChars = htmlspecialchars($smileysfrom[$i], ENT_QUOTES)))
- {
- $smileyPregReplacements[$specialChars] = $smileyCode;
- $searchParts[] = preg_quote($specialChars, '~');
- }
- }
- $smileyPregSearch = '~(?<=[>:\?\.\s' . $non_breaking_space . '[\]()*\\\;]|^)(' . implode('|', $searchParts) . ')(?=[^[:alpha:]0-9]|$)~e' . ($context['utf8'] ? 'u' : '');
- }
-
- $message = preg_replace($smileyPregSearch, '$smileyPregReplacements[\'$1\']', $message);
- }
- function highlight_php_code($code)
- {
- global $context;
-
- $code = un_htmlspecialchars(strtr($code, array('<br />' => "\n", "\t" => 'SMF_TAB();', '[' => '[')));
- $oldlevel = error_reporting(0);
- $buffer = str_replace(array("\n", "\r"), '', @highlight_string($code, true));
- error_reporting($oldlevel);
-
- $buffer = preg_replace('~SMF_TAB(?:</(?:font|span)><(?:font color|span style)="[^"]*?">)?\\(\\);~', '<pre style="display: inline;">' . "\t" . '</pre>', $buffer);
- return strtr($buffer, array('\'' => ''', '<code>' => '', '</code>' => ''));
- }
- function redirectexit($setLocation = '', $refresh = false)
- {
- global $scripturl, $context, $modSettings, $db_show_debug, $db_cache;
-
- if (!empty($context['flush_mail']))
-
- AddMailQueue(true);
- $add = preg_match('~^(ftp|http)[s]?://~', $setLocation) == 0 && substr($setLocation, 0, 6) != 'about:';
- if (WIRELESS)
- {
-
- if ($add)
- $setLocation = $scripturl . '?' . $setLocation;
- $char = strpos($setLocation, '?') === false ? '?' : ';';
- if (strpos($setLocation, '#') !== false)
- $setLocation = strtr($setLocation, array('#' => $char . WIRELESS_PROTOCOL . '#'));
- else
- $setLocation .= $char . WIRELESS_PROTOCOL;
- }
- elseif ($add)
- $setLocation = $scripturl . ($setLocation != '' ? '?' . $setLocation : '');
-
- if (defined('SID') && SID != '')
- $setLocation = preg_replace('/^' . preg_quote($scripturl, '/') . '(?!\?' . preg_quote(SID, '/') . ')\\??/', $scripturl . '?' . SID . ';', $setLocation);
-
- elseif (isset($_GET['debug']))
- $setLocation = preg_replace('/^' . preg_quote($scripturl, '/') . '\\??/', $scripturl . '?debug;', $setLocation);
- if (!empty($modSettings['queryless_urls']) && (empty($context['server']['is_cgi']) || ini_get('cgi.fix_pathinfo') == 1 || @get_cfg_var('cgi.fix_pathinfo') == 1) && (!empty($context['server']['is_apache']) || !empty($context['server']['is_lighttpd']) || !empty($context['server']['is_litespeed'])))
- {
- if (defined('SID') && SID != '')
- $setLocation = preg_replace('/^' . preg_quote($scripturl, '/') . '\?(?:' . SID . '(?:;|&|&))((?:board|topic)=[^#]+?)(#[^"]*?)?$/e', "\$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html?' . SID . '\$2'", $setLocation);
- else
- $setLocation = preg_replace('/^' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+?)(#[^"]*?)?$/e', "\$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html\$2'", $setLocation);
- }
-
- call_integration_hook('integrate_redirect', array(&$setLocation, &$refresh));
-
- if ($refresh && !WIRELESS)
- header('Refresh: 0; URL=' . strtr($setLocation, array(' ' => '%20')));
- else
- header('Location: ' . str_replace(' ', '%20', $setLocation));
-
- if (isset($db_show_debug) && $db_show_debug === true)
- $_SESSION['debug_redirect'] = $db_cache;
- obExit(false);
- }
- function obExit($header = null, $do_footer = null, $from_index = false, $from_fatal_error = false)
- {
- global $context, $settings, $modSettings, $txt, $smcFunc;
- static $header_done = false, $footer_done = false, $level = 0, $has_fatal_error = false;
-
- ++$level;
- if ($level > 1 && !$from_fatal_error && !$has_fatal_error)
- exit;
- if ($from_fatal_error)
- $has_fatal_error = true;
-
- trackStats();
-
- if (!empty($context['flush_mail']))
-
- AddMailQueue(true);
- $do_header = $header === null ? !$header_done : $header;
- if ($do_footer === null)
- $do_footer = $do_header;
-
- if ($do_header)
- {
-
- if (!empty($context['page_title']) && empty($context['page_title_html_safe']))
- $context['page_title_html_safe'] = $smcFunc['htmlspecialchars'](un_htmlspecialchars($context['page_title'])) . (!empty($context['current_page']) ? ' - ' . $txt['page'] . ' ' . ($context['current_page'] + 1) : '');
-
- ob_start('ob_sessrewrite');
- if (!empty($settings['output_buffers']) && is_string($settings['output_buffers']))
- $buffers = explode(',', $settings['output_buffers']);
- elseif (!empty($settings['output_buffers']))
- $buffers = $settings['output_buffers'];
- else
- $buffers = array();
- if (isset($modSettings['integrate_buffer']))
- $buffers = array_merge(explode(',', $modSettings['integrate_buffer']), $buffers);
- if (!empty($buffers))
- foreach ($buffers as $function)
- {
- $function = trim($function);
- $call = strpos($function, '::') !== false ? explode('::', $function) : $function;
-
- if (is_callable($call))
- ob_start($call);
- }
-
- template_header();
- $header_done = true;
- }
- if ($do_footer)
- {
- if (WIRELESS && !isset($context['sub_template']))
- fatal_lang_error('wireless_error_notyet', false);
-
- loadSubTemplate(isset($context['sub_template']) ? $context['sub_template'] : 'main');
-
- if (!empty($context['insert_after_template']) && !isset($_REQUEST['xml']))
- echo $context['insert_after_template'];
-
- if (!$footer_done)
- {
- $footer_done = true;
- template_footer();
-
- if (!isset($_REQUEST['xml']))
- displayDebug();
- }
- }
-
- if (strpos($_SERVER['REQUEST_URL'], 'action=dlattach') === false && strpos($_SERVER['REQUEST_URL'], 'action=viewsmfile') === false)
- $_SESSION['old_url'] = $_SERVER['REQUEST_URL'];
-
- $_SESSION['USER_AGENT'] = empty($_SERVER['HTTP_USER_AGENT']) ? '' : $_SERVER['HTTP_USER_AGENT'];
- if (!empty($settings['strict_doctype']))
- {
-
- $temp = ob_get_contents();
- ob_clean();
- echo strtr($temp, array(
- 'var smf_iso_case_folding' => 'var target_blank = \'_blank\'; var smf_iso_case_folding',
- 'target="_blank"' => 'onclick="this.target=target_blank"'));
- }
-
- call_integration_hook('integrate_exit', array($do_footer && !WIRELESS));
-
- if (!$from_index || WIRELESS)
- exit;
- }
- function url_image_size($url)
- {
- global $sourcedir;
-
- $url = str_replace(' ', '%20', $url);
-
- if (($temp = cache_get_data('url_image_size-' . md5($url), 240)) !== null)
- return $temp;
- $t = microtime();
-
- preg_match('~^\w+://(.+?)/(.*)$~', $url, $match);
-
- if ($url == '' || $url == 'http://' || $url == 'https://')
- {
- return false;
- }
- elseif (!isset($match[1]))
- {
- $size = @getimagesize($url);
- }
- else
- {
-
- $temp = 0;
- $fp = @fsockopen($match[1], 80, $temp, $temp, 0.5);
-
- if ($fp != false)
- {
-
- fwrite($fp, 'HEAD /' . $match[2] . ' HTTP/1.1' . "\r\n" . 'Host: ' . $match[1] . "\r\n" . 'User-Agent: PHP/SMF' . "\r\n" . 'Connection: close' . "\r\n\r\n");
-
- $test = substr(fgets($fp, 11), -1);
- fclose($fp);
-
- if ($test < 4)
- {
- $size = @getimagesize($url);
-
- if ($size === false && function_exists('imagecreatefromstring'))
- {
- include_once($sourcedir . '/Subs-Package.php');
-
- $image = @imagecreatefromstring(fetch_web_data($url));
- if ($image !== false)
- {
- $size = array(imagesx($image), imagesy($image));
- imagedestroy($image);
- }
- }
- }
- }
- }
-
- if (!isset($size))
- $size = false;
-
- if (array_sum(explode(' ', microtime())) - array_sum(explode(' ', $t)) > 0.8)
- cache_put_data('url_image_size-' . md5($url), $size, 240);
-
- return $size;
- }
- function determineTopicClass(&$topic_context)
- {
-
- if ($topic_context['is_very_hot'])
- $topic_context['class'] = 'veryhot';
- elseif ($topic_context['is_hot'])
- $topic_context['class'] = 'hot';
- else
- $topic_context['class'] = 'normal';
- $topic_context['class'] .= $topic_context['is_poll'] ? '_poll' : '_post';
- if ($topic_context['is_locked'])
- $topic_context['class'] .= '_locked';
- if ($topic_context['is_sticky'])
- $topic_context['class'] .= '_sticky';
-
- $topic_context['extended_class'] = &$topic_context['class'];
- }
- function setupThemeContext($forceload = false)
- {
- global $modSettings, $user_info, $scripturl, $context, $settings, $options, $txt, $maintenance;
- global $user_settings, $smcFunc;
- static $loaded = false;
-
-
- if ($loaded && !$forceload)
- return;
- $loaded = true;
- $context['in_maintenance'] = !empty($maintenance);
- $context['current_time'] = timeformat(time(), false);
- $context['current_action'] = isset($_GET['action']) ? $_GET['action'] : '';
- $context['show_quick_login'] = !empty($modSettings['enableVBStyleLogin']) && $user_info['is_guest'];
-
- $context['news_lines'] = explode("\n", str_replace("\r", '', trim(addslashes($modSettings['news']))));
- $context['fader_news_lines'] = array();
- for ($i = 0, $n = count($context['news_lines']); $i < $n; $i++)
- {
- if (trim($context['news_lines'][$i]) == '')
- continue;
-
- $context['news_lines'][$i] = parse_bbc(stripslashes(trim($context['news_lines'][$i])), true, 'news' . $i);
-
- $context['fader_news_lines'][$i] = strtr(addslashes($context['news_lines'][$i]), array('/' => '\/', '<a href=' => '<a hre" + "f='));
- }
- $context['random_news_line'] = $context['news_lines'][mt_rand(0, count($context['news_lines']) - 1)];
- if (!$user_info['is_guest'])
- {
- $context['user']['messages'] = &$user_info['messages'];
- $context['user']['unread_messages'] = &$user_info['unread_messages'];
-
- if ($user_info['unread_messages'] > (isset($_SESSION['unread_messages']) ? $_SESSION['unread_messages'] : 0))
- $context['user']['popup_messages'] = true;
- else
- $context['user']['popup_messages'] = false;
- $_SESSION['unread_messages'] = $user_info['unread_messages'];
- if (allowedTo('moderate_forum'))
- $context['unapproved_members'] = (!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 2) || !empty($modSettings['approveAccountDeletion']) ? $modSettings['unapprovedMembers'] : 0;
- $context['show_open_reports'] = empty($user_settings['mod_prefs']) || $user_settings['mod_prefs'][0] == 1;
- $context['user']['avatar'] = array();
-
- if ($user_info['avatar']['url'] == '' && !empty($user_info['avatar']['id_attach']))
- $context['user']['avatar']['href'] = $user_info['avatar']['custom_dir'] ? $modSettings['custom_avatar_url'] . '/' . $user_info['avatar']['filename'] : $scripturl . '?action=dlattach;attach=' . $user_info['avatar']['id_attach'] . ';type=avatar';
-
- elseif (substr($user_info['avatar']['url'], 0, 7) == 'http://')
- {
- $context['user']['avatar']['href'] = $user_info['avatar']['url'];
- if ($modSettings['avatar_action_too_large'] == 'option_html_resize' || $modSettings['avatar_action_too_large'] == 'option_js_resize')
- {
- if (!empty($modSettings['avatar_max_width_external']))
- $context['user']['avatar']['width'] = $modSettings['avatar_max_width_external'];
- if (!empty($modSettings['avatar_max_height_external']))
- $context['user']['avatar']['height'] = $modSettings['avatar_max_height_external'];
- }
- }
-
- elseif ($user_info['avatar']['url'] != '')
- $context['user']['avatar']['href'] = $modSettings['avatar_url'] . '/' . htmlspecialchars($user_info['avatar']['url']);
- if (!empty($context['user']['avatar']))
- $context['user']['avatar']['image'] = '<img src="' . $context['user']['avatar']['href'] . '"' . (isset($context['user']['avatar']['width']) ? ' width="' . $context['user']['avatar']['width'] . '"' : '') . (isset($context['user']['avatar']['height']) ? ' height="' . $context['user']['avatar']['height'] . '"' : '') . ' alt="" class="avatar" />';
-
- $context['user']['total_time_logged_in'] = array(
- 'days' => floor($user_info['total_time_logged_in'] / 86400),
- 'hours' => floor(($user_info['total_time_logged_in'] % 86400) / 3600),
- 'minutes' => floor(($user_info['total_time_logged_in'] % 3600) / 60)
- );
- }
- else
- {
- $context['user']['messages'] = 0;
- $context['user']['unread_messages'] = 0;
- $context['user']['avatar'] = array();
- $context['user']['total_time_logged_in'] = array('days' => 0, 'hours' => 0, 'minutes' => 0);
- $context['user']['popup_messages'] = false;
- if (!empty($modSettings['registration_method']) && $modSettings['registration_method'] == 1)
- $txt['welcome_guest'] .= $txt['welcome_guest_activate'];
-
- if (!empty($modSettings['disableHashTime']) && ($modSettings['disableHashTime'] == 1 || time() < $modSettings['disableHashTime']))
- $context['disable_login_hashing'] = true;
- }
-
- setupMenuContext();
- if (empty($settings['theme_version']))
- $context['show_vBlogin'] = $context['show_quick_login'];
-
- $context['show_news'] = !empty($settings['enable_news']);
-
- $context['show_pm_popup'] = $context['user']['popup_messages'] && !empty($options['popup_messages']) && (!isset($_REQUEST['action']) || $_REQUEST['action'] != 'pm');
-
- if($context['show_pm_popup'])
- addInlineJavascript('
- $(document).ready(function(){
- new smc_Popup({
- heading: ' . JavaScriptEscape($txt['show_personal_messages_heading']) . ',
- content: ' . JavaScriptEscape(sprintf($txt['show_personal_messages'], $context['user']['unread_messages'], $scripturl . '?action=pm')) . ',
- icon: smf_images_url + \'/im_sm_newmsg.png\'
- });
- });');
-
- if ($modSettings['avatar_action_too_large'] == 'option_js_resize' && (!empty($modSettings['avatar_max_width_external']) || !empty($modSettings['avatar_max_height_external'])))
- {
-
- $context['html_headers'] .= '
- <script type="text/javascript"><!-- // --><![CDATA[
- var smf_avatarMaxWidth = ' . (int) $modSettings['avatar_max_width_external'] . ';
- var smf_avatarMaxHeight = ' . (int) $modSettings['avatar_max_height_external'] . ';';
- if (!isBrowser('ie'))
- $context['html_headers'] .= '
- window.addEventListener("load", smf_avatarResize, false);';
- else
- $context['html_headers'] .= '
- var window_oldAvatarOnload = window.onload;
- window.onload = smf_avatarResize;';
- $context['html_headers'] .= '
- // ]]></script>';
- }
-
- $context['common_stats']['latest_member'] = array(
- 'id' => $modSettings['latestMember'],
- 'name' => $modSettings['latestRealName'],
- 'href' => $scripturl . '?action=profile;u=' . $modSettings['latestMember'],
- 'link' => '<a href="' . $scripturl . '?action=profile;u=' . $modSettings['latestMember'] . '">' . $modSettings['latestRealName'] . '</a>',
- );
- $context['common_stats'] = array(
- 'total_posts' => comma_format($modSettings['totalMessages']),
- 'total_topics' => comma_format($modSettings['totalTopics']),
- 'total_members' => comma_format($modSettings['totalMembers']),
- 'latest_member' => $context['common_stats']['latest_member'],
- );
- $context['common_stats']['boardindex_total_posts'] = sprintf($txt['boardindex_total_posts'], $context['common_stats']['total_posts'], $context['common_stats']['total_topics'], $context['common_stats']['total_members']);
- if (empty($settings['theme_version']))
- $context['html_headers'] .= '
- <script type="text/javascript"><!-- // --><![CDATA[
- var smf_scripturl = "' . $scripturl . '";
- // ]]></script>';
- if (!isset($context['page_title']))
- $context['page_title'] = '';
-
- $context['page_title_html_safe'] = $smcFunc['htmlspecialchars'](un_htmlspecialchars($context['page_title'])) . (!empty($context['current_page']) ? ' - ' . $txt['page'] . ' ' . ($context['current_page'] + 1) : '');
- $context['meta_keywords'] = !empty($modSettings['meta_keywords']) ? $smcFunc['htmlspecialchars']($modSettings['meta_keywords']) : '';
- }
- function setMemoryLimit($needed, $in_use = false)
- {
-
- $memory_used = 0;
- $memory_current = memoryReturnBytes(ini_get('memory_limit'));
- $memory_needed = memoryReturnBytes($needed);
-
- if ($in_use)
- $memory_needed += function_exists('memory_get_usage') ? memory_get_usage() : (2 * 1048576);
-
- if ($memory_current < $memory_needed)
- {
- @ini_set('memory_limit', ceil($memory_needed / 1048576) . 'M');
- $memory_current = memoryReturnBytes(ini_get('memory_limit'));
- }
- $memory_current = max($memory_current, memoryReturnBytes(get_cfg_var('memory_limit')));
-
- return (bool) ($memory_current >= $memory_needed);
- }
- function memoryReturnBytes($val)
- {
- if (is_integer($val))
- return $val;
-
- $val = trim($val);
- $num = intval(substr($val, 0, strlen($val) - 1));
- $last = strtolower(substr($val, -1));
-
- switch ($last)
- {
- case 'g':
- $num *= 1024;
- case 'm':
- $num *= 1024;
- case 'k':
- $num *= 1024;
- }
- return $num;
- }
- function template_rawdata()
- {
- global $context;
- echo $context['raw_data'];
- }
- function template_header()
- {
- global $txt, $modSettings, $context, $settings, $user_info, $boarddir, $cachedir;
- setupThemeContext();
-
- if (empty($context['no_last_modified']))
- {
- header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
- header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
-
- if (!isset($_REQUEST['xml']) && isset($_GET['debug']) && !isBrowser('ie') && !WIRELESS)
- header('Content-Type: application/xhtml+xml');
- elseif (!isset($_REQUEST['xml']) && !WIRELESS)
- header('Content-Type: text/html; charset=' . (empty($context['character_set']) ? 'ISO-8859-1' : $context['character_set']));
- }
- header('Content-Type: text/' . (isset($_REQUEST['xml']) ? 'xml' : 'html') . '; charset=' . (empty($context['character_set']) ? 'ISO-8859-1' : $context['character_set']));
- $checked_securityFiles = false;
- $showed_banned = false;
- foreach ($context['template_layers'] as $layer)
- {
- loadSubTemplate($layer . '_above', true);
-
- if (in_array($layer, array('body', 'main')) && allowedTo('admin_forum') && !$user_info['is_guest'] && !$checked_securityFiles)
- {
- $checked_securityFiles = true;
-
- $securityFiles = array('install.php', 'webinstall.php', 'upgrade.php', 'convert.php', 'repair_paths.php', 'repair_settings.php', 'Settings.php~', 'Settings_bak.php~');
- foreach ($securityFiles as $i => $securityFile)
- {
- if (!file_exists($boarddir . '/' . $securityFile))
- unset($securityFiles[$i]);
- }
-
- if (!empty($modSettings['currentAttachmentUploadDir']))
- {
- if (!is_array($modSettings['attachmentUploadDir']))
- $modSettings['attachmentUploadDir'] = @unserialize($modSettings['attachmentUploadDir']);
- $path = $modSettings['attachmentUploadDir'][$modSettings['currentAttachmentUploadDir']];
- }
- else
- {
- $path = $modSettings['attachmentUploadDir'];
- $id_folder_thumb = 1;
- }
- secureDirectory($path, true);
- secureDirectory($cachedir);
-
- if ($modSettings['requireAgreement'])
- $agreement = !file_exists($boarddir . '/agreement.txt');
- if (!empty($securityFiles) || (!empty($modSettings['cache_enable']) && !is_writable($cachedir)) || !empty($agreement))
- {
- echo '
- <div class="errorbox">
- <p class="alert">!!</p>
- <h3>', empty($securityFiles) ? $txt['generic_warning'] : $txt['security_risk'], '</h3>
- <p>';
- foreach ($securityFiles as $securityFile)
- {
- echo '
- ', $txt['not_removed'], '<strong>', $securityFile, '</strong>!<br />';
- if ($securityFile == 'Settings.php~' || $securityFile == 'Settings_bak.php~')
- echo '
- ', sprintf($txt['not_removed_extra'], $securityFile, substr($securityFile, 0, -1)), '<br />';
- }
- if (!empty($modSettings['cache_enable']) && !is_writable($cachedir))
- echo '
- <strong>', $txt['cache_writable'], '</strong><br />';
- if (!empty($agreement))
- echo '
- <strong>', $txt['agreement_missing'], '</strong><br />';
- echo '
- </p>
- </div>';
- }
- }
-
- elseif (in_array($layer, array('main', 'body')) && isset($_SESSION['ban']['cannot_post']) && !$showed_banned)
- {
- $showed_banned = true;
- echo '
- <div class="windowbg alert" style="margin: 2ex; padding: 2ex; border: 2px dashed red;">
- ', sprintf($txt['you_are_post_banned'], $user_info['is_guest'] ? $txt['guest_title'] : $user_info['name']);
- if (!empty($_SESSION['ban']['cannot_post']['reason']))
- echo '
- <div style="padding-left: 4ex; padding-top: 1ex;">', $_SESSION['ban']['cannot_post']['reason'], '</div>';
- if (!empty($_SESSION['ban']['expire_time']))
- echo '
- <div>', sprintf($txt['your_ban_expires'], timeformat($_SESSION['ban']['expire_time'], false)), '</div>';
- else
- echo '
- <div>', $txt['your_ban_expires_never'], '</div>';
- echo '
- </div>';
- }
- }
- if (isset($settings['use_default_images']) && $settings['use_default_images'] == 'defaults' && isset($settings['default_template']))
- {
- $settings['theme_url'] = $settings['default_theme_url'];
- $settings['images_url'] = $settings['default_images_url'];
- $settings['theme_dir'] = $settings['default_theme_dir'];
- }
- }
- function theme_copyright()
- {
- global $forum_copyright, $context, $boardurl, $forum_version, $txt, $modSettings;
-
- if (!isset($forum_version))
- return;
-
- $forum_copyright = sprintf($forum_copyright, $forum_version);
- echo '
- <span class="smalltext" style="display: inline; visibility: visible; font-family: Verdana, Arial, sans-serif;">' . $forum_copyright . '
- </span>';
- }
- function template_footer()
- {
- global $context, $settings, $modSettings, $time_start, $db_count;
-
- $context['show_load_time'] = !empty($modSettings['timeLoadPageEnable']);
- $context['load_time'] = round(array_sum(explode(' ', microtime())) - array_sum(explode(' ', $time_start)), 3);
- $context['load_queries'] = $db_count;
- if (isset($settings['use_default_images']) && $settings['use_default_images'] == 'defaults' && isset($settings['default_template']))
- {
- $settings['theme_url'] = $settings['actual_theme_url'];
- $settings['images_url'] = $settings['actual_images_url'];
- $settings['theme_dir'] = $settings['actual_theme_dir'];
- }
- foreach (array_reverse($context['template_layers']) as $layer)
- loadSubTemplate($layer . '_below', true);
- }
- function template_javascript($do_defered = false)
- {
- global $context, $modSettings, $settings;
-
- call_integration_hook('pre_javascript_output');
-
- if (!empty($context['javascript_vars']) && !$do_defered)
- {
- echo '
- <script type="text/javascript"><!-- // --><![CDATA[';
- foreach ($context['javascript_vars'] as $key => $value)
- echo '
- var ', $key, ' = ', $value, ';';
- echo '
- // ]]></script>';
- }
-
- foreach ($context['javascript_files'] as $id => $js_file)
- {
- if ((!$do_defered && empty($js_file['options']['defer'])) || ($do_defered && !empty($js_file['options']['defer'])))
- echo '
- <script type="text/javascript" src="', $js_file['filename'], '" id="', $id,'"' , !empty($js_file['options']['async']) ? ' async="async"' : '' ,'></script>';
-
- if ($id == 'jquery' && (!isset($modSettings['jquery_source']) || !in_array($modSettings['jquery_source'],array('local', 'cdn'))))
- echo '
- <script type="text/javascript"><!-- // --><![CDATA[
- window.jQuery || document.write(\'<script src="' . $settings['default_theme_url'] . '/scripts/jquery-1.7.1.min.js"><\/script>\');
- // ]]></script>';
- }
-
- if (!empty($context['javascript_inline']))
- {
- if (!empty($context['javascript_inline']['defer']) && $do_defered)
- {
- echo '
- <script type="text/javascript"><!-- // --><![CDATA[';
- foreach ($context['javascript_inline']['defer'] as $js_code)
- echo $js_code;
- echo'
- // ]]></script>';
- }
- if (!empty($context['javascript_inline']['standard']) && !$do_defered)
- {
- echo '
- <script type="text/javascript"><!-- // --><![CDATA[';
- foreach ($context['javascript_inline']['standard'] as $js_code)
- echo $js_code;
- echo'
- // ]]></script>';
- }
- }
- }
- function template_css()
- {
- global $context;
-
- call_integration_hook('pre_css_output');
- foreach ($context['css_files'] as $id => $file)
- echo '
- <link rel="stylesheet" type="text/css" href="', $file['filename'], '" id="', $id,'" />';
- }
- function getAttachmentFilename($filename, $attachment_id, $dir = null, $new = false, $file_hash = '')
- {
- global $modSettings, $smcFunc;
-
- if ($new)
- return sha1(md5($filename . time()) . mt_rand());
-
-
- if ($file_hash === '')
- {
- $request = $smcFunc['db_query']('', '
- SELECT file_hash
- FROM {db_prefix}attachments
- WHERE id_attach = {int:id_attach}',
- array(
- 'id_attach' => $attachment_id,
- ));
- if ($smcFunc['db_num_rows']($request) === 0)
- return false;
- list ($file_hash) = $smcFunc['db_fetch_row']($request);
- $smcFunc['db_free_result']($request);
- }
-
- if (empty($file_hash))
- return getLegacyAttachmentFilename($filename, $attachment_id, $dir, $new);
-
- if (!empty($modSettings['currentAttachmentUploadDir']))
- {
- if (!is_array($modSettings['attachmentUploadDir']))
- $modSettings['attachmentUploadDir'] = unserialize($modSettings['attachmentUploadDir']);
- $path = $modSettings['attachmentUploadDir'][$dir];
- }
- else
- $path = $modSettings['attachmentUploadDir'];
- return $path . '/' . $attachment_id . '_' . $file_hash;
- }
- function getLegacyAttachmentFilename($filename, $attachment_id, $dir = null, $new = false)
- {
- global $modSettings, $db_character_set;
- $clean_name = $filename;
-
-
- if (empty($db_character_set) || $db_character_set != 'utf8')
- {
- $clean_name = strtr($filename,
- "\x8a\x8e\x9a\x9e\x9f\xc0\xc1\xc2\xc3\xc4\xc5\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xe0\xe1\xe2\xe3\xe4\xe5\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xff",
- 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy');
- $clean_name = strtr($clean_name, array("\xde" => 'TH', "\xfe" =>
- 'th', "\xd0" => 'DH', "\xf0" => 'dh', "\xdf" => 'ss', "\x8c" => 'OE',
-
- "\x9c" => 'oe', "\c6" => 'AE', "\xe6" => 'ae', "\xb5" => 'u'));
- }
-
- $clean_name = preg_replace(array('/\s/', '/[^\w_\.\-]/'), array('_', ''), $clean_name);
- $enc_name = $attachment_id . '_' . strtr($clean_name, '.', '_') . md5($clean_name);
- $clean_name = preg_replace('~\.[\.]+~', '.', $clean_name);
- if ($attachment_id == false || ($new && empty($modSettings['attachmentEncryptFilenames'])))
- return $clean_name;
- elseif ($new)
- return $enc_name;
-
- if (!empty($modSettings['currentAttachmentUploadDir']))
- {
- if (!is_array($modSettings['attachmentUploadDir']))
- $modSettings['attachmentUploadDir'] = unserialize($modSettings['attachmentUploadDir']);
- $path = $modSettings['attachmentUploadDir'][$dir];
- }
- else
- $path = $modSettings['attachmentUploadDir'];
- if (file_exists($path . '/' . $enc_name))
- $filename = $path . '/' . $enc_name;
- else
- $filename = $path . '/' . $clean_name;
- return $filename;
- }
- function ip2range($fullip)
- {
-
- if (isValidIPv6($fullip) !== false)
- {
- $ip_parts = explode(':', expandIPv6($fullip, false));
- $ip_array = array();
- if (count($ip_parts) != 8)
- return array();
- for ($i = 0; $i < 8; $i++)
- {
- if ($ip_parts[$i] == '*')
- $ip_array[$i] = array('low' => '0', 'high' => hexdec('ffff'));
- elseif (preg_match('/^([0-9A-Fa-f]{1,4})\-([0-9A-Fa-f]{1,4})$/', $ip_parts[$i], $range) == 1)
- $ip_array[$i] = array('low' => hexdec($range[1]), 'high' => hexdec($range[2]));
- elseif (is_numeric(hexdec($ip_parts[$i])))
- $ip_array[$i] = array('low' => hexdec($ip_parts[$i]), 'high' => hexdec($ip_parts[$i]));
- }
- return $ip_array;
- }
-
- if ($fullip == 'unknown')
- $fullip = '255.255.255.255';
- $ip_parts = explode('.', $fullip);
- $ip_array = array();
- if (count($ip_parts) != 4)
- return array();
- for ($i = 0; $i < 4; $i++)
- {
- if ($ip_parts[$i] == '*')
- $ip_array[$i] = array('low' => '0', 'high' => '255');
- elseif (preg_match('/^(\d{1,3})\-(\d{1,3})$/', $ip_parts[$i], $range) == 1)
- $ip_array[$i] = array('low' => $range[1], 'high' => $range[2]);
- elseif (is_numeric($ip_parts[$i]))
- $ip_array[$i] = array('low' => $ip_parts[$i], 'high' => $ip_parts[$i]);
- }
-
- $ip_array[4] = array('low' => 0, 'high' => 0);
- $ip_array[5] = array('low' => 0, 'high' => 0);
- $ip_array[6] = array('low' => 0, 'high' => 0);
- $ip_array[7] = array('low' => 0, 'high' => 0);
- return $ip_array;
- }
- function host_from_ip($ip)
- {
- global $modSettings;
- if (($host = cache_get_data('hostlookup-' . $ip, 600)) !== null)
- return $host;
- $t = microtime();
-
- if (!isset($host) && (strpos(strtolower(PHP_OS), 'win') === false || strpos(strtolower(PHP_OS), 'darwin') !== false) && mt_rand(0, 1) == 1)
- {
- if (!isset($modSettings['host_to_dis']))
- $test = @shell_exec('host -W 1 ' . @escapeshellarg($ip));
- else
- $test = @shell_exec('host ' . @escapeshellarg($ip));
-
- if (strpos($test, 'not found') !== false)
- $host = '';
-
- elseif ((strpos($test, 'invalid option') || strpos($test, 'Invalid query name 1')) && !isset($modSettings['host_to_dis']))
- updateSettings(array('host_to_dis' => 1));
-
- elseif (preg_match('~\s([^\s]+?)\.\s~', $test, $match) == 1)
- $host = $match[1];
- }
-
- if (!isset($host) && stripos(PHP_OS, 'win') !== false && strpos(strtolower(PHP_OS), 'darwin') === false && mt_rand(0, 1) == 1)
- {
- $test = @shell_exec('nslookup -timeout=1 ' . @escapeshellarg($ip));
- if (strpos($test, 'Non-existent domain') !== false)
- $host = '';
- elseif (preg_match('~Name:\s+([^\s]+)~', $test, $match) == 1)
- $host = $match[1];
- }
-
- if (!isset($host) || $host === false)
- $host = @gethostbyaddr($ip);
-
- if (array_sum(explode(' ', microtime())) - array_sum(explode(' ', $t)) > 0.5)
- cache_put_data('hostlookup-' . $ip, $host, 600);
- return $host;
- }
- function text2words($text, $max_chars = 20, $encrypt = false)
- {
- global $smcFunc, $context;
-
- $words = preg_replace('~(?:[\x0B\0' . ($context['utf8'] ? '\x{A0}' : '\xA0') . '\t\r\s\n(){}\\[\\]<>!@$%^*.,:+=`\~\?/\\\\]+|&(?:amp|lt|gt|quot);)+~' . ($context['utf8'] ? 'u' : ''), ' ', strtr($text, array('<br />' => ' ')));
-
- $words = un_htmlspecialchars($smcFunc['strtolower']($words));
-
- $words = explode(' ', $words);
- if ($encrypt)
- {
- $possible_chars = array_flip(array_merge(range(46, 57), range(65, 90), range(97, 122)));
- $returned_ints = array();
- foreach ($words as $word)
- {
- if (($word = trim($word, '-_\'')) !== '')
- {
- $encrypted = substr(crypt($word, 'uk'), 2, $max_chars);
- $total = 0;
- for ($i = 0; $i < $max_chars; $i++)
- $total += $possible_chars[ord($encrypted{$i})] * pow(63, $i);
- $returned_ints[] = $max_chars == 4 ? min($total, 16777215) : $total;
- }
- }
- return array_unique($returned_ints);
- }
- else
- {
-
- $returned_words = array();
- foreach ($words as $word)
- if (($word = trim($word, '-_\'')) !== '')
- $returned_words[] = $max_chars === null ? $word : substr($word, 0, $max_chars);
-
- return array_unique($returned_words);
- }
- }
- function create_button($name, $alt, $label = '', $custom = '', $force_use = false)
- {
- global $settings, $txt, $context;
-
- if (function_exists('template_create_button') && !$force_use)
- return template_create_button($name, $alt, $label = '', $custom = '');
- if (!$settings['use_image_buttons'])
- return $txt[$alt];
- elseif (!empty($settings['use_buttons']))
- return '<img src="' . $settings['images_url'] . '/buttons/' . $name . '" alt="' . $txt[$alt] . '" ' . $custom . ' />' . ($label != '' ? ' <strong>' . $txt[$label] . '</strong>' : '');
- else
- return '<img src="' . $settings['lang_images_url'] . '/' . $name . '" alt="' . $txt[$alt] . '" ' . $custom . ' />';
- }
- function clean_cache($type = '')
- {
- global $cachedir, $sourcedir, $cache_accelerator, $modSettings, $memcached;
- switch ($cache_accelerator)
- {
- case 'memcached':
- if (function_exists('memcache_flush') || function_exists('memcached_flush') && isset($modSettings['cache_memcached']) && trim($modSettings['cache_memcached']) != '')
- {
-
- if (empty($memcached))
- get_memcached_server();
- if (!$memcached)
- return;
-
- if (function_exists('memcache_flush'))
- memcache_flush($memcached);
- else
- memcached_flush($memcached);
- }
- break;
- case 'eaccelerator':
- if (function_exists('eaccelerator_clear') && function_exists('eaccelerator_clean') )
- {
-
- @eaccelerator_clean();
-
-
- eaccelerator_clear();
- }
- case 'mmcache':
- if (function_exists('mmcache_gc'))
- {
-
-
- mmcache_gc();
- }
- break;
- case 'apc':
- if (function_exists('apc_clear_cache'))
- {
-
- if ($type === '' || $type === 'data')
- {
- apc_clear_cache('user');
- apc_clear_cache('system');
- }
- elseif ($type === 'user')
- apc_clear_cache('user');
- }
- break;
- case 'zend':
- if (function_exists('zend_shm_cache_clear'))
- zend_shm_cache_clear('SMF');
- break;
- case 'xcache':
- if (function_exists('xcache_clear_cache'))
- {
-
- if ($type === '')
- {
- xcache_clear_cache(XC_TYPE_VAR, 0);
- xcache_clear_cache(XC_TYPE_PHP, 0);
- }
- if ($type === 'user')
- xcache_clear_cache(XC_TYPE_VAR, 0);
- if ($type === 'data')
- xcache_clear_cache(XC_TYPE_PHP, 0);
- }
- break;
- default:
-
- if (!is_dir($cachedir))
- return;
-
- $dh = opendir($cachedir);
- while ($file = readdir($dh))
- {
- if ($file != '.' && $file != '..' && $file != 'index.php' && $file != '.htaccess' && (!$type || substr($file, 0, strlen($type)) == $type))
- @unlink($cachedir . '/' . $file);
- }
- closedir($dh);
- break;
- }
-
-
- @touch($sourcedir . '/' . 'Load.php');
- clearstatcache();
- }
- function loadClassFile($filename)
- {
- global $sourcedir;
- if (!file_exists($sourcedir . '/' . $filename))
- fatal_lang_error('error_bad_file', 'general', array($sourcedir . '/' . $filename));
- require_once($sourcedir . '/' . $filename);
- }
- function setupMenuContext()
- {
- global $context, $modSettings, $user_info, $txt, $scripturl;
-
- $context['allow_search'] = !empty($modSettings['allow_guestAccess']) ? allowedTo('search_posts') : (!$user_info['is_guest'] && allowedTo('search_posts'));
- $context['allow_admin'] = allowedTo(array('admin_forum', 'manage_boards', 'manage_permissions', 'moderate_forum', 'manage_membergroups', 'manage_bans', 'send_mail', 'edit_news', 'manage_attachments', 'manage_smileys'));
- $context['allow_edit_profile'] = !$user_info['is_guest'] && allowedTo(array('profile_view_own', 'profile_view_any', 'profile_identity_own', 'profile_identity_any', 'profile_extra_own', 'profile_extra_any', 'profile_remove_own', 'profile_remove_any', 'moderate_forum', 'manage_membergroups', 'profile_title_own', 'profile_title_any'));
- $context['allow_memberlist'] = allowedTo('view_mlist');
- $context['allow_calendar'] = allowedTo('calendar_view') && !empty($modSettings['cal_enabled']);
- $context['allow_moderation_center'] = $context['user']['can_mod'];
- $context['allow_pm'] = allowedTo('pm_read');
- $cacheTime = $modSettings['lastActive'] * 60;
-
- if (($menu_buttons = cache_get_data('menu_buttons-' . implode('_', $user_info['groups']) . '-' . $user_info['language'], $cacheTime)) === null || time() - $cacheTime <= $modSettings['settings_updated'])
- {
- $buttons = array(
- 'home' => array(
- 'title' => $txt['home'],
- 'href' => $scripturl,
- 'show' => true,
- 'sub_buttons' => array(
- ),
- 'is_last' => $context['right_to_left'],
- ),
- 'help' => array(
- 'title' => $txt['help'],
- 'href' => $scripturl . '?action=help',
- 'show' => true,
- 'sub_buttons' => array(
- ),
- ),
- 'search' => array(
- 'title' => $txt['search'],
- 'href' => $scripturl . '?action=search',
- 'show' => $context['allow_search'],
- 'sub_buttons' => array(
- ),
- ),
- 'admin' => array(
- 'title' => $txt['admin'],
- 'href' => $scripturl . '?action=admin',
- 'show' => $context['allow_admin'],
- 'sub_buttons' => array(
- 'featuresettings' => array(
- 'title' => $txt['modSettings_title'],
- 'href' => $scripturl . '?action=admin;area=featuresettings',
- 'show' => allowedTo('admin_forum'),
- ),
- 'packages' => array(
- 'title' => $txt['package'],
- 'href' => $scripturl . '?action=admin;area=packages',
- 'show' => allowedTo('admin_forum'),
- ),
- 'errorlog' => array(
- 'title' => $txt['errlog'],
- 'href' => $scripturl . '?action=admin;area=logs;sa=errorlog;desc',
- 'show' => allowedTo('admin_forum') && !empty($modSettings['enableErrorLogging']),
- ),
- 'permissions' => array(
- 'title' => $txt['edit_permissions'],
- 'href' => $scripturl . '?action=admin;area=permissions',
- 'show' => allowedTo('manage_permissions'),
- 'is_last' => true,
- ),
- ),
- ),
- 'moderate' => array(
- 'title' => $txt['moderate'],
- 'href' => $scripturl . '?action=moderate',
- 'show' => $context['allow_moderation_center'],
- 'sub_buttons' => array(
- 'modlog' => array(
- 'title' => $txt['modlog_view'],
- 'href' => $scripturl . '?action=moderate;area=modlog',
- 'show' => !empty($modSettings['modlog_enabled']) && !empty($user_info['mod_cache']) && $user_info['mod_cache']['bq'] != '0=1',
- ),
- 'poststopics' => array(
- 'title' => $txt['mc_unapproved_poststopics'],
- 'href' => $scripturl . '?action=moderate;area=postmod;sa=posts',
- 'show' => $modSettings['postmod_active'] && !empty($user_info['mod_cache']['ap']),
- ),
- 'attachments' => array(
- 'title' => $txt['mc_unapproved_attachments'],
- 'href' => $scripturl . '?action=moderate;area=attachmod;sa=attachments',
- 'show' => $modSettings['postmod_active'] && !empty($user_info['mod_cache']['ap']),
- ),
- 'reports' => array(
- 'title' => $txt['mc_reported_posts'],
- 'href' => $scripturl . '?action=moderate;area=reports',
- 'show' => !empty($user_info['mod_cache']) && $user_info['mod_cache']['bq'] != '0=1',
- 'is_last' => true,
- ),
- ),
- ),
- 'profile' => array(
- 'title' => $txt['profile'],
- 'href' => $scripturl . '?action=profile',
- 'show' => $context['allow_edit_profile'],
- 'sub_buttons' => array(
- 'account' => array(
- 'title' => $txt['account'],
- 'href' => $scripturl . '?action=profile;area=account',
- 'show' => allowedTo(array('profile_identity_any', 'profile_identity_own', 'manage_membergroups')),
- ),
- 'profile' => array(
- 'title' => $txt['forumprofile'],
- 'href' => $scripturl . '?action=profile;area=forumprofile',
- 'show' => allowedTo(array('profile_extra_any', 'profile_extra_own')),
- 'is_last' => true,
- ),
- 'theme' => array(
- 'title' => $txt['theme'],
- 'href' => $scripturl . '?action=profile;area=theme',
- 'show' => allowedTo(array('profile_extra_any', 'profile_extra_own', 'profile_extra_any')),
- ),
- ),
- ),
- 'pm' => array(
- 'title' => $txt['pm_short'],
- 'href' => $scripturl . '?action=pm',
- 'show' => $context['allow_pm'],
- 'sub_buttons' => array(
- 'pm_read' => array(
- 'title' => $txt['pm_menu_read'],
- 'href' => $scripturl . '?action=pm',
- 'show' => allowedTo('pm_read'),
- ),
- 'pm_send' => array(
- 'title' => $txt['pm_menu_send'],
- 'href' => $scripturl . '?action=pm;sa=send',
- 'show' => allowedTo('pm_send'),
- 'is_last' => true,
- ),
- ),
- ),
- 'calendar' => array(
- 'title' => $txt['calendar'],
- 'href' => $scripturl . '?action=calendar',
- 'show' => $context['allow_calendar'],
- 'sub_buttons' => array(
- 'view' => array(
- 'title' => $txt['calendar_menu'],
- 'href' => $scripturl . '?action=calendar',
- 'show' => allowedTo('calendar_post'),
- ),
- 'post' => array(
- 'title' => $txt['calendar_post_event'],
- 'href' => $scripturl . '?action=calendar;sa=post',
- 'show' => allowedTo('calendar_post'),
- 'is_last' => true,
- ),
- ),
- ),
- 'mlist' => array(
- 'title' => $txt['members_title'],
- 'href' => $scripturl . '?action=mlist',
- 'show' => $context['allow_memberlist'],
- 'sub_buttons' => array(
- 'mlist_view' => array(
- 'title' => $txt['mlist_menu_view'],
- 'href' => $scripturl . '?action=mlist',
- 'show' => true,
- ),
- 'mlist_search' => array(
- 'title' => $txt['mlist_search'],
- 'href' => $scripturl . '?action=mlist;sa=search',
- 'show' => true,
- 'is_last' => true,
- ),
- ),
- ),
- 'login' => array(
- 'title' => $txt['login'],
- 'href' => $scripturl . '?action=login',
- 'show' => $user_info['is_guest'],
- 'sub_buttons' => array(
- ),
- ),
- 'register' => array(
- 'title' => $txt['register'],
- 'href' => $scripturl . '?action=register',
- 'show' => $user_info['is_guest'] && $context['can_register'],
- 'sub_buttons' => array(
- ),
- 'is_last' => !$context['right_to_left'],
- ),
- 'logout' => array(
- 'title' => $txt['logout'],
- 'href' => $scripturl . '?action=logout;%1$s=%2$s',
- 'show' => !$user_info['is_guest'],
- 'sub_buttons' => array(
- ),
- 'is_last' => !$context['right_to_left'],
- ),
- );
-
- call_integration_hook('integrate_menu_buttons', array(&$buttons));
-
- $menu_buttons = array();
- foreach ($buttons as $act => $button)
- if (!empty($button['show']))
- {
- $button['active_button'] = false;
-
- if (isset($button['action_hook']))
- $needs_action_hook = true;
-
- if (!empty($button['is_last']))
- {
- if (isset($last_button))
- unset($menu_buttons[$last_button]['is_last']);
- $last_button = $act;
- }
-
- if (!empty($button['sub_buttons']))
- foreach ($button['sub_buttons'] as $key => $subbutton)
- {
- if (empty($subbutton['show']))
- unset($button['sub_buttons'][$key]);
-
- if (!empty($subbutton['sub_buttons']))
- {
- foreach ($subbutton['sub_buttons'] as $key2 => $sub_button2)
- {
- if (empty($sub_button2['show']))
- unset($button['sub_buttons'][$key]['sub_buttons'][$key2]);
- }
- }
- }
- $menu_buttons[$act] = $button;
- }
- if (!empty($modSettings['cache_enable']) && $modSettings['cache_enable'] >= 2)
- cache_put_data('menu_buttons-' . implode('_', $user_info['groups']) . '-' . $user_info['language'], $menu_buttons, $cacheTime);
- }
- $context['menu_buttons'] = $menu_buttons;
-
- if (isset($context['menu_buttons']['logout']))
- $context['menu_buttons']['logout']['href'] = sprintf($context['menu_buttons']['logout']['href'], $context['session_var'], $context['session_id']);
-
-
- $current_action = 'home';
- if (isset($context['menu_buttons'][$context['current_action']]))
- $current_action = $context['current_action'];
- elseif ($context['current_action'] == 'search2')
- $current_action = 'search';
- elseif ($context['current_action'] == 'theme')
- $current_action = isset($_REQUEST['sa']) && $_REQUEST['sa'] == 'pick' ? 'profile' : 'admin';
- elseif ($context['current_action'] == 'register2')
- $current_action = 'register';
- elseif ($context['current_action'] == 'login2' || ($user_info['is_guest'] && $context['current_action'] == 'reminder'))
- $current_action = 'login';
- elseif ($context['current_action'] == 'groups' && $context['allow_moderation_center'])
- $current_action = 'moderate';
-
- if (!empty($needs_action_hook))
- call_integration_hook('integrate_current_action', array(&$current_action));
- if (isset($context['menu_buttons'][$current_action]))
- $context['menu_buttons'][$current_action]['active_button'] = true;
- if (!$user_info['is_guest'] && $context['user']['unread_messages'] > 0 && isset($context['menu_buttons']['pm']))
- {
- $context['menu_buttons']['pm']['alttitle'] = $context['menu_buttons']['pm']['title'] . ' [' . $context['user']['unread_messages'] . ']';
- $context['menu_buttons']['pm']['title'] .= ' [<strong>' . $context['user']['unread_messages'] . '</strong>]';
- }
- }
- function smf_seed_generator()
- {
- global $modSettings;
-
- if (empty($modSettings['rand_seed']))
- {
- $modSettings['rand_seed'] = microtime() * 1000000;
- updateSettings(array('rand_seed' => $modSettings['rand_seed']));
- }
-
- updateSettings(array('rand_seed' => mt_rand()));
- }
- function call_integration_hook($hook, $parameters = array())
- {
- global $modSettings, $settings, $boarddir, $sourcedir, $db_show_debug, $context;
- if ($db_show_debug === true)
- $context['debug']['hooks'][] = $hook;
- $results = array();
- if (empty($modSettings[$hook]))
- return $results;
- $functions = explode(',', $modSettings[$hook]);
-
- foreach ($functions as $function)
- {
- $function = trim($function);
- if (strpos($function, '::') !== false)
- {
- $call = explode('::', $function);
- if (strpos($call[1], ':') !== false)
- {
- list($func, $file) = explode(':', $call[1]);
- if (empty($settings['theme_dir']))
- $absPath = strtr(trim($file), array('$boarddir' => $boarddir, '$sourcedir' => $sourcedir));
- else
- $absPath = strtr(trim($file), array('$boarddir' => $boarddir, '$sourcedir' => $sourcedir, '$themedir' => $settings['theme_dir']));
- if (file_exists($absPath))
- require_once($absPath);
- $call = array($call[0], $func);
- }
- }
- else
- {
- $call = $function;
- if (strpos($function, ':') !== false)
- {
- list($func, $file) = explode(':', $function);
- if (empty($settings['theme_dir']))
- $absPath = strtr(trim($file), array('$boarddir' => $boarddir, '$sourcedir' => $sourcedir));
- else
- $absPath = strtr(trim($file), array('$boarddir' => $boarddir, '$sourcedir' => $sourcedir, '$themedir' => $settings['theme_dir']));
- if (file_exists($absPath))
- require_once($absPath);
- $call = $function;
- }
- }
-
- if (is_callable($call))
- $results[$function] = call_user_func_array($call, $parameters);
- }
- return $results;
- }
- function add_integration_function($hook, $function, $file = '', $permanent = true)
- {
- global $smcFunc, $modSettings;
- $integration_call = (!empty($file) && $file !== true) ? $function . ':' . $file : $function;
-
- if ($permanent)
- {
- $request = $smcFunc['db_query']('', '
- SELECT value
- FROM {db_prefix}settings
- WHERE variable = {string:variable}',
- array(
- 'variable' => $hook,
- )
- );
- list($current_functions) = $smcFunc['db_fetch_row']($request);
- $smcFunc['db_free_result']($request);
- if (!empty($current_functions))
- {
- $current_functions = explode(',', $current_functions);
- if (in_array($integration_call, $current_functions))
- return;
- $permanent_functions = array_merge($current_functions, array($integration_call));
- }
- else
- $permanent_functions = array($integration_call);
- updateSettings(array($hook => implode(',', $permanent_functions)));
- }
-
- $functions = empty($modSettings[$hook]) ? array() : explode(',', $modSettings[$hook]);
-
- if (in_array($integration_call, $functions))
- return;
- $functions[] = $integration_call;
- $modSettings[$hook] = implode(',', $functions);
- }
- function remove_integration_function($hook, $function, $file = '')
- {
- global $smcFunc, $modSettings;
- $integration_call = (!empty($file)) ? $function . ':' . $file : $function;
-
- $request = $smcFunc['db_query']('', '
- SELECT value
- FROM {db_prefix}settings
- WHERE variable = {string:variable}',
- array(
- 'variable' => $hook,
- )
- );
- list($current_functions) = $smcFunc['db_fetch_row']($request);
- $smcFunc['db_free_result']($request);
- if (!empty($current_functions))
- {
- $current_functions = explode(',', $current_functions);
- if (in_array($integration_call, $current_functions))
- updateSettings(array($hook => implode(',', array_diff($current_functions, array($integration_call)))));
- }
-
- $functions = empty($modSettings[$hook]) ? array() : explode(',', $modSettings[$hook]);
-
- if (!in_array($integration_call, $functions))
- return;
- $functions = array_diff($functions, array($integration_call));
- $modSettings[$hook] = implode(',', $functions);
- }
- function sanitizeMSCutPaste($string)
- {
- global $context;
- if (empty($string))
- return $string;
-
- $findchars_utf8 = array(
- "\xe2\80\x9a",
- "\xe2\80\x9e",
- "\xe2\80\xa6",
- "\xe2\x80\x98",
- "\xe2\x80\x99",
- "\xe2\x80\x9c",
- "\xe2\x80\x9d",
- "\xe2\x80\x93",
- "\xe2\x80\x94",
- );
-
- $findchars_iso = array(
- chr(130),
- chr(132),
- chr(133),
- chr(145),
- chr(146),
- chr(147),
- chr(148),
- chr(150),
- chr(151),
- );
-
- $replacechars = array(
- ',',
- ',,',
- '...',
- "'",
- "'",
- '"',
- '"',
- '-',
- '--',
- );
- if ($context['utf8'])
- $string = str_replace($findchars_utf8, $replacechars, $string);
- else
- $string = str_replace($findchars_iso, $replacechars, $string);
- return $string;
- }
|