Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Regular Expressions AARRGGHH 2

Status
Not open for further replies.

jeffwest2

MIS
Feb 5, 2009
64
0
0
GB
I freely admit i don't get regular expressions, i can never seem to get them just right, any chance of a bit of help with this i would be great full.

I have this code, which i have taken from a couple of sources, i need to check that anthing in a text box does not include such things as * $ # | etc, but does allow % & @

<!-- Begin
var mikExp = ("[\"#+'/;<>\\]+","g");
function valitext(val) {
var strPass = val;
var strLength = strPass.length;
var lchar = val.charAt((strLength) - 1);
if(lchar.search(mikExp) != -1) {
var tst = val.substring(0, (strLength) - 1);
val = tst;
doanothercheck(val)
}
}
function doanothercheck(val) {
if(val.length < 1) {
alert("Please enter something.");
return false;
}
if(val.search(mikExp) == -1) {

return false;
}
else {
alert("Sorry, but the following characters\n\r\n\r $ % ^ * # ( ) [ ] \\ { + } ` ~ = | \n\r\n\rare not allowed!\n");
myForm.message2.select();
myForm.message2.focus();
return false;
}

return false;
}
// End -->

For some reason it just ignores whatever you add and doesnt error, been fighting with this on and off all day and it has totally stumped me why it doesn't work.

Cheers

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
Hi

Is not a contradiction between these two sentences ?
jeffwest2 said:
a text box does not include  such things as * $ # | etc, but does allow % & @

[gray](...)[/gray]

alert("Sorry, but the following characters\n\r\n\r $ % ^ * # ( ) [ ] \\ { + } ` ~ =  | \n\r\n\rare not allowed!\n");
Anyway, this line is logically wrong, regardless regular expressions :
jeffwest2 said:
var mikExp = ("[\"#+'/;<>\\]+","g");
Have you looked at the value of mikExp after that assignment ? It will contain the last element of the enumeration. It is effectively equivalent with [tt]mikExp [teal]=[/teal] [teal]([/teal] [green]"foo"[/green][teal],[/teal] [green]"bar"[/green][teal],[/teal] [green]"g"[/green] [teal])[/teal][/tt], mikExp's value in both cases will be 'g'.

Just to correct your code :
Code:
[b]var[/b] mikExp [teal]=[/teal] [fuchsia]/["#+'/;<>\\]/[/fuchsia][teal];[/teal]
Note that your regular expression will still allow characters like '♦', '♣', '♠', '♥' or anything else.


Feherke.
 
Thanks for looking at this for me, yup i knew the returned msg was wrong, but until i actually got it working it seemed silly to correct it.

I will give it a go and get back to you.

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
tried the code as you wrote it

var mikExp = /["#+'/;<>\\]/;

but didn't retuirn any error no matter what i entered, do i have something else wrong with this to make it not call it (tried adding both () & " " after the + but this still didn't work.

Sorry, as i said from the start I don't really get them and wont to not only understasnd them but make then work for better validation of text boxe input.

Thanks for any help you can provide.


Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
Hi
[ul]
[li]Show us how exactly you tried my code.[/li]
[li]Specify what input you used while testing.[/li]
[li]Give us a clean enumeration of which characters you want to include in the character set.[/li]
[/ul]


Feherke.
 
This is the code as used within the function

<!-- Function to validate entry in comment box-->
function validate2(value) {
var val <!-- create variable -->
val = value; <!-- assign a value to the variable -->
valitext(val); <!-- pass variable value to the second function -->
if (value == "" || value == null)
alert("If you have entered 'No' or 'Responder not present' above you must enter something in the comments box");
}
<!-- Begin
var mikExp = (/["#+'/;<>\\]/);
function valitext(val) {
var strPass = val;
var strLength = strPass.length;
var lchar = val.charAt((strLength) - 1);
if(lchar.search(mikExp) != -1) {
var tst = val.substring(0, (strLength) - 1);
val = tst;
doanothercheck(val)
}
}
function doanothercheck(val) {
if(val.length < 1) {
alert("Please enter something.");
return false;
}
if(val.search(mikExp) == -1) {
return false;
}
else {
alert("Sorry, but the following characters\n\r\n\r $ % ^ * # ( ) [ ] \\ { + } ` ~ = | \n\r\n\rare not allowed!\n");
myForm.message2.select();
myForm.message2.focus();
return false;
}
return false;
}
// End -->

it is being called by the text box via the onblur
<select onblur=validate(this.value) style="Z-INDEX: 101; POSITION: absolute; WIDTH: 165px; TOP: 105px; LEFT: 112px" id=SELECT1 dataSrc=#Survey2 dataFld=Q1 size=1 name="" datafldname="Q1" databindingtype="Database">

The basic premise is i want people to be able to use & @ but not things like ^ ; > < = - * $ / \ | ( ) *.

The text box is for agents to capture information about converstaions they have with clients, but restricting what they can add.

Validate2 (the first function) calls valitext (the second function) after doinjg a basic check that they have even added something, this then checks what they have added for the non allowed chararecters.

Hope that helps.



Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
[&nbsp;]
I don't see how your code can work. The [red]red[/red] parts hide your code.

[red]<!--[/red] [blue]Begin
var mikExp = (/["#+'/;<>\\]/);
blah blah blah
// End[/blue] [red]-->[/red]


It appears that begin and end are meant to be comments. If so they should look like this:

[red]// Begin[/red]
[blue]var mikExp = (/["#+'/;<>\\]/);
blah blah blah[/blue]
[red]// End[/red]


See
mmerlinn


Poor people do not hire employees. If you soak the rich, who are you going to work for?

"We've found by experience that people who are careless and sloppy writers are usually also careless and sloppy at thinking and coding. Answering questions for careless and sloppy thinkers is not rewarding." - Eric Raymond
 
[&nbsp;]
Also, your function [red]ENDS[/red] at the [red]red[/red] curly brace and even if you change the comments as noted in the previous post, that code will never be called.

[blue]<!-- Function to validate entry in comment box-->
function validate2(value) {
var val <!-- create variable -->
val = value; <!-- assign a value to the variable -->
valitext(val); <!-- pass variable value to the second function -->
if (value == "" || value == null)
alert("If you have entered 'No' or 'Responder not present' above you must enter something in the comments box");
[/blue][red]}[/red]


I think your problem is a lack of understanding program flow and not regular expressions.

mmerlinn


Poor people do not hire employees. If you soak the rich, who are you going to work for?

"We've found by experience that people who are careless and sloppy writers are usually also careless and sloppy at thinking and coding. Answering questions for careless and sloppy thinkers is not rewarding." - Eric Raymond
 
[&nbsp;]

Sorry, made a slight mistake in last post. It should have stated:

... and even if you change the comments as noted in the previous post, the line [red]var mikExp = (/["#+'/;<>\\]/);[/red] will never be called.

mmerlinn


Poor people do not hire employees. If you soak the rich, who are you going to work for?

"We've found by experience that people who are careless and sloppy writers are usually also careless and sloppy at thinking and coding. Answering questions for careless and sloppy thinkers is not rewarding." - Eric Raymond
 
Hi

mmerlinn said:
The red  parts hide your code.
Correct. Well, from certain point of view. Those hide the JavaScript code from the HTML parser. JavaScript interpreters are instructed to ignore them near the [tt]script[/tt] tags and treat them as comments elsewhere. For example the following will display 'one two' in Gecko, Presto and WebKit :
Code:
<script>
<!-- begin
document.writeln('one')
document.writeln('two') <!-- comment -->
<!-- document.writeln('three') -->
// end -->
</script>
They were used in ancient times with JavaScript-ignorant browsers in mind. I mean those browsers which never heard of JavaScript, not those in which JavaScript was disabled. Because they not interpreted the [tt]script[/tt] tags and displayed the content between them as it was HTML content.

These days all browsers know JavaScript and even if JavaScript execution is disabled they know that content between [tt]script[/tt] tags is not HTML and they will never display it. So the use of HTML comments inside [tt]script[/tt] tags is deprecated technique.
mmerlinn said:
... and even if you change the comments as noted in the previous post, the line var mikExp = (/["#+'/;<>\\]/); will never be called.
That statement will be executed when the script is executed. It creates a global variable which will be used later when one of the functions will be called.
mmerlinn said:
I think your problem is a lack of understanding program flow and not regular expressions.
I agree. That code is so ugly I was unable to debug it or suggest improvement. Well, other then rewriting it from zero.

jeffwest2, let me remember you that
[ul]
[li]You not posted the HTML related to the discussed JavaScript code.[/li]
[li]You not posted the code with the function call.[/li]
[li]You not specified what input you used for testing.[/li]
[/ul]
Your latest code only rise new question, like
[ul]
[li]Why is the regular expression check performed in two functions ?[/li]
[li]Are there different rules for validating the last character and the other ones ? ( A single regular expression could check both restrictions in a single matching. )[/li]
[/ul]
Beside that, please
[ul]
[li]Pick an Indent style and use it consistently.[/li]
[li]Post your code between [tt][ignore]
Code:
[/ignore][/tt] and [tt][ignore]
[/ignore][/tt] TGML tags.[/li]
[/ul]

Feherke.
 
Thanks for the comments.

I did say at the start that some of this I had taken from other sources, so while I do have an understanding of the fundimentals of Javascript, it has been over 5 years since I last used it, and so am a little rusty, which I why I need the help, I have never used regular expressions, which again is one of the reasons I wanted to, but also the only place where my problems lie, before I tried to look at this the page was working fine.

Sorry the code was not correctly formatted, I will do better in future.

The code between
//<-- Begin
.
.
--> End

Has been running but not consistantly which is my biggest issue.
below is the whole code for the page.

I assume the question why am i doing it in two functions is because of valitext & doanothercheck, I found these elsewhere, and they seemed to work ok, but as I said not consistantly, any help that can be given would be greatly appreciated

Code:
<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Blank</title>
<script language=javascript type=text/javascript src="../js/callguide.js"></script>
<script language=javascript>
<!--Function to look at drop down list and validate entries-->
function validate(value) {
    if (value == "Please Choose"){
    alert("Please enter a correct value in the drop down box");
}
    if (value == "Responder not present"){
    alert ("Please enter comments from respondant below");
}
    if (value == "N"){
    alert ("You must enter comments below to quantify this");
}
}
<!-- Function to validate entry in comment box-->
function validate2(value) {
    var val <!-- create variable -->
    val = value; <!-- assign a value to the variable -->
    valitext(val); <!-- pass variable value to the second function -->
    if (value == "" || value == null) 
    alert("If you have entered 'No' or 'Responder not present' above you must enter something in the comments box");
}
<!-- Begin
var mikExp = (/["#+'/;<>\\]/);
function valitext(val) {
var strPass = val;
var strLength = strPass.length;
var lchar = val.charAt((strLength) - 1);
if(lchar.search(mikExp) != -1) {
var tst = val.substring(0, (strLength) - 1);
val = tst;
doanothercheck(val)
   }
}
function doanothercheck(val) {
if(val.length < 1) {
alert("Please enter something.");
return false;
}
if(val.search(mikExp) == -1) {
return false;
}
else {
alert("Sorry, but the following characters\n\r\n\r $ % ^ * # ( ) [ ] \\ { + } ` ~ =  | \n\r\n\rare not allowed!\n");
myForm.message2.select();
myForm.message2.focus();
return false;
}
return false;
}
//  End -->
<!-- Function looks at text box and calc char length -->
function textCounter(field,cntfield,maxlimit) {
if (field.value.length > maxlimit) // if too long...trim it!
field.value = field.value.substring(0, maxlimit);
// otherwise, update 'characters left' counter
else
cntfield.value = maxlimit - field.value.length;
}
</script>
<meta content="text/html; charset=utf-8" http-equiv=Content-Type>
<meta name=vs_targetSchema content=[URL unfurl="true"]http://schemas.microsoft.com/intellisense/ie5>[/URL]
<meta content=Yes http-equiv=MSThemeCompatible>
<link rel=stylesheet type=text/css href="CallGuide.css">
<meta name=GENERATOR content="MSHTML 8.00.6001.19190">
<databinding:datasrc Name="SSE_Survey2"></databinding:datasrc></head>
<body>
    <table id=TABLE1 class=border_table border=1 cellSpacing=0 cellPadding=0>
        <tbody>
            <tr>
                <td class=border_blue_tl>
                </td>
                <td class=border_blue_t>
                    Question 1 0f 12 
                </td>
                <td class=border_blue_tr>
                </td>
            </tr>
            <tr>
                <td class=border_blue_l>
                </td>
                <td class=border_blue_m>
                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><form name=myForm border="1">
                    <label style="Z-INDEX: 0; POSITION: absolute; WIDTH: 300px; HEIGHT: 24px; COLOR: #6600cc; TOP: 63px; FONT-WEIGHT: bolder; LEFT: 112px" id=LABEL1>Did the installer make an appointment?</label> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 
                    <select onblur=validate(this.value) style="Z-INDEX: 101; POSITION: absolute; WIDTH: 165px; TOP: 105px; LEFT: 112px" id=SELECT1 dataSrc=#SSE_Survey2 dataFld=Q1 size=1 name="" datafldname="Q1" databindingtype="Database"> 
                    <option selected value="Please Choose">
                        Please Choose
                    </option>
                    <option value=Y>
                        Yes
                    </option>
                    <option value=N>
                        No
                    </option>
                    <option value="Responder not present">
                        Responder not present
                    </option>
                     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</select> 
                    <label style="POSITION: absolute; WIDTH: 434px; HEIGHT: 26px; TOP: 135px; LEFT: 112px" id=LABEL2>Please enter any comments below</label><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
                    <textarea onblur=validate2(this.value) style="WIDTH: 240px; HEIGHT: 84px" onkeydown=textCounter(document.myForm.message2,document.myForm.remLen2,2500) dataSrc=#SSE_Survey2 dataFld=Q1a onkeyup=textCounter(document.myForm.message2,document.myForm.remLen2,2500) wrap=physical rows=5 name=message2 datafldname="Q1a" databindingtype="Database" size="1"></textarea>&nbsp; Characters left 
                    <input value=2500 readOnly maxLength=3 size=3 name=remLen2> <br><br></input></form>
                </td>
                <td class=border_blue_r>
                </td>
            </tr>
            <tr>
                <td class=border_blue_bl>
                </td>
                <td class=border_blue_b>
                </td>
                <td class=border_blue_br>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
Sorry, didn't say that in the text box I have I added in turn % then ^ then %^ then <)? then clicked somewhere else or tabbed out of the box to make the onblur function fire

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
[&nbsp;]
Feherke

You are correct. I mixed up browser issues with javascript issues and failed to realize that variable and function definitions in javascript can be interspersed with each other.

The two things that threw me for a loop were

1) using HTML comment syntax for javascript comments, and
2) defining a single variable between two function definitions.

In the first place, I think mixing up the comment syntax could be problematic at worst and confusing at best.

Secondly, for readability and debugging purposes, I never mix variable and function definitions. I find that it is a whole lot easier to group all variable definitions together and do the same with all function definitions.


mmerlinn


Poor people do not hire employees. If you soak the rich, who are you going to work for?

"We've found by experience that people who are careless and sloppy writers are usually also careless and sloppy at thinking and coding. Answering questions for careless and sloppy thinkers is not rewarding." - Eric Raymond
 
mmerlinn

No worries, more than likely me not explaining myself very well, any chance you can help steer me in the right direction to get this working, i would really appreciate it.

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
Hi

Sorry, I had to clean up the HTML to be able to read it.
JavaScript:
[b]var[/b] mikExp [teal]=[/teal] [fuchsia]/["#+'/;<>\\]/[/fuchsia]g[teal];[/teal]

[b]function[/b] [COLOR=darkgoldenrod]validateselect[/color][teal]([/teal]value[teal])[/teal]
[teal]{[/teal]
  [b]if[/b] [teal]([/teal]value [teal]==[/teal] [green][i]"Please Choose"[/i][/green][teal])[/teal] [teal]{[/teal]
    [COLOR=darkgoldenrod]alert[/color][teal]([/teal][green][i]"Please enter a correct value in the drop down box"[/i][/green][teal]);[/teal]
  [teal]}[/teal] [b]else[/b] [b]if[/b] [teal]([/teal]value [teal]==[/teal] [green][i]"Responder not present"[/i][/green][teal])[/teal] [teal]{[/teal]
    [COLOR=darkgoldenrod]alert[/color] [teal]([/teal][green][i]"Please enter comments from respondant below"[/i][/green][teal]);[/teal]
  [teal]}[/teal] [b]else[/b] [b]if[/b] [teal]([/teal]value [teal]==[/teal] [green][i]"N"[/i][/green][teal])[/teal] [teal]{[/teal]
    [COLOR=darkgoldenrod]alert[/color] [teal]([/teal][green][i]"You must enter comments below to quantify this"[/i][/green][teal]);[/teal]
  [teal]}[/teal]
[teal]}[/teal]

[b]function[/b] [COLOR=darkgoldenrod]validatemessage[/color][teal]([/teal]value[teal])[/teal]
[teal]{[/teal]
  [b]var[/b] select [teal]=[/teal] document[teal].[/teal][COLOR=darkgoldenrod]getElementById[/color][teal]([/teal][green][i]'SELECT1'[/i][/green][teal])[/teal]

  [b]if[/b] [teal]([/teal]value [teal]==[/teal] [green][i]""[/i][/green] [teal]&&[/teal] select[teal].[/teal]selectedIndex[teal]>=[/teal][purple]2[/purple][teal])[/teal] [teal]{[/teal]
    [COLOR=darkgoldenrod]alert[/color][teal]([/teal][green][i]"You have entered "[/i][/green][teal]+[/teal]select[teal].[/teal]options[teal][[/teal]select[teal].[/teal]selectedIndex[teal]].[/teal]text[teal]+[/teal][green][i]" above, so you must enter something in the comments box"[/i][/green][teal]);[/teal]
    [b]return[/b] [b]false[/b][teal];[/teal]
  [teal]}[/teal]

  [b]var[/b] forbidden [teal]=[/teal] value[teal].[/teal][COLOR=darkgoldenrod]match[/color][teal]([/teal]mikExp[teal]);[/teal]
  [b]if[/b] [teal]([/teal]forbidden[teal])[/teal] [teal]{[/teal]
    [COLOR=darkgoldenrod]alert[/color][teal]([/teal][green][i]"Sorry, but the "[/i][/green][teal]+[/teal]forbidden[teal].[/teal][COLOR=darkgoldenrod]join[/color][teal]([/teal][green][i]', '[/i][/green][teal])+[/teal][green][i]" characters are not allowed!"[/i][/green][teal]);[/teal]
    document[teal].[/teal]myForm[teal].[/teal]message2[teal].[/teal][COLOR=darkgoldenrod]select[/color][teal]();[/teal]
    document[teal].[/teal]myForm[teal].[/teal]message2[teal].[/teal][COLOR=darkgoldenrod]focus[/color][teal]();[/teal]
    [b]return[/b] [b]false[/b][teal];[/teal]
  [teal]}[/teal]

  [b]return[/b] [b]true[/b][teal];[/teal]
[teal]}[/teal]
Code:
[b]<form[/b] [maroon]name[/maroon][teal]=[/teal][green][i]myForm[/i][/green][b]>[/b]

[b]<label[/b] [maroon]id[/maroon][teal]=[/teal][green][i]LABEL1[/i][/green][b]>[/b]Did the installer make an appointment?[b]</label>[/b]
[b]<select[/b] [maroon]onblur[/maroon][teal]=[/teal][green][i]validateselect(this.value) id[/i][/green]=[maroon]SELECT1[/maroon] [maroon]size[/maroon][teal]=[/teal][green][i]1 name[/i][/green]=[green][i]""[/i][/green][b]>[/b]
[b]<option[/b] [maroon]selected[/maroon] [maroon]value[/maroon][teal]=[/teal][green][i]"Please Choose"[/i][/green][b]>[/b]Please Choose[b]</option>[/b]
[b]<option[/b] [maroon]value[/maroon][teal]=[/teal][green][i]Y[/i][/green][b]>[/b]Yes[b]</option>[/b]
[b]<option[/b] [maroon]value[/maroon][teal]=[/teal][green][i]N[/i][/green][b]>[/b]No[b]</option>[/b]
[b]<option[/b] [maroon]value[/maroon][teal]=[/teal][green][i]"Responder not present"[/i][/green][b]>[/b]Responder not present[b]</option>[/b]
[b]</select>[/b]

[b]<label[/b] [maroon]id[/maroon][teal]=[/teal][green][i]LABEL2[/i][/green][b]>[/b]Please enter any comments below[b]</label>[/b]
[b]<textarea[/b] [maroon]onblur[/maroon][teal]=[/teal][green][i]validatemessage(this.value) wrap[/i][/green]=[maroon]physical[/maroon] [maroon]rows[/maroon][teal]=[/teal][green][i]5 name[/i][/green]=[maroon]message2[/maroon][b]></textarea>[/b]
Characters left [b]<input[/b] [maroon]value[/maroon][teal]=[/teal][green][i]2500 readOnly maxLength[/i][/green]=[maroon]3[/maroon] [maroon]size[/maroon][teal]=[/teal][green][i]3 name[/i][/green]=[maroon]remLen2[/maroon][b]>[/b]

[b]</form>[/b]
This works for me, but I still keep my previous opinion : should be rewritten from zero instead.

By the way, are you aware that textCounter() will react only to changes made with the keyboard ? So
[ul]
[li]copy & paste or drag & drop with the mouse[/li]
[li]autocomplete by the browser or extension[/li]
[li]edit by bookmarklet or user script[/li]
[/ul]
will modify the text without triggering the JavaScript function's length check.

Feherke.
 
Thanks for this, I will give it a go, about the textcounter(), I didn't know that (or maybe i did and had forgotten, it seems to ring a bell)

Thankfully the way this is being used, the possibility of autocomplete or copy and paste are remote, as is any intyeraction via a user script, but thanks for the reminder/information

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
Looks like this does what i need it to do, thank you everyone for the input, i will try and set out my code a little better in future, and this has also reminded me that i need to check syntax a little more as well, great learning curve.

Didn't anyone ever tell you? There's one thing you never put in a trap — if you're smart, if you value your continued existence, if you have any plans about seeing tomorrow — there's one thing you never — ever, put in a trap. … Me.
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top