script.js 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614
  1. var smf_formSubmitted = false;
  2. var lastKeepAliveCheck = new Date().getTime();
  3. var smf_editorArray = new Array();
  4. // Some very basic browser detection - from Mozilla's sniffer page.
  5. var ua = navigator.userAgent.toLowerCase();
  6. var is_opera = ua.indexOf('opera') != -1;
  7. var is_ff = (ua.indexOf('firefox') != -1 || ua.indexOf('iceweasel') != -1 || ua.indexOf('icecat') != -1 || ua.indexOf('shiretoko') != -1 || ua.indexOf('minefield') != -1) && !is_opera;
  8. var is_gecko = ua.indexOf('gecko') != -1 && !is_opera;
  9. var is_chrome = ua.indexOf('chrome') != -1;
  10. var is_safari = ua.indexOf('applewebkit') != -1 && !is_chrome;
  11. var is_webkit = ua.indexOf('applewebkit') != -1;
  12. var is_ie = ua.indexOf('msie') != -1 && !is_opera;
  13. var is_iphone = ua.indexOf('iphone') != -1 || ua.indexOf('ipod') != -1;
  14. var is_android = ua.indexOf('android') != -1;
  15. var ajax_indicator_ele = null;
  16. // Define XMLHttpRequest for IE
  17. if (!('XMLHttpRequest' in window) && 'ActiveXObject' in window)
  18. window.XMLHttpRequest = function () {
  19. return new ActiveXObject('MSXML2.XMLHTTP');
  20. };
  21. // Some older versions of Mozilla don't have this, for some reason.
  22. if (!('forms' in document))
  23. document.forms = document.getElementsByTagName('form');
  24. // Versions of ie < 9 do not have this built in
  25. if (!('getElementsByClassName' in document))
  26. {
  27. document.getElementsByClassName = function(className)
  28. {
  29. return $('".' + className + '"');
  30. }
  31. }
  32. // Load an XML document using XMLHttpRequest.
  33. function getXMLDocument(sUrl, funcCallback)
  34. {
  35. if (!window.XMLHttpRequest)
  36. return null;
  37. var oMyDoc = new XMLHttpRequest();
  38. var bAsync = typeof(funcCallback) != 'undefined';
  39. var oCaller = this;
  40. if (bAsync)
  41. {
  42. oMyDoc.onreadystatechange = function () {
  43. if (oMyDoc.readyState != 4)
  44. return;
  45. if (oMyDoc.responseXML != null && oMyDoc.status == 200)
  46. {
  47. if (funcCallback.call)
  48. {
  49. funcCallback.call(oCaller, oMyDoc.responseXML);
  50. }
  51. // A primitive substitute for the call method to support IE 5.0.
  52. else
  53. {
  54. oCaller.tmpMethod = funcCallback;
  55. oCaller.tmpMethod(oMyDoc.responseXML);
  56. delete oCaller.tmpMethod;
  57. }
  58. }
  59. };
  60. }
  61. oMyDoc.open('GET', sUrl, bAsync);
  62. oMyDoc.send(null);
  63. return oMyDoc;
  64. }
  65. // Send a post form to the server using XMLHttpRequest.
  66. function sendXMLDocument(sUrl, sContent, funcCallback)
  67. {
  68. if (!window.XMLHttpRequest)
  69. return false;
  70. var oSendDoc = new window.XMLHttpRequest();
  71. var oCaller = this;
  72. if (typeof(funcCallback) != 'undefined')
  73. {
  74. oSendDoc.onreadystatechange = function () {
  75. if (oSendDoc.readyState != 4)
  76. return;
  77. if (oSendDoc.responseXML != null && oSendDoc.status == 200)
  78. funcCallback.call(oCaller, oSendDoc.responseXML);
  79. else
  80. funcCallback.call(oCaller, false);
  81. };
  82. }
  83. oSendDoc.open('POST', sUrl, true);
  84. if ('setRequestHeader' in oSendDoc)
  85. oSendDoc.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  86. oSendDoc.send(sContent);
  87. return true;
  88. }
  89. // A property we'll be needing for php_to8bit.
  90. String.prototype.oCharsetConversion = {
  91. from: '',
  92. to: ''
  93. };
  94. // Convert a string to an 8 bit representation (like in PHP).
  95. String.prototype.php_to8bit = function ()
  96. {
  97. if (smf_charset == 'UTF-8')
  98. {
  99. var n, sReturn = '';
  100. for (var i = 0, iTextLen = this.length; i < iTextLen; i++)
  101. {
  102. n = this.charCodeAt(i);
  103. if (n < 128)
  104. sReturn += String.fromCharCode(n)
  105. else if (n < 2048)
  106. sReturn += String.fromCharCode(192 | n >> 6) + String.fromCharCode(128 | n & 63);
  107. else if (n < 65536)
  108. sReturn += String.fromCharCode(224 | n >> 12) + String.fromCharCode(128 | n >> 6 & 63) + String.fromCharCode(128 | n & 63);
  109. else
  110. sReturn += String.fromCharCode(240 | n >> 18) + String.fromCharCode(128 | n >> 12 & 63) + String.fromCharCode(128 | n >> 6 & 63) + String.fromCharCode(128 | n & 63);
  111. }
  112. return sReturn;
  113. }
  114. else if (this.oCharsetConversion.from.length == 0)
  115. {
  116. switch (smf_charset)
  117. {
  118. case 'ISO-8859-1':
  119. this.oCharsetConversion = {
  120. from: '\xa0-\xff',
  121. to: '\xa0-\xff'
  122. };
  123. break;
  124. case 'ISO-8859-2':
  125. this.oCharsetConversion = {
  126. from: '\xa0\u0104\u02d8\u0141\xa4\u013d\u015a\xa7\xa8\u0160\u015e\u0164\u0179\xad\u017d\u017b\xb0\u0105\u02db\u0142\xb4\u013e\u015b\u02c7\xb8\u0161\u015f\u0165\u017a\u02dd\u017e\u017c\u0154\xc1\xc2\u0102\xc4\u0139\u0106\xc7\u010c\xc9\u0118\xcb\u011a\xcd\xce\u010e\u0110\u0143\u0147\xd3\xd4\u0150\xd6\xd7\u0158\u016e\xda\u0170\xdc\xdd\u0162\xdf\u0155\xe1\xe2\u0103\xe4\u013a\u0107\xe7\u010d\xe9\u0119\xeb\u011b\xed\xee\u010f\u0111\u0144\u0148\xf3\xf4\u0151\xf6\xf7\u0159\u016f\xfa\u0171\xfc\xfd\u0163\u02d9',
  127. to: '\xa0-\xff'
  128. };
  129. break;
  130. case 'ISO-8859-5':
  131. this.oCharsetConversion = {
  132. from: '\xa0\u0401-\u040c\xad\u040e-\u044f\u2116\u0451-\u045c\xa7\u045e\u045f',
  133. to: '\xa0-\xff'
  134. };
  135. break;
  136. case 'ISO-8859-9':
  137. this.oCharsetConversion = {
  138. from: '\xa0-\xcf\u011e\xd1-\xdc\u0130\u015e\xdf-\xef\u011f\xf1-\xfc\u0131\u015f\xff',
  139. to: '\xa0-\xff'
  140. };
  141. break;
  142. case 'ISO-8859-15':
  143. this.oCharsetConversion = {
  144. from: '\xa0-\xa3\u20ac\xa5\u0160\xa7\u0161\xa9-\xb3\u017d\xb5-\xb7\u017e\xb9-\xbb\u0152\u0153\u0178\xbf-\xff',
  145. to: '\xa0-\xff'
  146. };
  147. break;
  148. case 'tis-620':
  149. this.oCharsetConversion = {
  150. from: '\u20ac\u2026\u2018\u2019\u201c\u201d\u2022\u2013\u2014\xa0\u0e01-\u0e3a\u0e3f-\u0e5b',
  151. to: '\x80\x85\x91-\x97\xa0-\xda\xdf-\xfb'
  152. };
  153. break;
  154. case 'windows-1251':
  155. this.oCharsetConversion = {
  156. from: '\u0402\u0403\u201a\u0453\u201e\u2026\u2020\u2021\u20ac\u2030\u0409\u2039\u040a\u040c\u040b\u040f\u0452\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u2122\u0459\u203a\u045a\u045c\u045b\u045f\xa0\u040e\u045e\u0408\xa4\u0490\xa6\xa7\u0401\xa9\u0404\xab-\xae\u0407\xb0\xb1\u0406\u0456\u0491\xb5-\xb7\u0451\u2116\u0454\xbb\u0458\u0405\u0455\u0457\u0410-\u044f',
  157. to: '\x80-\x97\x99-\xff'
  158. };
  159. break;
  160. case 'windows-1253':
  161. this.oCharsetConversion = {
  162. from: '\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u2030\u2039\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u2122\u203a\xa0\u0385\u0386\xa3-\xa9\xab-\xae\u2015\xb0-\xb3\u0384\xb5-\xb7\u0388-\u038a\xbb\u038c\xbd\u038e-\u03a1\u03a3-\u03ce',
  163. to: '\x80\x82-\x87\x89\x8b\x91-\x97\x99\x9b\xa0-\xa9\xab-\xd1\xd3-\xfe'
  164. };
  165. break;
  166. case 'windows-1255':
  167. this.oCharsetConversion = {
  168. from: '\u20ac\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u2039\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u02dc\u2122\u203a\xa0-\xa3\u20aa\xa5-\xa9\xd7\xab-\xb9\xf7\xbb-\xbf\u05b0-\u05b9\u05bb-\u05c3\u05f0-\u05f4\u05d0-\u05ea\u200e\u200f',
  169. to: '\x80\x82-\x89\x8b\x91-\x99\x9b\xa0-\xc9\xcb-\xd8\xe0-\xfa\xfd\xfe'
  170. };
  171. break;
  172. case 'windows-1256':
  173. this.oCharsetConversion = {
  174. from: '\u20ac\u067e\u201a\u0192\u201e\u2026\u2020\u2021\u02c6\u2030\u0679\u2039\u0152\u0686\u0698\u0688\u06af\u2018\u2019\u201c\u201d\u2022\u2013\u2014\u06a9\u2122\u0691\u203a\u0153\u200c\u200d\u06ba\xa0\u060c\xa2-\xa9\u06be\xab-\xb9\u061b\xbb-\xbe\u061f\u06c1\u0621-\u0636\xd7\u0637-\u063a\u0640-\u0643\xe0\u0644\xe2\u0645-\u0648\xe7-\xeb\u0649\u064a\xee\xef\u064b-\u064e\xf4\u064f\u0650\xf7\u0651\xf9\u0652\xfb\xfc\u200e\u200f\u06d2',
  175. to: '\x80-\xff'
  176. };
  177. break;
  178. default:
  179. this.oCharsetConversion = {
  180. from: '',
  181. to: ''
  182. };
  183. break;
  184. }
  185. var funcExpandString = function (sSearch) {
  186. var sInsert = '';
  187. for (var i = sSearch.charCodeAt(0), n = sSearch.charCodeAt(2); i <= n; i++)
  188. sInsert += String.fromCharCode(i);
  189. return sInsert;
  190. };
  191. this.oCharsetConversion.from = this.oCharsetConversion.from.replace(/.\-./g, funcExpandString);
  192. this.oCharsetConversion.to = this.oCharsetConversion.to.replace(/.\-./g, funcExpandString);
  193. }
  194. var sReturn = '', iOffsetFrom = 0;
  195. for (var i = 0, n = this.length; i < n; i++)
  196. {
  197. iOffsetFrom = this.oCharsetConversion.from.indexOf(this.charAt(i));
  198. sReturn += iOffsetFrom > -1 ? this.oCharsetConversion.to.charAt(iOffsetFrom) : (this.charCodeAt(i) > 127 ? '&#' + this.charCodeAt(i) + ';' : this.charAt(i));
  199. }
  200. return sReturn
  201. }
  202. // Character-level replacement function.
  203. String.prototype.php_strtr = function (sFrom, sTo)
  204. {
  205. return this.replace(new RegExp('[' + sFrom + ']', 'g'), function (sMatch) {
  206. return sTo.charAt(sFrom.indexOf(sMatch));
  207. });
  208. }
  209. // Simulate PHP's strtolower (in SOME cases PHP uses ISO-8859-1 case folding).
  210. String.prototype.php_strtolower = function ()
  211. {
  212. return typeof(smf_iso_case_folding) == 'boolean' && smf_iso_case_folding == true ? this.php_strtr(
  213. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ\x8a\x8c\x8e\x9f\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde',
  214. 'abcdefghijklmnopqrstuvwxyz\x9a\x9c\x9e\xff\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe'
  215. ) : this.php_strtr('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
  216. }
  217. String.prototype.php_urlencode = function()
  218. {
  219. return escape(this).replace(/\+/g, '%2b').replace('*', '%2a').replace('/', '%2f').replace('@', '%40');
  220. }
  221. String.prototype.php_htmlspecialchars = function()
  222. {
  223. return this.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
  224. }
  225. String.prototype.php_unhtmlspecialchars = function()
  226. {
  227. return this.replace(/&quot;/g, '"').replace(/&gt;/g, '>').replace(/&lt;/g, '<').replace(/&amp;/g, '&');
  228. }
  229. String.prototype.php_addslashes = function()
  230. {
  231. return this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'');
  232. }
  233. String.prototype._replaceEntities = function(sInput, sDummy, sNum)
  234. {
  235. return String.fromCharCode(parseInt(sNum));
  236. }
  237. String.prototype.removeEntities = function()
  238. {
  239. return this.replace(/&(amp;)?#(\d+);/g, this._replaceEntities);
  240. }
  241. String.prototype.easyReplace = function (oReplacements)
  242. {
  243. var sResult = this;
  244. for (var sSearch in oReplacements)
  245. sResult = sResult.replace(new RegExp('%' + sSearch + '%', 'g'), oReplacements[sSearch]);
  246. return sResult;
  247. }
  248. // Open a new window
  249. function reqWin(desktopURL, alternateWidth, alternateHeight, noScrollbars)
  250. {
  251. if ((alternateWidth && self.screen.availWidth * 0.8 < alternateWidth) || (alternateHeight && self.screen.availHeight * 0.8 < alternateHeight))
  252. {
  253. noScrollbars = false;
  254. alternateWidth = Math.min(alternateWidth, self.screen.availWidth * 0.8);
  255. alternateHeight = Math.min(alternateHeight, self.screen.availHeight * 0.8);
  256. }
  257. else
  258. noScrollbars = typeof(noScrollbars) == 'boolean' && noScrollbars == true;
  259. window.open(desktopURL, 'requested_popup', 'toolbar=no,location=no,status=no,menubar=no,scrollbars=' + (noScrollbars ? 'no' : 'yes') + ',width=' + (alternateWidth ? alternateWidth : 480) + ',height=' + (alternateHeight ? alternateHeight : 220) + ',resizable=no');
  260. // Return false so the click won't follow the link ;).
  261. return false;
  262. }
  263. // Open a overlay div
  264. function reqOverlayDiv(desktopURL, sHeader, sIcon)
  265. {
  266. // Set up our div details
  267. var sAjax_indicator = '<div class="centertext"><img src="' + smf_images_url + '/loading.gif" ></div>';
  268. var sIcon = smf_images_url + '/' + (typeof(sIcon) == 'string' ? sIcon : 'helptopics.png');
  269. var sHeader = typeof(sHeader) == 'string' ? sHeader : help_popup_heading_text;
  270. // Create the div that we are going to load
  271. var oContainer = new smc_Popup({heading: sHeader, content: sAjax_indicator, icon: sIcon});
  272. var oPopup_body = $('#' + oContainer.popup_id).find('.popup_content');
  273. // Load the help page content (we just want the text to show)
  274. $.ajax({
  275. url: desktopURL,
  276. type: "GET",
  277. dataType: "html",
  278. beforeSend: function () {
  279. },
  280. success: function (data, textStatus, xhr) {
  281. var help_content = $('<div id="temp_help">').html(data).find('a[href$="self.close();"]').hide().prev('br').hide().parent().html();
  282. oPopup_body.html(help_content);
  283. },
  284. error: function (xhr, textStatus, errorThrown) {
  285. oPopup_body.html(textStatus);
  286. }
  287. });
  288. return false;
  289. }
  290. // *** smc_Popup class.
  291. function smc_Popup(oOptions)
  292. {
  293. this.opt = oOptions;
  294. this.popup_id = this.opt.custom_id ? this.opt.custom_id : 'smf_popup';
  295. this.show();
  296. }
  297. smc_Popup.prototype.show = function ()
  298. {
  299. popup_class = 'popup_window ' + (this.opt.custom_class ? this.opt.custom_class : 'description');
  300. icon = this.opt.icon ? '<img src="' + this.opt.icon + '" class="icon" alt="" /> ' : '';
  301. // Create the div that will be shown
  302. $('body').append('<div id="' + this.popup_id + '" class="popup_container"><div class="' + popup_class + '"><div class="catbg popup_heading"><a href="javascript:void(0);" class="hide_popup"></a>' + icon + this.opt.heading + '</div><div class="popup_content">' + this.opt.content + '</div></div></div>');
  303. // Show it
  304. this.popup_body = $('#' + this.popup_id).children('.popup_window');
  305. this.popup_body.css({top: '25%', left: '50%', margin: '-' + ($(this.popup_body).height() / 2) + 'px 0 0 -' + ($(this.popup_body).width() / 2) + 'px'}).parent().fadeIn(300);
  306. // Trigger hide on escape or mouse click
  307. var popup_instance = this;
  308. $(document).mouseup(function (e) {
  309. if ($('#' + popup_instance.popup_id).has(e.target).length === 0)
  310. popup_instance.hide();
  311. }).keyup(function(e){
  312. if(e.keyCode == 27)
  313. popup_instance.hide();
  314. });
  315. $('#' + this.popup_id).find('.hide_popup').click(function (){ return popup_instance.hide(); });
  316. return false;
  317. }
  318. smc_Popup.prototype.hide = function ()
  319. {
  320. $('#' + this.popup_id).fadeOut(300, function(){ $(this).remove(); });
  321. return false;
  322. }
  323. // Remember the current position.
  324. function storeCaret(oTextHandle)
  325. {
  326. // Only bother if it will be useful.
  327. if ('createTextRange' in oTextHandle)
  328. oTextHandle.caretPos = document.selection.createRange().duplicate();
  329. }
  330. // Replaces the currently selected text with the passed text.
  331. function replaceText(text, oTextHandle)
  332. {
  333. // Attempt to create a text range (IE).
  334. if ('caretPos' in oTextHandle && 'createTextRange' in oTextHandle)
  335. {
  336. var caretPos = oTextHandle.caretPos;
  337. caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
  338. caretPos.select();
  339. }
  340. // Mozilla text range replace.
  341. else if ('selectionStart' in oTextHandle)
  342. {
  343. var begin = oTextHandle.value.substr(0, oTextHandle.selectionStart);
  344. var end = oTextHandle.value.substr(oTextHandle.selectionEnd);
  345. var scrollPos = oTextHandle.scrollTop;
  346. oTextHandle.value = begin + text + end;
  347. if (oTextHandle.setSelectionRange)
  348. {
  349. oTextHandle.focus();
  350. var goForward = is_opera ? text.match(/\n/g).length : 0;
  351. oTextHandle.setSelectionRange(begin.length + text.length + goForward, begin.length + text.length + goForward);
  352. }
  353. oTextHandle.scrollTop = scrollPos;
  354. }
  355. // Just put it on the end.
  356. else
  357. {
  358. oTextHandle.value += text;
  359. oTextHandle.focus(oTextHandle.value.length - 1);
  360. }
  361. }
  362. // Surrounds the selected text with text1 and text2.
  363. function surroundText(text1, text2, oTextHandle)
  364. {
  365. // Can a text range be created?
  366. if ('caretPos' in oTextHandle && 'createTextRange' in oTextHandle)
  367. {
  368. var caretPos = oTextHandle.caretPos, temp_length = caretPos.text.length;
  369. caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text1 + caretPos.text + text2 + ' ' : text1 + caretPos.text + text2;
  370. if (temp_length == 0)
  371. {
  372. caretPos.moveStart('character', -text2.length);
  373. caretPos.moveEnd('character', -text2.length);
  374. caretPos.select();
  375. }
  376. else
  377. oTextHandle.focus(caretPos);
  378. }
  379. // Mozilla text range wrap.
  380. else if ('selectionStart' in oTextHandle)
  381. {
  382. var begin = oTextHandle.value.substr(0, oTextHandle.selectionStart);
  383. var selection = oTextHandle.value.substr(oTextHandle.selectionStart, oTextHandle.selectionEnd - oTextHandle.selectionStart);
  384. var end = oTextHandle.value.substr(oTextHandle.selectionEnd);
  385. var newCursorPos = oTextHandle.selectionStart;
  386. var scrollPos = oTextHandle.scrollTop;
  387. oTextHandle.value = begin + text1 + selection + text2 + end;
  388. if (oTextHandle.setSelectionRange)
  389. {
  390. var goForward = is_opera ? text1.match(/\n/g).length : 0, goForwardAll = is_opera ? (text1 + text2).match(/\n/g).length : 0;
  391. if (selection.length == 0)
  392. oTextHandle.setSelectionRange(newCursorPos + text1.length + goForward, newCursorPos + text1.length + goForward);
  393. else
  394. oTextHandle.setSelectionRange(newCursorPos, newCursorPos + text1.length + selection.length + text2.length + goForwardAll);
  395. oTextHandle.focus();
  396. }
  397. oTextHandle.scrollTop = scrollPos;
  398. }
  399. // Just put them on the end, then.
  400. else
  401. {
  402. oTextHandle.value += text1 + text2;
  403. oTextHandle.focus(oTextHandle.value.length - 1);
  404. }
  405. }
  406. // Checks if the passed input's value is nothing.
  407. function isEmptyText(theField)
  408. {
  409. // Copy the value so changes can be made..
  410. if (typeof(theField) == 'string')
  411. var theValue = theField;
  412. else
  413. var theValue = theField.value;
  414. // Strip whitespace off the left side.
  415. while (theValue.length > 0 && (theValue.charAt(0) == ' ' || theValue.charAt(0) == '\t'))
  416. theValue = theValue.substring(1, theValue.length);
  417. // Strip whitespace off the right side.
  418. while (theValue.length > 0 && (theValue.charAt(theValue.length - 1) == ' ' || theValue.charAt(theValue.length - 1) == '\t'))
  419. theValue = theValue.substring(0, theValue.length - 1);
  420. if (theValue == '')
  421. return true;
  422. else
  423. return false;
  424. }
  425. // Only allow form submission ONCE.
  426. function submitonce(theform)
  427. {
  428. smf_formSubmitted = true;
  429. // If there are any editors warn them submit is coming!
  430. for (var i = 0; i < smf_editorArray.length; i++)
  431. smf_editorArray[i].doSubmit();
  432. }
  433. function submitThisOnce(oControl)
  434. {
  435. // oControl might also be a form.
  436. var oForm = 'form' in oControl ? oControl.form : oControl;
  437. var aTextareas = oForm.getElementsByTagName('textarea');
  438. for (var i = 0, n = aTextareas.length; i < n; i++)
  439. aTextareas[i].readOnly = true;
  440. return !smf_formSubmitted;
  441. }
  442. // Deprecated, as innerHTML is supported everywhere.
  443. function setInnerHTML(oElement, sToValue)
  444. {
  445. oElement.innerHTML = sToValue;
  446. }
  447. function getInnerHTML(oElement)
  448. {
  449. return oElement.innerHTML;
  450. }
  451. // Set the "outer" HTML of an element.
  452. function setOuterHTML(oElement, sToValue)
  453. {
  454. if ('outerHTML' in oElement)
  455. oElement.outerHTML = sToValue;
  456. else
  457. {
  458. var range = document.createRange();
  459. range.setStartBefore(oElement);
  460. oElement.parentNode.replaceChild(range.createContextualFragment(sToValue), oElement);
  461. }
  462. }
  463. // Checks for variable in theArray.
  464. function in_array(variable, theArray)
  465. {
  466. for (var i in theArray)
  467. if (theArray[i] == variable)
  468. return true;
  469. return false;
  470. }
  471. // Checks for variable in theArray.
  472. function array_search(variable, theArray)
  473. {
  474. for (var i in theArray)
  475. if (theArray[i] == variable)
  476. return i;
  477. return null;
  478. }
  479. // Find a specific radio button in its group and select it.
  480. function selectRadioByName(oRadioGroup, sName)
  481. {
  482. if (!('length' in oRadioGroup))
  483. return oRadioGroup.checked = true;
  484. for (var i = 0, n = oRadioGroup.length; i < n; i++)
  485. if (oRadioGroup[i].value == sName)
  486. return oRadioGroup[i].checked = true;
  487. return false;
  488. }
  489. function selectAllRadio(oInvertCheckbox, oForm, sMask, sValue)
  490. {
  491. for (var i = 0; i < oForm.length; i++)
  492. if (oForm[i].name != undefined && oForm[i].name.substr(0, sMask.length) == sMask && oForm[i].value == sValue)
  493. oForm[i].checked = true;
  494. }
  495. // Invert all checkboxes at once by clicking a single checkbox.
  496. function invertAll(oInvertCheckbox, oForm, sMask, bIgnoreDisabled)
  497. {
  498. for (var i = 0; i < oForm.length; i++)
  499. {
  500. if (!('name' in oForm[i]) || (typeof(sMask) == 'string' && oForm[i].name.substr(0, sMask.length) != sMask && oForm[i].id.substr(0, sMask.length) != sMask))
  501. continue;
  502. if (!oForm[i].disabled || (typeof(bIgnoreDisabled) == 'boolean' && bIgnoreDisabled))
  503. oForm[i].checked = oInvertCheckbox.checked;
  504. }
  505. }
  506. // Keep the session alive - always!
  507. var lastKeepAliveCheck = new Date().getTime();
  508. function smf_sessionKeepAlive()
  509. {
  510. var curTime = new Date().getTime();
  511. // Prevent a Firefox bug from hammering the server.
  512. if (smf_scripturl && curTime - lastKeepAliveCheck > 900000)
  513. {
  514. var tempImage = new Image();
  515. tempImage.src = smf_prepareScriptUrl(smf_scripturl) + 'action=keepalive;time=' + curTime;
  516. lastKeepAliveCheck = curTime;
  517. }
  518. window.setTimeout('smf_sessionKeepAlive();', 1200000);
  519. }
  520. window.setTimeout('smf_sessionKeepAlive();', 1200000);
  521. // Set a theme option through javascript.
  522. function smf_setThemeOption(option, value, theme, cur_session_id, cur_session_var, additional_vars)
  523. {
  524. // Compatibility.
  525. if (cur_session_id == null)
  526. cur_session_id = smf_session_id;
  527. if (typeof(cur_session_var) == 'undefined')
  528. cur_session_var = 'sesc';
  529. if (additional_vars == null)
  530. additional_vars = '';
  531. var tempImage = new Image();
  532. tempImage.src = smf_prepareScriptUrl(smf_scripturl) + 'action=jsoption;var=' + option + ';val=' + value + ';' + cur_session_var + '=' + cur_session_id + additional_vars + (theme == null ? '' : '&th=' + theme) + ';time=' + (new Date().getTime());
  533. }
  534. function smf_avatarResize()
  535. {
  536. var possibleAvatars = document.getElementsByTagName('img');
  537. for (var i = 0; i < possibleAvatars.length; i++)
  538. {
  539. var tempAvatars = []; j = 0;
  540. if (possibleAvatars[i].className != 'avatar')
  541. continue;
  542. // Image.prototype.avatar = possibleAvatars[i];
  543. tempAvatars[j] = new Image();
  544. tempAvatars[j].avatar = possibleAvatars[i];
  545. tempAvatars[j].onload = function()
  546. {
  547. this.avatar.width = this.width;
  548. this.avatar.height = this.height;
  549. if (smf_avatarMaxWidth != 0 && this.width > smf_avatarMaxWidth)
  550. {
  551. this.avatar.height = (smf_avatarMaxWidth * this.height) / this.width;
  552. this.avatar.width = smf_avatarMaxWidth;
  553. }
  554. if (smf_avatarMaxHeight != 0 && this.avatar.height > smf_avatarMaxHeight)
  555. {
  556. this.avatar.width = (smf_avatarMaxHeight * this.avatar.width) / this.avatar.height;
  557. this.avatar.height = smf_avatarMaxHeight;
  558. }
  559. }
  560. tempAvatars[j].src = possibleAvatars[i].src;
  561. j++;
  562. }
  563. if (typeof(window_oldAvatarOnload) != 'undefined' && window_oldAvatarOnload)
  564. {
  565. window_oldAvatarOnload();
  566. window_oldAvatarOnload = null;
  567. }
  568. }
  569. function hashLoginPassword(doForm, cur_session_id, token)
  570. {
  571. // Compatibility.
  572. if (cur_session_id == null)
  573. cur_session_id = smf_session_id;
  574. if (typeof(hex_sha1) == 'undefined')
  575. return;
  576. // Are they using an email address?
  577. if (doForm.user.value.indexOf('@') != -1)
  578. return;
  579. // Unless the browser is Opera, the password will not save properly.
  580. if (!('opera' in window))
  581. doForm.passwrd.autocomplete = 'off';
  582. doForm.hash_passwrd.value = hex_sha1(hex_sha1(doForm.user.value.php_to8bit().php_strtolower() + doForm.passwrd.value.php_to8bit()) + cur_session_id + token);
  583. // It looks nicer to fill it with asterisks, but Firefox will try to save that.
  584. if (is_ff != -1)
  585. doForm.passwrd.value = '';
  586. else
  587. doForm.passwrd.value = doForm.passwrd.value.replace(/./g, '*');
  588. }
  589. function hashAdminPassword(doForm, username, cur_session_id, token)
  590. {
  591. // Compatibility.
  592. if (cur_session_id == null)
  593. cur_session_id = smf_session_id;
  594. if (typeof(hex_sha1) == 'undefined')
  595. return;
  596. doForm.admin_hash_pass.value = hex_sha1(hex_sha1(username.php_to8bit().php_strtolower() + doForm.admin_pass.value.php_to8bit()) + cur_session_id + token);
  597. doForm.admin_pass.value = doForm.admin_pass.value.replace(/./g, '*');
  598. }
  599. function hashModeratePassword(doForm, username, cur_session_id, token)
  600. {
  601. if (typeof(hex_sha1) == 'undefined')
  602. return;
  603. doForm.moderate_hash_pass.value = hex_sha1(hex_sha1(username.php_to8bit().php_strtolower() + doForm.moderate_pass.value.php_to8bit()) + cur_session_id + token);
  604. doForm.moderate_pass.value = doForm.moderate_pass.value.replace(/./g, '*');
  605. }
  606. // Shows the page numbers by clicking the dots (in compact view).
  607. function expandPages(spanNode, baseURL, firstPage, lastPage, perPage)
  608. {
  609. var replacement = '', i, oldLastPage = 0;
  610. var perPageLimit = 50;
  611. // Prevent too many pages to be loaded at once.
  612. if ((lastPage - firstPage) / perPage > perPageLimit)
  613. {
  614. oldLastPage = lastPage;
  615. lastPage = firstPage + perPageLimit * perPage;
  616. }
  617. // Calculate the new pages.
  618. for (i = firstPage; i < lastPage; i += perPage)
  619. replacement += '<a class="navPages" href="' + baseURL.replace(/%1\$d/, i).replace(/%%/g, '%') + '">' + (1 + i / perPage) + '</a> ';
  620. if (oldLastPage > 0)
  621. replacement += '<span class="expand_pages" onclick="expandPages(this, \'' + baseURL + '\', ' + lastPage + ', ' + oldLastPage + ', ' + perPage + ');"> ... </span>';
  622. // Replace the dots by the new page links.
  623. setOuterHTML(spanNode, replacement);
  624. }
  625. function smc_preCacheImage(sSrc)
  626. {
  627. if (!('smc_aCachedImages' in window))
  628. window.smc_aCachedImages = [];
  629. if (!in_array(sSrc, window.smc_aCachedImages))
  630. {
  631. var oImage = new Image();
  632. oImage.src = sSrc;
  633. }
  634. }
  635. // *** smc_Cookie class.
  636. function smc_Cookie(oOptions)
  637. {
  638. this.opt = oOptions;
  639. this.oCookies = {};
  640. this.init();
  641. }
  642. smc_Cookie.prototype.init = function()
  643. {
  644. if ('cookie' in document && document.cookie != '')
  645. {
  646. var aCookieList = document.cookie.split(';');
  647. for (var i = 0, n = aCookieList.length; i < n; i++)
  648. {
  649. var aNameValuePair = aCookieList[i].split('=');
  650. this.oCookies[aNameValuePair[0].replace(/^\s+|\s+$/g, '')] = decodeURIComponent(aNameValuePair[1]);
  651. }
  652. }
  653. }
  654. smc_Cookie.prototype.get = function(sKey)
  655. {
  656. return sKey in this.oCookies ? this.oCookies[sKey] : null;
  657. }
  658. smc_Cookie.prototype.set = function(sKey, sValue)
  659. {
  660. document.cookie = sKey + '=' + encodeURIComponent(sValue);
  661. }
  662. // *** smc_Toggle class.
  663. function smc_Toggle(oOptions)
  664. {
  665. this.opt = oOptions;
  666. this.bCollapsed = false;
  667. this.oCookie = null;
  668. this.init();
  669. }
  670. smc_Toggle.prototype.init = function ()
  671. {
  672. // The master switch can disable this toggle fully.
  673. if ('bToggleEnabled' in this.opt && !this.opt.bToggleEnabled)
  674. return;
  675. // If cookies are enabled and they were set, override the initial state.
  676. if ('oCookieOptions' in this.opt && this.opt.oCookieOptions.bUseCookie)
  677. {
  678. // Initialize the cookie handler.
  679. this.oCookie = new smc_Cookie({});
  680. // Check if the cookie is set.
  681. var cookieValue = this.oCookie.get(this.opt.oCookieOptions.sCookieName)
  682. if (cookieValue != null)
  683. this.opt.bCurrentlyCollapsed = cookieValue == '1';
  684. }
  685. // If the init state is set to be collapsed, collapse it.
  686. if (this.opt.bCurrentlyCollapsed)
  687. this.changeState(true, true);
  688. // Initialize the images to be clickable.
  689. if ('aSwapImages' in this.opt)
  690. {
  691. for (var i = 0, n = this.opt.aSwapImages.length; i < n; i++)
  692. {
  693. var oImage = document.getElementById(this.opt.aSwapImages[i].sId);
  694. if (typeof(oImage) == 'object' && oImage != null)
  695. {
  696. // Display the image in case it was hidden.
  697. if (oImage.style.display == 'none')
  698. oImage.style.display = '';
  699. oImage.instanceRef = this;
  700. oImage.onclick = function () {
  701. this.instanceRef.toggle();
  702. this.blur();
  703. }
  704. oImage.style.cursor = 'pointer';
  705. // Preload the collapsed image.
  706. smc_preCacheImage(this.opt.aSwapImages[i].srcCollapsed);
  707. }
  708. }
  709. }
  710. // Initialize links.
  711. if ('aSwapLinks' in this.opt)
  712. {
  713. for (var i = 0, n = this.opt.aSwapLinks.length; i < n; i++)
  714. {
  715. var oLink = document.getElementById(this.opt.aSwapLinks[i].sId);
  716. if (typeof(oLink) == 'object' && oLink != null)
  717. {
  718. // Display the link in case it was hidden.
  719. if (oLink.style.display == 'none')
  720. oLink.style.display = '';
  721. oLink.instanceRef = this;
  722. oLink.onclick = function () {
  723. this.instanceRef.toggle();
  724. this.blur();
  725. return false;
  726. }
  727. }
  728. }
  729. }
  730. }
  731. // Collapse or expand the section.
  732. smc_Toggle.prototype.changeState = function(bCollapse, bInit)
  733. {
  734. // Default bInit to false.
  735. bInit = typeof(bInit) == 'undefined' ? false : true;
  736. // Handle custom function hook before collapse.
  737. if (!bInit && bCollapse && 'funcOnBeforeCollapse' in this.opt)
  738. {
  739. this.tmpMethod = this.opt.funcOnBeforeCollapse;
  740. this.tmpMethod();
  741. delete this.tmpMethod;
  742. }
  743. // Handle custom function hook before expand.
  744. else if (!bInit && !bCollapse && 'funcOnBeforeExpand' in this.opt)
  745. {
  746. this.tmpMethod = this.opt.funcOnBeforeExpand;
  747. this.tmpMethod();
  748. delete this.tmpMethod;
  749. }
  750. // Loop through all the images that need to be toggled.
  751. if ('aSwapImages' in this.opt)
  752. {
  753. for (var i = 0, n = this.opt.aSwapImages.length; i < n; i++)
  754. {
  755. var oImage = document.getElementById(this.opt.aSwapImages[i].sId);
  756. if (typeof(oImage) == 'object' && oImage != null)
  757. {
  758. // Only (re)load the image if it's changed.
  759. var sTargetSource = bCollapse ? this.opt.aSwapImages[i].srcCollapsed : this.opt.aSwapImages[i].srcExpanded;
  760. if (oImage.src != sTargetSource)
  761. oImage.src = sTargetSource;
  762. oImage.alt = oImage.title = bCollapse ? this.opt.aSwapImages[i].altCollapsed : this.opt.aSwapImages[i].altExpanded;
  763. }
  764. }
  765. }
  766. // Loop through all the links that need to be toggled.
  767. if ('aSwapLinks' in this.opt)
  768. {
  769. for (var i = 0, n = this.opt.aSwapLinks.length; i < n; i++)
  770. {
  771. var oLink = document.getElementById(this.opt.aSwapLinks[i].sId);
  772. if (typeof(oLink) == 'object' && oLink != null)
  773. setInnerHTML(oLink, bCollapse ? this.opt.aSwapLinks[i].msgCollapsed : this.opt.aSwapLinks[i].msgExpanded);
  774. }
  775. }
  776. // Now go through all the sections to be collapsed.
  777. for (var i = 0, n = this.opt.aSwappableContainers.length; i < n; i++)
  778. {
  779. if (this.opt.aSwappableContainers[i] == null)
  780. continue;
  781. var oContainer = document.getElementById(this.opt.aSwappableContainers[i]);
  782. if (typeof(oContainer) == 'object' && oContainer != null)
  783. {
  784. if (bCollapse)
  785. $(oContainer).slideUp();
  786. else
  787. $(oContainer).slideDown();
  788. }
  789. }
  790. // Update the new state.
  791. this.bCollapsed = bCollapse;
  792. // Update the cookie, if desired.
  793. if ('oCookieOptions' in this.opt && this.opt.oCookieOptions.bUseCookie)
  794. this.oCookie.set(this.opt.oCookieOptions.sCookieName, this.bCollapsed ? '1' : '0');
  795. if (!bInit && 'oThemeOptions' in this.opt && this.opt.oThemeOptions.bUseThemeSettings)
  796. smf_setThemeOption(this.opt.oThemeOptions.sOptionName, this.bCollapsed ? '1' : '0', 'sThemeId' in this.opt.oThemeOptions ? this.opt.oThemeOptions.sThemeId : null, smf_session_id, smf_session_var, 'sAdditionalVars' in this.opt.oThemeOptions ? this.opt.oThemeOptions.sAdditionalVars : null);
  797. }
  798. smc_Toggle.prototype.toggle = function()
  799. {
  800. // Change the state by reversing the current state.
  801. this.changeState(!this.bCollapsed);
  802. }
  803. function ajax_indicator(turn_on)
  804. {
  805. if (ajax_indicator_ele == null)
  806. {
  807. ajax_indicator_ele = document.getElementById('ajax_in_progress');
  808. if (ajax_indicator_ele == null && typeof(ajax_notification_text) != null)
  809. {
  810. create_ajax_indicator_ele();
  811. }
  812. }
  813. if (ajax_indicator_ele != null)
  814. {
  815. ajax_indicator_ele.style.display = turn_on ? 'block' : 'none';
  816. }
  817. }
  818. function create_ajax_indicator_ele()
  819. {
  820. // Create the div for the indicator.
  821. ajax_indicator_ele = document.createElement('div');
  822. // Set the id so it'll load the style properly.
  823. ajax_indicator_ele.id = 'ajax_in_progress';
  824. // Set the text. (Note: You MUST append here and not overwrite.)
  825. ajax_indicator_ele.innerHTML += ajax_notification_text;
  826. // Finally attach the element to the body.
  827. document.body.appendChild(ajax_indicator_ele);
  828. }
  829. function createEventListener(oTarget)
  830. {
  831. if (!('addEventListener' in oTarget))
  832. {
  833. if (oTarget.attachEvent)
  834. {
  835. oTarget.addEventListener = function (sEvent, funcHandler, bCapture) {
  836. oTarget.attachEvent('on' + sEvent, funcHandler);
  837. }
  838. oTarget.removeEventListener = function (sEvent, funcHandler, bCapture) {
  839. oTarget.detachEvent('on' + sEvent, funcHandler);
  840. }
  841. }
  842. else
  843. {
  844. oTarget.addEventListener = function (sEvent, funcHandler, bCapture) {
  845. oTarget['on' + sEvent] = funcHandler;
  846. }
  847. oTarget.removeEventListener = function (sEvent, funcHandler, bCapture) {
  848. oTarget['on' + sEvent] = null;
  849. }
  850. }
  851. }
  852. }
  853. // This function will retrieve the contents needed for the jump to boxes.
  854. function grabJumpToContent(elem)
  855. {
  856. var oXMLDoc = getXMLDocument(smf_prepareScriptUrl(smf_scripturl) + 'action=xmlhttp;sa=jumpto;xml');
  857. var aBoardsAndCategories = new Array();
  858. var bIE5x = !('implementation' in document);
  859. ajax_indicator(true);
  860. if (oXMLDoc.responseXML)
  861. {
  862. var items = oXMLDoc.responseXML.getElementsByTagName('smf')[0].getElementsByTagName('item');
  863. for (var i = 0, n = items.length; i < n; i++)
  864. {
  865. aBoardsAndCategories[aBoardsAndCategories.length] = {
  866. id: parseInt(items[i].getAttribute('id')),
  867. isCategory: items[i].getAttribute('type') == 'category',
  868. name: items[i].firstChild.nodeValue.removeEntities(),
  869. is_current: false,
  870. childLevel: parseInt(items[i].getAttribute('childlevel'))
  871. }
  872. }
  873. }
  874. ajax_indicator(false);
  875. for (var i = 0, n = aJumpTo.length; i < n; i++)
  876. aJumpTo[i].fillSelect(aBoardsAndCategories);
  877. if (bIE5x)
  878. elem.options[iIndexPointer].selected = true;
  879. // Internet Explorer needs this to keep the box dropped down.
  880. elem.style.width = 'auto';
  881. elem.focus();
  882. }
  883. // This'll contain all JumpTo objects on the page.
  884. var aJumpTo = new Array();
  885. // *** JumpTo class.
  886. function JumpTo(oJumpToOptions)
  887. {
  888. this.opt = oJumpToOptions;
  889. this.dropdownList = null;
  890. this.showSelect();
  891. }
  892. // Show the initial select box (onload). Method of the JumpTo class.
  893. JumpTo.prototype.showSelect = function ()
  894. {
  895. var sChildLevelPrefix = '';
  896. for (var i = this.opt.iCurBoardChildLevel; i > 0; i--)
  897. sChildLevelPrefix += this.opt.sBoardChildLevelIndicator;
  898. setInnerHTML(document.getElementById(this.opt.sContainerId), this.opt.sJumpToTemplate.replace(/%select_id%/, this.opt.sContainerId + '_select').replace(/%dropdown_list%/, '<select ' + (this.opt.bDisabled == true ? 'disabled="disabled" ' : '') + (this.opt.sClassName != undefined ? 'class="' + this.opt.sClassName + '" ' : '') + 'name="' + (this.opt.sCustomName != undefined ? this.opt.sCustomName : this.opt.sContainerId + '_select') + '" id="' + this.opt.sContainerId + '_select" ' + ('implementation' in document ? '' : 'onmouseover="grabJumpToContent(this);" ') + ('onbeforeactivate' in document ? 'onbeforeactivate' : 'onfocus') + '="grabJumpToContent(this);"><option value="' + (this.opt.bNoRedirect != undefined && this.opt.bNoRedirect == true ? this.opt.iCurBoardId : '?board=' + this.opt.iCurBoardId + '.0') + '">' + sChildLevelPrefix + this.opt.sBoardPrefix + this.opt.sCurBoardName.removeEntities() + '</option></select>&nbsp;' + (this.opt.sGoButtonLabel != undefined ? '<input type="button" class="button_submit" value="' + this.opt.sGoButtonLabel + '" onclick="window.location.href = \'' + smf_prepareScriptUrl(smf_scripturl) + 'board=' + this.opt.iCurBoardId + '.0\';" />' : '')));
  899. this.dropdownList = document.getElementById(this.opt.sContainerId + '_select');
  900. }
  901. // Fill the jump to box with entries. Method of the JumpTo class.
  902. JumpTo.prototype.fillSelect = function (aBoardsAndCategories)
  903. {
  904. var iIndexPointer = 0;
  905. // Create an option that'll be above and below the category.
  906. var oDashOption = document.createElement('option');
  907. oDashOption.appendChild(document.createTextNode(this.opt.sCatSeparator));
  908. oDashOption.disabled = 'disabled';
  909. oDashOption.value = '';
  910. if ('onbeforeactivate' in document)
  911. this.dropdownList.onbeforeactivate = null;
  912. else
  913. this.dropdownList.onfocus = null;
  914. if (this.opt.bNoRedirect)
  915. this.dropdownList.options[0].disabled = 'disabled';
  916. // Create a document fragment that'll allowing inserting big parts at once.
  917. var oListFragment = document.createDocumentFragment();
  918. // Loop through all items to be added.
  919. for (var i = 0, n = aBoardsAndCategories.length; i < n; i++)
  920. {
  921. var j, sChildLevelPrefix, oOption;
  922. // If we've reached the currently selected board add all items so far.
  923. if (!aBoardsAndCategories[i].isCategory && aBoardsAndCategories[i].id == this.opt.iCurBoardId)
  924. {
  925. this.dropdownList.insertBefore(oListFragment, this.dropdownList.options[0]);
  926. oListFragment = document.createDocumentFragment();
  927. continue;
  928. }
  929. if (aBoardsAndCategories[i].isCategory)
  930. oListFragment.appendChild(oDashOption.cloneNode(true));
  931. else
  932. for (j = aBoardsAndCategories[i].childLevel, sChildLevelPrefix = ''; j > 0; j--)
  933. sChildLevelPrefix += this.opt.sBoardChildLevelIndicator;
  934. oOption = document.createElement('option');
  935. oOption.appendChild(document.createTextNode((aBoardsAndCategories[i].isCategory ? this.opt.sCatPrefix : sChildLevelPrefix + this.opt.sBoardPrefix) + aBoardsAndCategories[i].name));
  936. if (!this.opt.bNoRedirect)
  937. oOption.value = aBoardsAndCategories[i].isCategory ? '#c' + aBoardsAndCategories[i].id : '?board=' + aBoardsAndCategories[i].id + '.0';
  938. else
  939. {
  940. if (aBoardsAndCategories[i].isCategory)
  941. oOption.disabled = 'disabled';
  942. else
  943. oOption.value = aBoardsAndCategories[i].id;
  944. }
  945. oListFragment.appendChild(oOption);
  946. if (aBoardsAndCategories[i].isCategory)
  947. oListFragment.appendChild(oDashOption.cloneNode(true));
  948. }
  949. // Add the remaining items after the currently selected item.
  950. this.dropdownList.appendChild(oListFragment);
  951. // Add an onchange action
  952. if (!this.opt.bNoRedirect)
  953. this.dropdownList.onchange = function() {
  954. if (this.selectedIndex > 0 && this.options[this.selectedIndex].value)
  955. window.location.href = smf_scripturl + this.options[this.selectedIndex].value.substr(smf_scripturl.indexOf('?') == -1 || this.options[this.selectedIndex].value.substr(0, 1) != '?' ? 0 : 1);
  956. }
  957. }
  958. // A global array containing all IconList objects.
  959. var aIconLists = new Array();
  960. // *** IconList object.
  961. function IconList(oOptions)
  962. {
  963. if (!window.XMLHttpRequest)
  964. return;
  965. this.opt = oOptions;
  966. this.bListLoaded = false;
  967. this.oContainerDiv = null;
  968. this.funcMousedownHandler = null;
  969. this.funcParent = this;
  970. this.iCurMessageId = 0;
  971. this.iCurTimeout = 0;
  972. // Add backwards compatibility with old themes.
  973. if (!('sSessionVar' in this.opt))
  974. this.opt.sSessionVar = 'sesc';
  975. this.initIcons();
  976. }
  977. // Replace all message icons by icons with hoverable and clickable div's.
  978. IconList.prototype.initIcons = function ()
  979. {
  980. for (var i = document.images.length - 1, iPrefixLength = this.opt.sIconIdPrefix.length; i >= 0; i--)
  981. if (document.images[i].id.substr(0, iPrefixLength) == this.opt.sIconIdPrefix)
  982. setOuterHTML(document.images[i], '<div title="' + this.opt.sLabelIconList + '" onclick="' + this.opt.sBackReference + '.openPopup(this, ' + document.images[i].id.substr(iPrefixLength) + ')" onmouseover="' + this.opt.sBackReference + '.onBoxHover(this, true)" onmouseout="' + this.opt.sBackReference + '.onBoxHover(this, false)" style="background: ' + this.opt.sBoxBackground + '; cursor: pointer; padding: 3px; text-align: center;"><img src="' + document.images[i].src + '" alt="' + document.images[i].alt + '" id="' + document.images[i].id + '" style="margin: 0px; padding: ' + (is_ie ? '3px' : '3px 0px 3px 0px') + ';" /></div>');
  983. }
  984. // Event for the mouse hovering over the original icon.
  985. IconList.prototype.onBoxHover = function (oDiv, bMouseOver)
  986. {
  987. oDiv.style.border = bMouseOver ? this.opt.iBoxBorderWidthHover + 'px solid ' + this.opt.sBoxBorderColorHover : '';
  988. oDiv.style.background = bMouseOver ? this.opt.sBoxBackgroundHover : this.opt.sBoxBackground;
  989. oDiv.style.padding = bMouseOver ? (3 - this.opt.iBoxBorderWidthHover) + 'px' : '3px'
  990. }
  991. // Show the list of icons after the user clicked the original icon.
  992. IconList.prototype.openPopup = function (oDiv, iMessageId)
  993. {
  994. this.iCurMessageId = iMessageId;
  995. if (!this.bListLoaded && this.oContainerDiv == null)
  996. {
  997. // Create a container div.
  998. this.oContainerDiv = document.createElement('div');
  999. this.oContainerDiv.id = 'iconList';
  1000. this.oContainerDiv.style.display = 'none';
  1001. this.oContainerDiv.style.cursor = 'pointer';
  1002. this.oContainerDiv.style.position = 'absolute';
  1003. this.oContainerDiv.style.background = this.opt.sContainerBackground;
  1004. this.oContainerDiv.style.border = this.opt.sContainerBorder;
  1005. this.oContainerDiv.style.padding = '6px 0px';
  1006. document.body.appendChild(this.oContainerDiv);
  1007. // Start to fetch its contents.
  1008. ajax_indicator(true);
  1009. sendXMLDocument.call(this, smf_prepareScriptUrl(smf_scripturl) + 'action=xmlhttp;sa=messageicons;board=' + this.opt.iBoardId + ';xml', '', this.onIconsReceived);
  1010. createEventListener(document.body);
  1011. }
  1012. // Set the position of the container.
  1013. var aPos = smf_itemPos(oDiv);
  1014. this.oContainerDiv.style.top = (aPos[1] + oDiv.offsetHeight) + 'px';
  1015. this.oContainerDiv.style.left = (aPos[0] - 1) + 'px';
  1016. this.oClickedIcon = oDiv;
  1017. if (this.bListLoaded)
  1018. this.oContainerDiv.style.display = 'block';
  1019. document.body.addEventListener('mousedown', this.onWindowMouseDown, false);
  1020. }
  1021. // Setup the list of icons once it is received through xmlHTTP.
  1022. IconList.prototype.onIconsReceived = function (oXMLDoc)
  1023. {
  1024. var icons = oXMLDoc.getElementsByTagName('smf')[0].getElementsByTagName('icon');
  1025. var sItems = '';
  1026. for (var i = 0, n = icons.length; i < n; i++)
  1027. sItems += '<span onmouseover="' + this.opt.sBackReference + '.onItemHover(this, true)" onmouseout="' + this.opt.sBackReference + '.onItemHover(this, false);" onmousedown="' + this.opt.sBackReference + '.onItemMouseDown(this, \'' + icons[i].getAttribute('value') + '\');" style="padding: 2px 3px; line-height: 20px; border: ' + this.opt.sItemBorder + '; background: ' + this.opt.sItemBackground + '"><img src="' + icons[i].getAttribute('url') + '" alt="' + icons[i].getAttribute('name') + '" title="' + icons[i].firstChild.nodeValue + '" style="vertical-align: middle" /></span>';
  1028. setInnerHTML(this.oContainerDiv, sItems);
  1029. this.oContainerDiv.style.display = 'block';
  1030. this.bListLoaded = true;
  1031. if (is_ie)
  1032. this.oContainerDiv.style.width = this.oContainerDiv.clientWidth + 'px';
  1033. ajax_indicator(false);
  1034. }
  1035. // Event handler for hovering over the icons.
  1036. IconList.prototype.onItemHover = function (oDiv, bMouseOver)
  1037. {
  1038. oDiv.style.background = bMouseOver ? this.opt.sItemBackgroundHover : this.opt.sItemBackground;
  1039. oDiv.style.border = bMouseOver ? this.opt.sItemBorderHover : this.opt.sItemBorder;
  1040. if (this.iCurTimeout != 0)
  1041. window.clearTimeout(this.iCurTimeout);
  1042. if (bMouseOver)
  1043. this.onBoxHover(this.oClickedIcon, true);
  1044. else
  1045. this.iCurTimeout = window.setTimeout(this.opt.sBackReference + '.collapseList();', 500);
  1046. }
  1047. // Event handler for clicking on one of the icons.
  1048. IconList.prototype.onItemMouseDown = function (oDiv, sNewIcon)
  1049. {
  1050. if (this.iCurMessageId != 0)
  1051. {
  1052. ajax_indicator(true);
  1053. this.tmpMethod = getXMLDocument;
  1054. var oXMLDoc = this.tmpMethod(smf_prepareScriptUrl(smf_scripturl) + 'action=jsmodify;topic=' + this.opt.iTopicId + ';msg=' + this.iCurMessageId + ';' + smf_session_var + '=' + smf_session_id + ';icon=' + sNewIcon + ';xml');
  1055. delete this.tmpMethod;
  1056. ajax_indicator(false);
  1057. var oMessage = oXMLDoc.responseXML.getElementsByTagName('smf')[0].getElementsByTagName('message')[0];
  1058. if (oMessage.getElementsByTagName('error').length == 0)
  1059. {
  1060. if (this.opt.bShowModify && oMessage.getElementsByTagName('modified').length != 0)
  1061. setInnerHTML(document.getElementById('modified_' + this.iCurMessageId), oMessage.getElementsByTagName('modified')[0].childNodes[0].nodeValue);
  1062. this.oClickedIcon.getElementsByTagName('img')[0].src = oDiv.getElementsByTagName('img')[0].src;
  1063. }
  1064. }
  1065. }
  1066. // Event handler for clicking outside the list (will make the list disappear).
  1067. IconList.prototype.onWindowMouseDown = function ()
  1068. {
  1069. for (var i = aIconLists.length - 1; i >= 0; i--)
  1070. {
  1071. aIconLists[i].funcParent.tmpMethod = aIconLists[i].collapseList;
  1072. aIconLists[i].funcParent.tmpMethod();
  1073. delete aIconLists[i].funcParent.tmpMethod;
  1074. }
  1075. }
  1076. // Collapse the list of icons.
  1077. IconList.prototype.collapseList = function()
  1078. {
  1079. this.onBoxHover(this.oClickedIcon, false);
  1080. this.oContainerDiv.style.display = 'none';
  1081. this.iCurMessageId = 0;
  1082. document.body.removeEventListener('mousedown', this.onWindowMouseDown, false);
  1083. }
  1084. // Handy shortcuts for getting the mouse position on the screen - only used for IE at the moment.
  1085. function smf_mousePose(oEvent)
  1086. {
  1087. var x = 0;
  1088. var y = 0;
  1089. if (oEvent.pageX)
  1090. {
  1091. y = oEvent.pageY;
  1092. x = oEvent.pageX;
  1093. }
  1094. else if (oEvent.clientX)
  1095. {
  1096. x = oEvent.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
  1097. y = oEvent.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
  1098. }
  1099. return [x, y];
  1100. }
  1101. // Short function for finding the actual position of an item.
  1102. function smf_itemPos(itemHandle)
  1103. {
  1104. var itemX = 0;
  1105. var itemY = 0;
  1106. if ('offsetParent' in itemHandle)
  1107. {
  1108. itemX = itemHandle.offsetLeft;
  1109. itemY = itemHandle.offsetTop;
  1110. while (itemHandle.offsetParent && typeof(itemHandle.offsetParent) == 'object')
  1111. {
  1112. itemHandle = itemHandle.offsetParent;
  1113. itemX += itemHandle.offsetLeft;
  1114. itemY += itemHandle.offsetTop;
  1115. }
  1116. }
  1117. else if ('x' in itemHandle)
  1118. {
  1119. itemX = itemHandle.x;
  1120. itemY = itemHandle.y;
  1121. }
  1122. return [itemX, itemY];
  1123. }
  1124. // This function takes the script URL and prepares it to allow the query string to be appended to it.
  1125. function smf_prepareScriptUrl(sUrl)
  1126. {
  1127. return sUrl.indexOf('?') == -1 ? sUrl + '?' : sUrl + (sUrl.charAt(sUrl.length - 1) == '?' || sUrl.charAt(sUrl.length - 1) == '&' || sUrl.charAt(sUrl.length - 1) == ';' ? '' : ';');
  1128. }
  1129. var aOnloadEvents = new Array();
  1130. function addLoadEvent(fNewOnload)
  1131. {
  1132. // If there's no event set, just set this one
  1133. if (typeof(fNewOnload) == 'function' && (!('onload' in window) || typeof(window.onload) != 'function'))
  1134. window.onload = fNewOnload;
  1135. // If there's just one event, setup the array.
  1136. else if (aOnloadEvents.length == 0)
  1137. {
  1138. aOnloadEvents[0] = window.onload;
  1139. aOnloadEvents[1] = fNewOnload;
  1140. window.onload = function() {
  1141. for (var i = 0, n = aOnloadEvents.length; i < n; i++)
  1142. {
  1143. if (typeof(aOnloadEvents[i]) == 'function')
  1144. aOnloadEvents[i]();
  1145. else if (typeof(aOnloadEvents[i]) == 'string')
  1146. eval(aOnloadEvents[i]);
  1147. }
  1148. }
  1149. }
  1150. // This isn't the first event function, add it to the list.
  1151. else
  1152. aOnloadEvents[aOnloadEvents.length] = fNewOnload;
  1153. }
  1154. function smfFooterHighlight(element, value)
  1155. {
  1156. element.src = smf_images_url + '/' + (value ? 'h_' : '') + element.id + '.png';
  1157. }
  1158. // Get the text in a code tag.
  1159. function smfSelectText(oCurElement, bActOnElement)
  1160. {
  1161. // The place we're looking for is one div up, and next door - if it's auto detect.
  1162. if (typeof(bActOnElement) == 'boolean' && bActOnElement)
  1163. var oCodeArea = document.getElementById(oCurElement);
  1164. else
  1165. var oCodeArea = oCurElement.parentNode.nextSibling;
  1166. if (typeof(oCodeArea) != 'object' || oCodeArea == null)
  1167. return false;
  1168. // Start off with my favourite, internet explorer.
  1169. if ('createTextRange' in document.body)
  1170. {
  1171. var oCurRange = document.body.createTextRange();
  1172. oCurRange.moveToElementText(oCodeArea);
  1173. oCurRange.select();
  1174. }
  1175. // Firefox at el.
  1176. else if (window.getSelection)
  1177. {
  1178. var oCurSelection = window.getSelection();
  1179. // Safari is special!
  1180. if (oCurSelection.setBaseAndExtent)
  1181. {
  1182. var oLastChild = oCodeArea.lastChild;
  1183. oCurSelection.setBaseAndExtent(oCodeArea, 0, oLastChild, 'innerText' in oLastChild ? oLastChild.innerText.length : oLastChild.textContent.length);
  1184. }
  1185. else
  1186. {
  1187. var curRange = document.createRange();
  1188. curRange.selectNodeContents(oCodeArea);
  1189. oCurSelection.removeAllRanges();
  1190. oCurSelection.addRange(curRange);
  1191. }
  1192. }
  1193. return false;
  1194. }
  1195. // A function needed to discern HTML entities from non-western characters.
  1196. function smc_saveEntities(sFormName, aElementNames, sMask)
  1197. {
  1198. if (typeof(sMask) == 'string')
  1199. {
  1200. for (var i = 0, n = document.forms[sFormName].elements.length; i < n; i++)
  1201. if (document.forms[sFormName].elements[i].id.substr(0, sMask.length) == sMask)
  1202. aElementNames[aElementNames.length] = document.forms[sFormName].elements[i].name;
  1203. }
  1204. for (var i = 0, n = aElementNames.length; i < n; i++)
  1205. {
  1206. if (aElementNames[i] in document.forms[sFormName])
  1207. document.forms[sFormName][aElementNames[i]].value = document.forms[sFormName][aElementNames[i]].value.replace(/&#/g, '&#38;#');
  1208. }
  1209. }
  1210. // A function used to clean the attachments on post page
  1211. function cleanFileInput(idElement)
  1212. {
  1213. // Simpler solutions work in Opera, IE, Safari and Chrome.
  1214. if (is_opera || is_ie || is_safari || is_chrome)
  1215. {
  1216. document.getElementById(idElement).outerHTML = document.getElementById(idElement).outerHTML;
  1217. }
  1218. // What else can we do? By the way, this doesn't work in Chrome and Mac's Safari.
  1219. else
  1220. {
  1221. document.getElementById(idElement).type = 'input';
  1222. document.getElementById(idElement).type = 'file';
  1223. }
  1224. }
  1225. function applyWindowClasses(oList)
  1226. {
  1227. var bAlternate = false;
  1228. oListItems = oList.getElementsByTagName("LI");
  1229. for (i = 0; i < oListItems.length; i++)
  1230. {
  1231. // Skip dummies.
  1232. if (oListItems[i].id == "")
  1233. continue;
  1234. oListItems[i].className = "windowbg" + (bAlternate ? "2" : "");
  1235. bAlternate = !bAlternate;
  1236. }
  1237. }
  1238. function reActivate()
  1239. {
  1240. document.forms.postmodify.message.readOnly = false;
  1241. }
  1242. // The actual message icon selector.
  1243. function showimage()
  1244. {
  1245. document.images.icons.src = icon_urls[document.forms.postmodify.icon.options[document.forms.postmodify.icon.selectedIndex].value];
  1246. }
  1247. function pollOptions()
  1248. {
  1249. var expire_time = document.getElementById('poll_expire');
  1250. if (isEmptyText(expire_time) || expire_time.value == 0)
  1251. {
  1252. document.forms.postmodify.poll_hide[2].disabled = true;
  1253. if (document.forms.postmodify.poll_hide[2].checked)
  1254. document.forms.postmodify.poll_hide[1].checked = true;
  1255. }
  1256. else
  1257. document.forms.postmodify.poll_hide[2].disabled = false;
  1258. }
  1259. function generateDays(offset)
  1260. {
  1261. // Work around JavaScript's lack of support for default values...
  1262. offset = typeof(offset) != 'undefined' ? offset : 0;
  1263. var days = 0, selected = 0;
  1264. var dayElement = document.getElementById("day" + offset), yearElement = document.getElementById("year" + offset), monthElement = document.getElementById("month" + offset);
  1265. monthLength[1] = 28;
  1266. if (yearElement.options[yearElement.selectedIndex].value % 4 == 0)
  1267. monthLength[1] = 29;
  1268. selected = dayElement.selectedIndex;
  1269. while (dayElement.options.length)
  1270. dayElement.options[0] = null;
  1271. days = monthLength[monthElement.value - 1];
  1272. for (i = 1; i <= days; i++)
  1273. dayElement.options[dayElement.length] = new Option(i, i);
  1274. if (selected < days)
  1275. dayElement.selectedIndex = selected;
  1276. }
  1277. function toggleLinked(form)
  1278. {
  1279. form.board.disabled = !form.link_to_board.checked;
  1280. }
  1281. function initSearch()
  1282. {
  1283. if (document.forms.searchform.search.value.indexOf("%u") != -1)
  1284. document.forms.searchform.search.value = unescape(document.forms.searchform.search.value);
  1285. }
  1286. function selectBoards(ids, aFormID)
  1287. {
  1288. var toggle = true;
  1289. var aForm = document.getElementById(aFormID);
  1290. for (i = 0; i < ids.length; i++)
  1291. toggle = toggle & aForm["brd" + ids[i]].checked;
  1292. for (i = 0; i < ids.length; i++)
  1293. aForm["brd" + ids[i]].checked = !toggle;
  1294. }
  1295. function expandCollapseBoards()
  1296. {
  1297. var current = document.getElementById("searchBoardsExpand").style.display != "none";
  1298. $("#searchBoardsExpand").slideToggle(300);
  1299. document.getElementById("expandBoardsIcon").src = smf_images_url + (current ? "/expand.png" : "/collapse.png");
  1300. }
  1301. function expandCollapseLabels()
  1302. {
  1303. var current = document.getElementById("searchLabelsExpand").style.display != "none";
  1304. $("#searchLabelsExpand").slideToggle();
  1305. document.getElementById("expandLabelsIcon").src = smf_images_url + (current ? "/expand.png" : "/collapse.png");
  1306. }
  1307. function updateRuleDef(optNum)
  1308. {
  1309. if (document.getElementById("ruletype" + optNum).value == "gid")
  1310. {
  1311. document.getElementById("defdiv" + optNum).style.display = "none";
  1312. document.getElementById("defseldiv" + optNum).style.display = "";
  1313. }
  1314. else if (document.getElementById("ruletype" + optNum).value == "bud" || document.getElementById("ruletype" + optNum).value == "")
  1315. {
  1316. document.getElementById("defdiv" + optNum).style.display = "none";
  1317. document.getElementById("defseldiv" + optNum).style.display = "none";
  1318. }
  1319. else
  1320. {
  1321. document.getElementById("defdiv" + optNum).style.display = "";
  1322. document.getElementById("defseldiv" + optNum).style.display = "none";
  1323. }
  1324. }
  1325. function updateActionDef(optNum)
  1326. {
  1327. if (document.getElementById("acttype" + optNum).value == "lab")
  1328. {
  1329. document.getElementById("labdiv" + optNum).style.display = "";
  1330. }
  1331. else
  1332. {
  1333. document.getElementById("labdiv" + optNum).style.display = "none";
  1334. }
  1335. }
  1336. function updateAuthMethod()
  1337. {
  1338. // What authentication method is being used?
  1339. if (!document.getElementById("auth_openid") || !document.getElementById("auth_openid").checked)
  1340. currentAuthMethod = "passwd";
  1341. else
  1342. currentAuthMethod = "openid";
  1343. // No openID?
  1344. if (!document.getElementById("auth_openid"))
  1345. return true;
  1346. document.forms.creator.openid_url.disabled = currentAuthMethod == "openid" ? false : true;
  1347. document.forms.creator.smf_autov_pwmain.disabled = currentAuthMethod == "passwd" ? false : true;
  1348. document.forms.creator.smf_autov_pwverify.disabled = currentAuthMethod == "passwd" ? false : true;
  1349. document.getElementById("smf_autov_pwmain_div").style.display = currentAuthMethod == "passwd" ? "" : "none";
  1350. document.getElementById("smf_autov_pwverify_div").style.display = currentAuthMethod == "passwd" ? "" : "none";
  1351. if (currentAuthMethod == "passwd")
  1352. {
  1353. verificationHandle.refreshMainPassword();
  1354. verificationHandle.refreshVerifyPassword();
  1355. document.forms.creator.openid_url.style.backgroundColor = "";
  1356. document.getElementById("auth_openid_div").style.display = "none";
  1357. document.getElementById("auth_pass_div").style.display = "";
  1358. }
  1359. else
  1360. {
  1361. document.forms.creator.smf_autov_pwmain.style.backgroundColor ="";
  1362. document.forms.creator.smf_autov_pwverify.style.backgroundColor = "";
  1363. document.forms.creator.openid_url.style.backgroundColor = "#FCE184";
  1364. document.getElementById("auth_openid_div").style.display = "";
  1365. document.getElementById("auth_pass_div").style.display = "none";
  1366. }
  1367. }