2010-01-09, 15:18 | Link #21 |
Spoilaphobic
Join Date: Jan 2009
Location: USA
Age: 37
|
You had some decent suggestions in the beginning but changing thread to topic is redundant. They are synonyms and both serve the same purpose. Neither one is more suited for an anime site than the other.
Oh, and why on earth would you not want spoiler tags to remain inside a quote? They are there for a reason and removing them is defeats their purpose all together. You should make yourself your own forum some where and change everything on there. All of your topics are going to be locked right away and worst case, you are going to get yourself banned. So save yourself all the time and effort you've spent with these suggestions and stop.
__________________
|
2010-01-09, 16:09 | Link #22 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
You are quick to draw conclusions.
I'm not telling them to do it like that, I'm just pointing out they could do it like that. As far as I'm concern suggestions are still feedback more or less. And I could do what you say but this is more fun right now; I have strange way to amuse myself when somewhat bored. Concerning the thread thing, go ask your not so geeky friends what they think the word "thread" means and then ask them what they think a "topic" means, and the answer might surprise you. With regard to the quote thing; people seem to trip over it each day someone posts a spoiler. To be exact there is this pesky spoiler policy thing, and it forbids quoting spoilers. Your average scenario is someone posts a spoiler in the sections of the forum where they are not allowed (which is around 80% of the forum that actually requires spoiler tag usage to being with) and next there are 2 or more posters that quote said troublemaker post and spell out the rules... thus propagating damage. Of course after a mod comes along and deletes all the posts including any that quoted and gives the "use report button" post (sometimes), but given this still happens all too often you can see where the idea to just prevent them from quoting comes in. Anyway, why so serious? I'm not hurting anybody am I.
__________________
|
2010-01-11, 21:37 | Link #23 |
ひきこもりアイドル
IT Support
Join Date: Feb 2009
Location: Pennsylvania , United States
Age: 34
|
Well, time to time, I use my iPhone 3GS to browse on the forums and also make some posts. Although it loads fine, it's quite difficult to make a post since the style isn't iPhone optimized and I need to scroll and zoom in to read whats on the page.
I think that vBulletin has some kind of plugin that detects a smart phone browser like Mobile Safari or Chrome on Android so it will view a more optimized page on the phone. As smartphones are getting more popular, it wouldn't hurt much to have a optimized site for these devices.
__________________
|
2010-01-11, 22:11 | Link #24 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
You are talking about TapaTalk? Its the only one I know of that has support range for: iPhone, Blackberry, Nokia, Android. Forum-wise there's phpbb and vbulletin. Support for vBulletin is from 3.7 to the latest 4.0 but I am not sure; its a sort of mirror I think and you will need a client or such to use it (as far as I understand; no hands on experience sorry).
Is this the one?
__________________
|
2010-01-12, 12:41 | Link #25 |
ひきこもりアイドル
IT Support
Join Date: Feb 2009
Location: Pennsylvania , United States
Age: 34
|
That might be nice, but not what I'm looking for. Something simular to WPTouch Wordpress Theme that allows you to view a mobile version of the website in a web browser optimized for iPhone, Android, etc without using a third party application.
__________________
|
2010-01-12, 12:58 | Link #26 |
Spoilaphobic
Join Date: Jan 2009
Location: USA
Age: 37
|
You need a new style, not a plug in.
For now, you could try the Archive. All of the replies are loaded in one page and you'll have to view the full version to reply though. I would suggest disabling all of the avatar and signatures and image loading on your device, it may help a little.
__________________
|
2010-01-18, 19:40 | Link #27 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
+1
__________________
|
2010-01-18, 20:43 | Link #28 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
+2
__________________
|
2010-01-20, 00:42 | Link #30 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
+2
__________________
|
2010-01-20, 22:09 | Link #31 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
+1 cloaked issue
__________________
|
2010-01-31, 00:09 | Link #32 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
+1 safe-guard
Its been suggested (and rightfully so) the vb4 upgrade can be undesirable, so how about:
__________________
|
2010-02-07, 02:33 | Link #33 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
+1 spoiler tag suggestion
__________________
Last edited by felix; 2010-02-11 at 15:58. Reason: remebered the right name for it |
2010-02-15, 16:38 | Link #35 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
Contents
* jQuery Plug-in Code * Integarting with vBulletin 4.0.1 A little better code for the example on post #33 (the one before the above). Also included vBulleting 4.0.1 integration code. Spoiler for changes:
Screenshots: Spoiler for screeny1:
Spoiler for screeny2:
Spoiler for screeny3:
Spoiler for screeny4:
jQuery Plug-in Code The following snippet are the default settings (you just overwrite them if you need something else). They will work fine as is on vBulletin 4.0.1 Code:
{ key: 'h1', animation: { open: '350', fadein: 1000 }, theme: 'modern', use: { scan: true, local: true, global: true, colorCodes: true, css: true, animation: true }, color: { normal: '#fdf8f0', holder: '#aaaabe', speculation: '#9b6', danger: '#e86', link: '#666' }, text: { close: 'Close', open: 'Open', scan: 'Scan', localeYes: 'on', localeNo: 'off' }, tag: { wrapper: 'spoilerWrapper', controls: 'spoilerControls', title: 'spoilerTitle', toggle: 'spoilerToggle', scan: 'spoilerScan', local: 'spoilerToggleLocal', global: 'spoilerToggleGlobal', info: 'spoilerInfo' }, scan: { badWords: [/(death|died|ends|kill)/gi, /(lost|loose|defeat|win|won|victory|victorious)/gi] }, type: { holder: { tag: 'holder', key: /(list|voice actor|seyu|wallpaper|image|hide|space|more|avatar|signature|nsfw|creation)/gi }, speculation: { tag: 'speculation', key: /(speculation|synopsis|guess|theory|epi|ep|episode)/gi }, danger: { tag: 'danger', key: /(spoiler|major|plot|future)/gi } }, cookiePrefix: '' }; Code:
$('.spoiler').spoilme({theme: 'legacy', use: {scan: false, local: false, global: false} }); SpoilMe[Not] Plug-in code... Code:
/** * spoilMe[not] -- jQuery plug-in * */ /** * Minimalistic spoiler tag implementation. * * @example $('.spoiler').spoilme(); * @desc Create a spoiler tag on set element(s) * @example $('.spoiler').spoilme({use: {local: false, global: false, scan: false}}); * @desc Create spoiler, but disable most options. */ (function ($) { $.fn.spoilme = function (options) { var spoilers = $(this); var config = $.extend(true, $.fn.spoilme.defaults, options); // shorthand var button = $.fn.spoilme.button; // do we have cookie support? if (typeof $.cookie == 'undefined') { config.use.local = false; config.use.global = false; } var target = '.' + $.trim($(this).attr('class').replace(/ /, '.')); $.fn.spoilme.attachCSS(config, target); var key = $.fn.spoilme.pack($(config.key).text().toLowerCase().replace(/[^a-z ]/gi, '')); // cycle though all of the spoiler tags spoilers.each(function () { var context = $(this); /* style the tag */ if (config.theme == 'modern') { $.fn.spoilme.styleModern(context, config); } else if (config.theme == 'legacy') { $.fn.spoilme.styleLegacy(context, config); } else if (typeof config.theme == 'function') { config.theme(context, config); } else { $.fn.spoilme.styleModern(context, config); } // name of the spoiler tag -- compressed -- gives us the entry; since its hashed we don't // have to worry about people accidently breaking syntax var spoilerTitle = context.attr('title'); var cookieName = $.fn.spoilme.cookieName(context); var shortName = $.fn.spoilme.shortName(context); // the basic Open/Close event $(this).children('.' + config.tag.controls).find('.' + config.tag.toggle).click(function (event) { $.fn.spoilme.toggleTag(context, config); event.preventDefault(); }); // interpret the spoiler for the user if (config.use.scan) { $(this).children('.' + config.tag.controls).find('.' + config.tag.scan).click(function (event) { // get the contents, we'll just ignore any html in there and get it all. var alt = context.find('.' + config.tag.wrapper + ':first') .clone(); alt.find('.' + config.tag.controls) .remove(); var words = alt.text().toLowerCase() .replace(/[\n\r]/gi, ' ') .split(' '); var wordCount = 0; var badWordCount = 0; // words are anything with more then 2 characters for (var i = 0, size = words.length; i < size; ++i) { if ($.trim(words[i]).length > 2) { for (var j = 0, size_badies = config.scan.badWords.length; j < size_badies; j++) { if (words[i].match(config.scan.badWords[j])) { badWordCount++; } } wordCount++; } } var imageCount = 0; context.find('.' + config.tag.wrapper + ':first').find('img').each(function () { // we determine if the image is not a smilie, icon, thumbnail etc if ($.fn.spoilme.isBadImage($(this))) { imageCount++; } }); var info = 'There ' + (wordCount != 1 ? 'are ' : 'is ') + wordCount + (wordCount != 1 ? ' words' : ' word') + ' out of which ' + badWordCount + ' potentially bad.' + (imageCount !== 0 ? ' There ' + (imageCount != 1 ? 'are ' : 'is ') + 'also ' + imageCount + ' potential spoiler ' + (imageCount != 1 ? 'images.' : 'image.') : ''); $.fn.spoilme.notify(context, info, config); event.preventDefault(); }); } if (config.use.local) { // toggle default behaviour of everything that shares the title (on this page) $(this).children('.' + config.tag.controls).find('.' + config.tag.local).click(function (event) { var cookieName = $.fn.spoilme.cookieName(context); var shortName = $.fn.spoilme.shortName(context); var buttonText = button($(this), config); if (buttonText == config.text.localeYes) { // local is set to open, so we need to close it up $.cookie(config.cookiePrefix + 'local' + key + cookieName, null); // we first delete the entry // and we reflect the new change; everything sets to close spoilers.each(function () { if (shortName == $.fn.spoilme.shortName($(this))) { var localButton = $(this).children('.' + config.tag.controls).find('.' + config.tag.local); button(localButton, config, config.text.localeNo); $.fn.spoilme.closeTag($(this), config); } }); } else if (buttonText == config.text.localeNo) { // local is set to close, so we need to open it up $.cookie(config.cookiePrefix + 'local' + key + cookieName, 'open'); // we reflect the new change; everything sets to open spoilers.each(function () { if (shortName == $.fn.spoilme.shortName($(this))) { var localButton = $(this).children('.' + config.tag.controls).find('.' + config.tag.local); button(localButton, config, config.text.localeYes); $.fn.spoilme.openTag($(this), config); } }); } event.preventDefault(); }); } if (config.use.global) { // toggle default behaviour of everything that shares the title (on this page) $(this).children('.' + config.tag.controls).find('.' + config.tag.global).click(function (event) { var cookieName = $.fn.spoilme.cookieName(context); var shortName = $.fn.spoilme.shortName(context); var buttonText = button($(this), config); if (buttonText == config.text.localeYes) { // local is set to open, so we need to close it up $.cookie(config.cookiePrefix + 'global' + cookieName, null); // we first delete the entry // and we reflect the new change; everything sets to close spoilers.each(function () { if (shortName == $.fn.spoilme.shortName($(this))) { var globalButton = $(this).children('.' + config.tag.controls).find('.' + config.tag.global); button(globalButton, config, config.text.localeNo); $.fn.spoilme.closeTag($(this), config); } }); } else if (buttonText == config.text.localeNo) { // local is set to close, so we need to open it up $.cookie(config.cookiePrefix + 'global' + cookieName, 'open'); // we reflect the new change; everything sets to open spoilers.each(function () { if (shortName == $.fn.spoilme.shortName($(this))) { var globalButton = $(this).children('.' + config.tag.controls).find('.' + config.tag.global); button(globalButton, config, config.text.localeYes); $.fn.spoilme.openTag($(this), config); } }); } event.preventDefault(); }); } // if either local or global is set to open we need it to be open if (config.use.local && $.cookie(config.cookiePrefix + 'local' + key + cookieName) == 'open') { var localButton = context.children('.' + config.tag.controls) .find('.' + config.tag.local); button(localButton, config, config.text.localeYes); $.fn.spoilme.openTag(context, config); } if (config.use.global && $.cookie(config.cookiePrefix + 'global' + cookieName) == 'open') { var globalButton = context.children('.' + config.tag.controls) .find('.' + config.tag.global); button(globalButton, config, config.text.localeYes); $.fn.spoilme.openTag(context, config); } }); return spoilers; }; // sensible defaults $.fn.spoilme.defaults = { key: 'h1', animation: { open: '350', fadein: 1000 }, theme: 'modern', use: { scan: true, local: true, global: true, colorCodes: true, css: true, animation: true }, color: { normal: '#fdf8f0', holder: '#aaaabe', speculation: '#9b6', danger: '#e86', link: '#666' }, text: { close: 'Close', open: 'Open', scan: 'Scan', localeYes: 'on', localeNo: 'off' }, tag: { wrapper: 'spoilerWrapper', controls: 'spoilerControls', title: 'spoilerTitle', toggle: 'spoilerToggle', scan: 'spoilerScan', local: 'spoilerToggleLocal', global: 'spoilerToggleGlobal', info: 'spoilerInfo' }, scan: { badWords: [/(death|died|ends|kill)/gi, /(lost|loose|defeat|win|won|victory|victorious)/gi] }, type: { holder: { tag: 'holder', key: /(list|voice actor|seyu|wallpaper|image|hide|space|more|avatar|signature|nsfw|creation)/gi }, speculation: { tag: 'speculation', key: /(speculation|synopsis|guess|theory|epi|ep|episode)/gi }, danger: { tag: 'danger', key: /(spoiler|major|plot|future)/gi } }, cookiePrefix: '' }; $.fn.spoilme.attachCSS = function (config, target) { var css = ''; if (config.theme == 'legacy') { css = css + target + '.spoileme-theme-legacy{margin-top:1em;margin-left:1em;}' + target + '.spoileme-theme-legacy .'+config.tag.wrapper+'2{background:#ede8e0;border:1px solid black;padding:6px;}' + target + '.spoileme-theme-legacy input{width:45px;font-size:10px;margin:0;padding:0;}' + target + '.spoileme-theme-legacy .'+config.tag.controls+'2{float:right;}' } else if (config.theme == 'modern') { css = css + target + '.spoileme-theme-modern{border:1px dotted black;border-bottom:1px solid black;border-top:1px solid black;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px 8px;padding: 2px;margin-top:5px;}' + target + '.spoileme-theme-modern .'+config.tag.controls+'{padding:2px 0px 4px 10px;margin:0;border:1px solid gray;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px 8px;background: '+config.color.normal+' url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAZCAYAAAAWuY87AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAALRJREFUeNpMUTESwyAMk1z+/8aOXbo0hOZYXNkOTTgGUIQsKXy/nh/cViM4QQecsdFATMC0XTgDsAMiiFkMkl+dc4mUwIDrFChLdLgR5yNpmO2SLJKgZmRHnRHimhIASzc0jI/u8MtpMDQJa1KjcSuNlA4ftl3RmMY6ltWT0f8zi2HpwyXMyiIg+yhdAdirj9UYbZxZy6nCDbrfsgAqqLKsxo712ap1m3HJK6No9/tvwU+AAQCvokB8uRbEEQAAAABJRU5ErkJggg==") repeat-x top left;}' + target + '.spoileme-theme-modern .'+config.tag.wrapper+'{padding:5px 5px 5px 20px;}' + target + '.spoileme-theme-modern .'+config.tag.controls+' a{text-decoration:none;color:black;}' + target + '.spoileme-theme-modern .'+config.tag.controls+' a:hover{color:'+config.color.link+';text-decoration:underline;}' + target + '.spoileme-theme-modern .'+config.tag.wrapper+' img{max-width: 100%;}' + target + '.spoileme-theme-modern .'+config.tag.controls+' a.'+config.tag.local+',.spoiler.spoileme-theme-modern .'+config.tag.controls+' a.'+config.tag.global+'{font-weight:bold;}' + target + '.spoileme-theme-modern.'+config.type.holder.tag+' .'+config.tag.controls+'{background-color:'+config.color.holder+';}' + target + '.spoileme-theme-modern.'+config.type.speculation.tag+' .'+config.tag.controls+'{background-color:'+config.color.speculation+';}' + target + '.spoileme-theme-modern.'+config.type.danger.tag+' .'+config.tag.controls+'{background-color:'+config.color.danger+';}' } if (css != '') { $('head').prepend('<style type="text/css">'+css+'</style>'); } }; $.fn.spoilme.cookieName = function (tag) { return $.fn.spoilme.pack( $.fn.spoilme.shortName(tag) ); }; $.fn.spoilme.shortName = function (tag) { return $.trim(tag.attr('title').toLowerCase().replace(/\{.*\}/, '')); }; // toggles spoiler tag on and off $.fn.spoilme.toggleTag = function (tag, config) { tag.find('.' + config.tag.wrapper + ':first').slideToggle(config.animation.open); var toggleButton = tag.children('.' + config.tag.controls).find('.' + config.tag.toggle); $.fn.spoilme.button(toggleButton, config, ($.fn.spoilme.button(toggleButton, config) == config.text.close ? config.text.open : config.text.close)); }; // toggle spoiler tag off, or do nothing $.fn.spoilme.closeTag = function (tag, config) { var toggleButton = tag.children('.' + config.tag.controls).find('.' + config.tag.toggle); if ($.fn.spoilme.button(toggleButton, config) == config.text.close) { $.fn.spoilme.toggleTag(tag, config); } }; // toggle spoiler tag on, or do nothing $.fn.spoilme.openTag = function (tag, config) { var toggleButton = tag.children('.' + config.tag.controls).find('.' + config.tag.toggle); if ($.fn.spoilme.button(toggleButton, config) == config.text.open) { $.fn.spoilme.toggleTag(tag, config); } }; $.fn.spoilme.notify = function (tag, info, config) { alert(info); // simplest implementation }; $.fn.spoilme.styleLegacy = function (tag, config) { tag.hide(); // should be hidden anyway, but just in case // we grab the spoiler title var spoilerTitle = tag.attr('title').toLowerCase().replace(/(\{|\})/gi, ''); // formating tag.addClass('spoileme-theme-legacy'); tag.wrapInner('<div class="' + config.tag.wrapper + '" />'); tag.wrapInner('<div class="' + config.tag.wrapper + '2" />'); tag.prepend( '<div class="'+config.tag.controls+'"><small class="' + config.tag.controls + '2"> ' + (config.use.local ? 'Thread: <input class="' + config.tag.local + '" type="button" value="' + config.text.localeNo + '" />' : '') + (config.use.global ? ' Board <input class="' + config.tag.global + '" type="button" value="' + config.text.localeNo + '" />' : '') + '</small> <b>Spoiler</b> for <i class="' + config.tag.title + '">'+spoilerTitle+'</i>: <input class="' + config.tag.toggle + '" type="button" value="' + config.text.open + '" />' + (config.use.scan ? '<input class="' + config.tag.scan + '" type="button" value="' + config.text.scan + '" />' : '') + '</div>' ); $.fn.spoilme.colorCodes(tag, config, spoilerTitle); tag.find('.' + config.tag.wrapper + ':first').hide(); if (config.use.animation) { tag.fadeOut(30).fadeIn(config.animation.fadein); } else { tag.show(); } }; $.fn.spoilme.styleModern = function (tag, config) { tag.hide(); // should be hidden anyway, but just in case // we grab the spoiler title var spoilerTitle = tag.attr('title').toLowerCase().replace(/[{}]/gi, ''); // formating tag.addClass('spoileme-theme-modern'); tag.wrapInner('<div class="' + config.tag.wrapper + '" />'); tag.prepend( '<div class="'+config.tag.controls+'"><a class="'+config.tag.toggle+'" href="#">' + config.text.open+'</a> <small>' + (config.use.scan ? '(<a class="'+config.tag.scan+'" href="#">?</a>) ' : '') + (config.use.local ? 'Thread: <a href="#" class="'+config.tag.local+'">'+config.text.localeNo+'</a> ' : '') + (config.use.local ? 'Board: <a href="#" class="'+config.tag.global+'">'+config.text.localeNo+'</a> ' : '') + '</small> | <b class="'+config.tag.title+'">'+spoilerTitle+'</b></div>' ); $.fn.spoilme.colorCodes(tag, config, spoilerTitle); tag.children('.' + config.tag.wrapper).hide(); if (config.use.animation) { tag.fadeOut(30).fadeIn(config.animation.fadein); } else { tag.show(); } }; // tests if a image is potentially a spoiler image $.fn.spoilme.isBadImage = function (img) { return true; // default: pretend every image is bad }; $.fn.spoilme.colorCodes = function (tag, config, spoilerTitle) { // color codes if (config.use.colorCodes) { var clasification = null; if (spoilerTitle.match(config.type.holder.key)) { clasification = config.type.holder.tag; } if (spoilerTitle.match(config.type.speculation.key)) { clasification = config.type.speculation.tag; } if (spoilerTitle.match(config.type.danger.key)) { clasification = config.type.danger.tag; } if (clasification !== null) { tag.addClass(clasification); } } }; $.fn.spoilme.button = function (tag, config, value) { if (typeof value == 'undefined') { // we need to return something if (tag[0].tagName == 'INPUT') { return tag.attr('value'); } else { // we assume its a anchor or similar return tag.text(); } } else { // we need to assign the value if (tag[0].tagName == 'INPUT') { tag.attr('value', value); } else { // we assume its a anchor or similar return tag.text(value); } } }; // compacts into a cookie safe format $.fn.spoilme.pack = function (str) { // FVN hash hash = 2166136261; for (var i = 0, size = str.length; i < size; ++i) { hash = hash * 16777619; hash = hash ^ (str[i]-0); } return hash + ''; }; }) (jQuery); Code:
/** * cookie -- jQuery plug-in * */ /** * Just your average Cookie CRUD in a small package. * * @example $.cookie('cookie name', 'value', { life: 7 }); * @desc Create a cookie (life is in minutes). * @example $.cookie('cookie name', 'value'); * @desc Shorthand for creating a cookie. * @example $.cookie('the_cookie', null); * @desc Delete a cookie. */ (function ($) { $.cookie = function (name, value, options) { var context = this; // easy access to target if (typeof value != 'undefined') { // create|update|destroy code path var config = $.extend({}, $.cookie.defaults, options); // destroy cookie? if (value === null) { config.life = -1; // kill eet! value = ''; } var life = ''; if (typeof config.life != 'undefined') { if (typeof config.life == 'number' || config.life.toUTCString) { var date; if (typeof config.life == 'number') { // we assume minutes are passed date = new Date(); date.setTime(date.getTime() + (config.life * 60 * 1000)); } else { //its not a date (necesarly) but quacks like one date = config.life; } life = '; expires=' + date.toUTCString(); } } document.cookie = (name + '=' + encodeURIComponent(value) + life); } else { // get cookie var theValue = null; if ((typeof document.cookie != 'undefined') && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0, size = cookies.length; i < size; i++) { var cookie = $.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { theValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return theValue; } return context; }; $.cookie.defaults = { life: 60 * 24 * 1000 }; }) (jQuery); First I'm gonna assume you have the execution code in some script called query.executor.js Based on your current directory structure for banners jquery plug-ins would probably go in something like as.javascript\jquery.plugins (by your conventions) so I'm just gonna assume that's the case. Step I. Using the BB Code manager create a new tag, call it spoiler (no option), use the following for the code: Code:
<div title="no title" class="spoiler">{param}</div> Code:
<div title="{option}" class="spoiler">{param}</div> product: vBulletin
__________________
|
2010-02-16, 06:46 | Link #36 |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
vB 4.0.1
__________________
|
2010-06-07, 08:18 | Link #39 | |
sleepyhead
Author
Join Date: Dec 2005
Location: event horizon
|
Quote:
- Sphinx Search for vB4 [vbulletin.com]
__________________
|
|
|
|