SitePoint Sponsor

User Tag List

Page 1 of 2 12 LastLast
Results 1 to 25 of 34
  1. #1
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Vertical Scroll Menu

    I have a client that requested a vertical menu that will scroll up and down on their web site. They want it to function so that there is an up arrow at the top of the menu and a down arrow at the bottom of the menu. When you put your mouse over the up arrow it will automatically scroll through about 30 links to the top link and then the opposite effect when you put your mouse over the bottom arrow. Does anyone know a script that can do this? It is very similar to this script http://www.jdstiles.com/java/nav/sidescrollmenu.html but it needs to be vertical and it needs be placed in the code and not show at the top of the page. No absolute position. Someone please help.

  2. #2
    Avid Logophile silver trophy
    ParkinT's Avatar
    Join Date
    May 2006
    Location
    Central Florida
    Posts
    2,330
    Mentioned
    191 Post(s)
    Tagged
    4 Thread(s)
    If I was faced with this task, I would implement it with Flash.
    A single, static element on the page that can be built with as much (or as little) pizzazz as you need.

    Looking at the link you provided, I think this could easily be modified to scroll vertically. Change the calls to moveBy(sScrollPx,0) to moveBy(0, sScrollPx)
    Not much more complicated than that.
    Don't be yourself. Be someone a little nicer. -Mignon McLaughlin, journalist and author (1913-1983)


    Git is for EVERYONE
    Literally, the best app for readers.
    Make Your P@ssw0rd Secure
    Leveraging SubDomains

  3. #3
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thank you for your help. We have to build the menu in javascript since the client does not like flash for some reason. I tried to use that script and it was old and would not function properly in IE 7. Any other ideas?

  4. #4
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    Have a link at the top and bottom with onmouseover and onmouseout events.

    Use those events to control a scrolling function that's called every 30ms or so with settimeout.

    The scrolling function updates the area that you want to scroll.

    There are plenty of tutorials about how to do these things. For example, Scrolling Vertical Text Box

  5. #5
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thank you for the response. The problem lies in the fact that I am not a JavaScript coder so that would be difficult. I was hoping there was a working example that I could use. I know my way around the code and can do some small changes but I cant write custom code. Thanks though.

  6. #6
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    The Marketplace is a very good place to find people who will write all of that up for you and test it to make sure there are no problems.

  7. #7
    Non-Member
    Join Date
    Aug 2007
    Posts
    50
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

  8. #8
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Alright I found a script that works perfect but of course it is vertical and not horizontal. I have messed around with the script and tried to get it to work. I am close but need some help plus if someone gets this to work then everyone will have access to this new script. Please let me know if you can help? Here is the code:

    Code:
    <script type="text/javascript">
    var goupimage='images/pointer2.gif'
    var godownimage='images/pointer.gif'
    //configure menu width (in px):
    var menuwidth=190
    //configure menu height (in px):
    var menuheight=15
    //Specify scroll buttons directions ("normal" or "reverse"):
    var scrolldir="normal"
    //configure scroll speed (1-10), where larger is faster
    var scrollspeed=6
    //specify menu content
    var menucontents='<a href=# class=nav_left>link 1</a><br><a href=# class=nav_left>link 2</a><br><a href=# class=nav_left>link 3</a>'
     
    ////NO NEED TO EDIT BELOW THIS LINE////////////
    var iedom=document.all||document.getElementById
    var updircode='onMouseover="moveup()" onMouseout="clearTimeout(uptime)"'
    var downdircode='onMouseover="movedown()" onMouseout="clearTimeout(downtime)"'
    if (scrolldir=="reverse"){
    var tempswap=updircode
    updircode=downdircode
    downdircode=tempswap
    }
    if (iedom)
    document.write('<span id="temp" style="visibility:hidden;position:absolute;top:-100;up:-5000">'+menucontents+'</span>')
    var actualwidth=''
    var cross_scroll, ns_scroll
    var loadedyes=0
    function fillup(){
    if (iedom){
    cross_scroll=document.getElementById? document.getElementById("test2") : document.all.test2
    cross_scroll.innerHTML=menucontents
    actualwidth=document.all? cross_scroll.offsetWidth : document.getElementById("temp").offsetWidth
    }
    else if (document.layers){
    ns_scroll=document.ns_scrollmenu.document.ns_scrollmenu2
    ns_scroll.document.write(menucontents)
    ns_scroll.document.close()
    actualwidth=ns_scroll.document.width
    }
    loadedyes=1
    }
    window.onload=fillup
    function moveup(){
    if (loadedyes){
    if (iedom&&parseInt(cross_scroll.style.up)>(menuwidth-actualwidth)){
    cross_scroll.style.up=parseInt(cross_scroll.style.up)-scrollspeed+"px"
    }
    else if (document.layers&&ns_scroll.up>(menuwidth-actualwidth))
    ns_scroll.up-=scrollspeed
    }
    uptime=setTimeout("moveup()",50)
    }
    function movedown(){
    if (loadedyes){
    if (iedom&&parseInt(cross_scroll.style.up)<0)
    cross_scroll.style.up=parseInt(cross_scroll.style.up)+scrollspeed+"px"
    else if (document.layers&&ns_scroll.up<0)
    ns_scroll.up+=scrollspeed
    }
    downtime=setTimeout("movedown()",50)
    }
     
    if (iedom||document.layers){
    with (document){
    write('<table border="0" cellspacing="0" cellpadding="2">')
    write('<tr>')
    write('<td valign="middle"><a href="#" '+updircode+'><img src="'+goupimage+'"border=0></a> </td>')
    write('</tr><tr>')
    write('<td width="'+menuwidth+'px" valign="top">')
    if (iedom){
    write('<div style="position:relative;width:'+menuwidth+'px;height:'+menuheight+'px;overflow:hidden;">')
    write('<div id="test2" style="position:absolute;up:0;top:0">')
    write('</div></div>')
    }
    else if (document.layers){
    write('<ilayer width='+menuwidth+' height='+menuheight+' name="ns_scrollmenu">')
    write('<layer name="ns_scrollmenu2" up=0 top=0></layer></ilayer>')
    }
    write('</td>')
    write('</tr><tr>')
    write('<td valign="middle"> <a href="#" '+downdircode+'>')
    write('<img src="'+godownimage+'"border=0></a>')
    write('</td></tr></table>')
    }
    }
    </script>

  9. #9
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Does anyone know a solution?

  10. #10
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Well I have to admit I am a little disapointed considering all of the talented programmers on here that no one can figure this out. Thanks anyway.

  11. #11
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    Nobody wants to try and create the html structure to go with the javascript. If you provide that as well as the javascript, then perhaps people will be more willing to debug it for you.

  12. #12
    SitePoint Enthusiast
    Join Date
    Dec 2007
    Posts
    33
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Rockwilda
    It's quite an easy effect to achieve only time consuming to write. I'd love to help you but cant devote the time, I'll make you a deal if you can get another 10 people on this thread to say they want it then I'll ruddy well write it for you.

    Cant say ruddy fairer than that!

    PS
    I'd avoid that script above like the plague with rabies if I were you. it's so badly written even I wouldn't touch it.
    Mashups, DOM Scripting and all the things we call Web2.0 blogger
    http://www.heavyweightgeek.org/
    http://twitter.com/heavyweightgeek

  13. #13
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    Quote Originally Posted by heavyweightgeek View Post
    Rockwilda
    It's quite an easy effect to achieve only time consuming to write. I'd love to help you but cant devote the time, I'll make you a deal if you can get another 10 people on this thread to say they want it then I'll ruddy well write it for you.
    +1 vote

    Quote Originally Posted by heavyweightgeek View Post
    Cant say ruddy fairer than that!

    PS
    I'd avoid that script above like the plague with rabies if I were you. it's so badly written even I wouldn't touch it.
    The weekend is coming up soon so I might give it a hack then.

  14. #14
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Well if you include myself then you are up to 2 people. Maybe even you are a little interested in seeing if you could actually fix the code so perhaps we can call it 3 haha. I will work on putting this into a HTML structure.

  15. #15
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Here is the HTML code requested.

    HTML Code:
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Can Anyone Fix Me?</title>
    </head>
    <body>
    <table cellpadding="0" cellspacing="0" border="0" width="735">
      <tr>
        <td width="225" bgcolor="#CCCCCC">
    <script type="text/javascript">
    var goupimage='images/pointer2.gif'
    var godownimage='images/pointer.gif'
    //configure menu width (in px):
    var menuwidth=190
    //configure menu height (in px):
    var menuheight=15
    //Specify scroll buttons directions ("normal" or "reverse"):
    var scrolldir="normal"
    //configure scroll speed (1-10), where larger is faster
    var scrollspeed=6
    //specify menu content
    var menucontents='<a href=# class=nav_left>Link # 1</a><br><a href=# class=nav_left>Link # 2</a><br><a href=# class=nav_left>Link # 3</a>'
    
    ////NO NEED TO EDIT BELOW THIS LINE////////////
    var iedom=document.all||document.getElementById
    var updircode='onMouseover="moveup()" onMouseout="clearTimeout(uptime)"'
    var downdircode='onMouseover="movedown()" onMouseout="clearTimeout(downtime)"'
    if (scrolldir=="reverse"){
    var tempswap=updircode
    updircode=downdircode
    downdircode=tempswap
    }
    if (iedom)
    document.write('<span id="temp" style="visibility:hidden;position:absolute;top:-100;up:-5000">'+menucontents+'</span>')
    var actualwidth=''
    var cross_scroll, ns_scroll
    var loadedyes=0
    function fillup(){
    if (iedom){
    cross_scroll=document.getElementById? document.getElementById("test2") : document.all.test2
    cross_scroll.innerHTML=menucontents
    actualwidth=document.all? cross_scroll.offsetWidth : document.getElementById("temp").offsetWidth
    }
    else if (document.layers){
    ns_scroll=document.ns_scrollmenu.document.ns_scrollmenu2
    ns_scroll.document.write(menucontents)
    ns_scroll.document.close()
    actualwidth=ns_scroll.document.width
    }
    loadedyes=1
    }
    window.onload=fillup
    function moveup(){
    if (loadedyes){
    if (iedom&&parseInt(cross_scroll.style.up)>(menuwidth-actualwidth)){
    cross_scroll.style.up=parseInt(cross_scroll.style.up)-scrollspeed+"px"
    }
    else if (document.layers&&ns_scroll.up>(menuwidth-actualwidth))
    ns_scroll.up-=scrollspeed
    }
    uptime=setTimeout("moveup()",50)
    }
    function movedown(){
    if (loadedyes){
    if (iedom&&parseInt(cross_scroll.style.up)<0)
    cross_scroll.style.up=parseInt(cross_scroll.style.up)+scrollspeed+"px"
    else if (document.layers&&ns_scroll.up<0)
    ns_scroll.up+=scrollspeed
    }
    downtime=setTimeout("movedown()",50)
    }
    
    if (iedom||document.layers){
    with (document){
    write('<table border="0" cellspacing="0" cellpadding="2">')
    write('<tr>')
    write('<td valign="middle"><a href="#" '+updircode+'><img src="'+goupimage+'"border=0></a> </td>')
    write('</tr><tr>')
    write('<td width="'+menuwidth+'px" valign="top">')
    if (iedom){
    write('<div style="position:relative;width:'+menuwidth+'px;height:'+menuheight+'px;overflow:hidden;">')
    write('<div id="test2" style="position:absolute;up:0;top:0">')
    write('</div></div>')
    }
    else if (document.layers){
    write('<ilayer width='+menuwidth+' height='+menuheight+' name="ns_scrollmenu">')
    write('<layer name="ns_scrollmenu2" up=0 top=0></layer></ilayer>')
    }
    write('</td>')
    write('</tr><tr>')
    write('<td valign="middle"> <a href="#" '+downdircode+'>')
    write('<img src="'+godownimage+'"border=0></a>')
    write('</td></tr></table>')
    }
    }
    </script>
     </td>
        <td width="10">&nbsp;</td>
        <td>
          <p>This is a Sample Page.</p>
          <p>I really dont know what to write but I prefer not to write in Latin.</p>
        </td>
      </tr>
    </table>
    </body>

  16. #16
    SitePoint Enthusiast
    Join Date
    Dec 2007
    Posts
    33
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I remembered mootools has some scrolley stuff
    http://demos.mootools.net/Scroller

    I think I'd hack this
    Mashups, DOM Scripting and all the things we call Web2.0 blogger
    http://www.heavyweightgeek.org/
    http://twitter.com/heavyweightgeek

  17. #17
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    At this point I am willing to give anything a try. It just has to look like regular links in the navigation and use arrows to scroll up and down without a scrollbar. Much apprectiated!

  18. #18
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    ...

  19. #19
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    Okay, you're going to want a link at either end of the list which will need to perform an action when the mouse is over it.

    First, let's get a list of links with a button at top and bottom.

    Code HTML4Strict:
    <div id="nav">
      <a href="#">Link 1</a>
      <a href="#">Link 2</a>
      <a href="#">Link 3</a>
      <a href="#">Link 4</a>
      <a href="#">Link 5</a>
      <a href="#">Link 6</a>
      <a href="#">Link 7</a>
      <a href="#">Link 8</a>
      <a href="#">Link 9</a>
      <a href="#">Link 10</a>
      <a href="#">Link 11</a>
      <a href="#">Link 12</a>
      <a href="#">Link 13</a>
      <a href="#">Link 14</a>
      <a href="#">Link 15</a>
      <a href="#">Link 16</a>
      <a href="#">Link 17</a>
      <a href="#">Link 18</a>
      <a href="#">Link 19</a>
      <a href="#">Link 20</a>
    </div>

    That's nice and simple.

    And we can set some styling to fix the width and height, give it some colors and a border, a bit of padding, oh and yes, set the overflow to auto so that scrollbars appear.

    The anchors can also appear vertically by making them block items.

    Code CSS:
    #nav {
      height: 10em;
      width: 8em;
      color: black;
      background-color: #ccc;
      border: 1px solid black;
      padding: 0.5em;
      overflow: auto;
    }
    #nav a {
      display: block;
    }

    So now we have a scrolling nav list. But that's not what you're after, I hear you cry.
    You want to do it the hard way without the scrollbars and have your own special buttons for scrolling up and down.

    Well you can. Change the overflow property to hidden so that the scollbars go away

    Code CSS:
    #nav {
      /* other css properties */
      overflow: hidden;
    }

    and add up and down buttons around the navigation div.

    You'll need to call a function when the mouse passes over the button, to start the scroll, and again to stop the scroll when the mouse moves away. We can call them startScroll() and stopScroll()

    When scrolling, we can pass to the function which area we want to scroll, and in what direction.

    Code HTML4Strict:
    <input type="button" value="Scroll Up" onmouseover="startScroll('nav', 'up')" onmouseout="stopScroll()" />
    <div id="nav">
      <a href="#">Link 1</a>
      <!-- Other links -->
      <a href="#">Link 20</a>
    </div>
    <input type="button" value="Scroll Down" onmouseover="startScroll('nav', 'down')" onmouseout="stopScroll()" />

    It's pretty simple so far, right? It doesn't have to be complex at all.

    If you like you can replace the buttons with fancy graphics if you like, to make them actually look like arrows.
    here's how you'd do it.

    Code HTML4Strict:
    <input type="image" src="imagepath/up-button.gif" onmouseover="startScroll('nav', up')" onmouseout="stopScroll()" />

    And similar for the bottom button.

    Now all we need is the magical javascript code that does the work for us, which I'll come to in my next post.
    Last edited by paul_wilkins; Dec 16, 2007 at 17:02.

  20. #20
    SitePoint Addict
    Join Date
    Dec 2001
    Posts
    395
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thank you very much so far! You definitely know your JavaScript!

  21. #21
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    Once we've started the scrolling we'll also need to stop it, and to do that we'll need some way of gaining access back to our timed event.

    For that we will set up a global variable for the scrolling event itself.

    Code JavaScript:
    var scrolling;

    When we scroll we'll need to tell it the actual element that's involved, and how fast to scroll it by, so we need to specify that as a number of pixels. 3 pixels should do to start testing with.

    Code JavaScript:
    function startScroll(id, dir) {
      var el = document.getElementById(id);
      var speed = 0;
      if (dir == 'up') {
        speed = -3;
      } else if(dir == 'down') {
        speed = 3;
      }
      performScroll(el, speed);
    }

    Now we're just left with the hard bit, of telling an element to scroll in a certain direction.

    When we do start to scroll, we're going to set a timing function that gets called on a regular basis to perform each step of the scroll. The setTimeout() function lets us do just that, where you give it a string that contains what is supposed to be performed, and how often it gets done.

    The string passed to the setTimeout() function will be something like performScroll('nav', 3), and I think that about 20 milliseconds should do for the time.

    Code JavaScript:
    function performScroll(id, speed) {
      var el = document.getElementById(id);
      // scrolling code here
      scrolling = setTimeout("performScroll('" + id + "', " + speed + ")", 20);
    }

    But how do we actually scroll the element? We adjust the element's scrollTop value, so the performScroll() function becomes

    Code JavaScript:
    function performScroll(id, speed) {
      var el = document.getElementById(id);
      el.scrollTop += speed;
      scrolling = setTimeout("performScroll('" + id + "', " + speed + ")", 20);
    }

    The above function does a small scroll, then after a small wait it repeats itself. But how do we stop it!

    The scrollTop value automatically ignores nonsensical values, so if it tries to go below 0 it'll just be 0, and likewise for when you try to go above the maximum scrolling height. If further testing shows any issues, they can easily be added in as required.

    It will be nice though if it stops scrolling when you move the mouse off of the scrolling button. This is very simply achieved by clearing the timeout event.

    Code JavaScript:
    function stopScroll() {
      clearTimeout(scrolling);
    }

    And that's it! Step by simple step we've built a scrolling navigation list.

    Here's the complete code for the HTML, the CSS and the JavaScript.

    Code HTML4Strict:
    <input type="image" src="pathtoimage/up-button.gif" onmouseover="startScroll('nav', 'up')" onmouseout="stopScroll()" />
    <div id="nav">
    <a href="#">Link 1</a>
    <a href="#">Link 2</a>
    <a href="#">Link 3</a>
    <a href="#">Link 4</a>
    <a href="#">Link 5</a>
    <a href="#">Link 6</a>
    <a href="#">Link 7</a>
    <a href="#">Link 8</a>
    <a href="#">Link 9</a>
    <a href="#">Link 10</a>
    <a href="#">Link 11</a>
    <a href="#">Link 12</a>
    <a href="#">Link 13</a>
    <a href="#">Link 14</a>
    <a href="#">Link 15</a>
    <a href="#">Link 16</a>
    <a href="#">Link 17</a>
    <a href="#">Link 18</a>
    <a href="#">Link 19</a>
    <a href="#">Link 20</a>
    </div>
    <input type="image" src="pathtoimage/down-button.gif" onmouseover="startScroll('nav', 'down')" onmouseout="stopScroll()" />

    Code CSS:
    #nav {
    	height: 10em;
    	width: 8em;
    	color: black;
    	background-color: #ccc;
    	border: 1px solid black;
    	padding: 0.5em;
    	overflow: hidden;
    }
    #nav a {
    	display: block;
    }

    Code JavaScript:
    var scrolling;
    function startScroll(id, dir) {
      var speed = 0;
      if (dir == 'up') {
        speed = -3;
      } else if(dir == 'down') {
        speed = 3;
      }
      performScroll(id, speed);
    }
    function performScroll(id, speed) {
      var el = document.getElementById(id);
      el.scrollTop += speed;
      scrolling = setTimeout("performScroll('" + id + "', " + speed + ")", 20);
    }
    function stopScroll() {
      clearTimeout(scrolling);
    }
    Last edited by paul_wilkins; Dec 16, 2007 at 17:26.

  22. #22
    Avid Logophile silver trophy
    ParkinT's Avatar
    Join Date
    May 2006
    Location
    Central Florida
    Posts
    2,330
    Mentioned
    191 Post(s)
    Tagged
    4 Thread(s)
    PMW, you should 'repackage' your posts and publish it as a tutorial!
    Don't be yourself. Be someone a little nicer. -Mignon McLaughlin, journalist and author (1913-1983)


    Git is for EVERYONE
    Literally, the best app for readers.
    Make Your P@ssw0rd Secure
    Leveraging SubDomains

  23. #23
    Unobtrusively zen silver trophybronze trophy
    paul_wilkins's Avatar
    Join Date
    Jan 2007
    Location
    Christchurch, New Zealand
    Posts
    14,688
    Mentioned
    100 Post(s)
    Tagged
    4 Thread(s)
    @ParkinT: I will definately be doing that. Thanks for the positive feedback

  24. #24
    SitePoint Enthusiast
    Join Date
    Dec 2007
    Posts
    33
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    @pmw57

    you the man!
    Mashups, DOM Scripting and all the things we call Web2.0 blogger
    http://www.heavyweightgeek.org/
    http://twitter.com/heavyweightgeek

  25. #25
    Learning...
    Join Date
    Jan 2003
    Posts
    778
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thank you pmw57 for sharing such a nice and clean code.

    Can i ask one thing, how can we make it where we pass "h" for horizontal scrolling and "v" for vertical scrolling and all should be taken care off by your script?

    Thanks
    The beauty of life is not dependent on how happy you are,
    but on how happy others can be because of you...


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •