Understanding and solving the JavaScript/CSS entanglement phenomenon

About a year ago I wrote “The graceful degradation myth” in which I talked about the entanglement phenomenon that occurs when you mix JavaScript functionality with CSS “initial states”. By that I mean, if you’ve got a block of content that is initially hidden via CSS (i.e. display: none;) and is only made visible through JavaScript functionality (like an onclick event), you run the risk of barring access to that hidden content to visitors who don’t have JavaScript running on their browser–if you don’t do it right that is.

Since I wrote that post I came up with a technique that solved the problem (as well as the “flicker” problem that occurs with some fixes). This past week I came up with what I believe is an even better solution which I plan on using in upcoming projects. I’ll share both with you here in this post.

How to layer

Before I get to the solutions, I’d like to touch briefly on the subject of the three layers of separation. Those being of course content (HTML), presentation (CSS), and behaviour (JavaScript). Most people in the web standards community know of these, but what I seldom hear is the idea that one layer should never break the other. See, you start with HTML on top of which you place CSS and then comes JavaScript (if you’re using all three that is, though the sequence of the last two is debatable). When you go from CSS to JavaScript you should never do something in the CSS that relies on the JavaScript. In other words, dependency should be unidirectional–downward. A layer should only be dependent on one that it’s applied to, not the other way around. Therefore, when implementing a show/hide mechanism in the behavioural layer, you should do so in a way that still allows the first two layers to be accessible should the third not be available.

The reason I just covered the three layers of separation is because a lot of JavaScript implementations break the rule of non obstruction. A lot of implementations will hide content in CSS and only make it available through JavaScript, thus tangling the two layers together and breaking the separation model. The following solutions avoid this phenomenon.

The first solution

Create a CSS file that will contain all of the “initial state” rules for your behavioural layer. So for example in the case of a flyout menu system, if all sub-menus with the class name “flyout” are to be initially hidden when the page loads your CSS file would contain the following rule:

.flyout{display: none;}

Then, link the CSS file to your page using JavaScript. That way, if JavaScript isn’t available the CSS file never gets loaded and the rule never gets applied. Thus the content remains visible and accessible. The way I used to do this was with the following line of JavaScript code in the <head> of the page:

document.write("<link rel='stylesheet' href='initial_states.css' type='text/css' \/>");

The problem with this technique is that I’m using document.write() which is bad. It’s bad because it ties the instruction to a specific place in the document, it’s archaic and isn’t supported in pure XHTML implementations (such as this site that’s delivered with the application/xhtml+xml MIME type).

The better solution

The better solution builds on the basic concept of the original but does it without document.write(). This time your initial state CSS rules will look like this:

body.hasJS .flyout{display: none;}

And you can go ahead and load the CSS file in the traditional way without using JavaScript. The key rather is to assign the “hasJS” class to the body element through JavaScript. If JavaScript doesn’t exist, it doesn’t get set and the rule doesn’t get applied. You can still keep the initial states in a separate file if you’d like but it isn’t necessary. So long as the rule exists somewhere. The simplest implementation of this technique is to have the following line of JavaScript code on the first line inside the body element:

document.body.className += "hasJS";

The reason for this is because doing it in an onload event will cause a flicker where the page will load, then the content will be hidden. This way, the class is applied before any content is parsed. There are of course better ways of applying the class name (such as an addClassName() function that only adds the class name if it doesn’t already exist).

I haven’t fully tested the better technique on a wide variety of platforms as I have with the standard one, so if you have any success with it, please let me know.

I’ve mocked up a quick example page so you can see it in action.

  • Share/Save/Bookmark

Leave a Comment

Note: First time comments will be held for moderation as an added anti-spam measure.

Comments

  1. Interesting technique. Is document.body.classname available before the body element appears on the page? Also is there any conflict with an existing class name on the body element?

  2. Patrick: document.body is only available once it’s been created in the DOM. Putting the code into the <head> will cause an error because the body tag hasn’t been encountered yet by the parser. Putting it immediately after the <body> open tag will ensure that the node’s been created in the DOM. I’ve tested it on: IE6, IE7, Firefox 1.5.0.9 (PC), Firefox 2.0.0.1 (PC/Mac), Safari 2.0.4 (Mac), and it works fine. The only thing I worry about (and would appreciate feedback from people on other platform/browser combinations) is cases where the DOM element isn’t created right away.

    As for the conflict with existing class names, that’s what the += is for. You could add a space to the += ” hasJS” value to ensure the proper adding of the class name if you know that one is already there. You could also use a function that handles all the nitty gritty of properly adding the class name without destroying anything.

  3. Sounds good – I’m still a little nervous about assuming the body element has been created, but I could always put some polling code in front of it so it checks to see if the BODY element has been created.

  4. I like it – particularly the potential speed gains resulting from not having the extra HTTP request. Good idea – thanks for sharing.

  5. This is an interesting solution to the hiding by JS problem. I hadn’t thought of it before.

    But there is another solution that could be used instead of (or in tandem with) this method. Plus, it allows you to keep all your scripts in the HEAD where they belong.

    The trick is to utilize the DOM ready event. While the window.onLoad event must first wait for all elements on a page to load, the DOM ready event runs when just the DOM is ready to go, which is before the page is fully loaded. Think of it as when the browser loads all the tags (and their IDs and classes) but has not yet displayed them (that’s how I think of it anyway…technically it may be altogether different).

    So, using DOM ready, you can have a function search the DOM for elements with the .flyout class and hide them (be it through inline style or class) before the browser starts to render them. Or, using your method, simply add a class to the BODY.

    This is how almost everything is initialized when using the jQuery (jquery.com) javascript library (highly recommended). The code that would use your method would look something like this:

    $(document).ready(function(){

    $(”body”).addClass(”hasJS”);

    });

    Or, a different way would be to do something like:

    $(document).ready(function(){

    $(”div.flyout”).hide();

    });

    Either way, they will be hidden before the page starts to render onscreen. Here is a link to a page that describes what is going on much better than I am. http://15daysofjquery.com/quicker/4/

  6. Erik: It would really be great if there was a native .domReady(); method but what you’re referring to is part of jquery and apparently it’s not so reliable (unfortunately). A friend of mine looked into the jquery code and found that it uses a mix of different methods depending on the browser and defaults to .onload() when it can’t rely on any native method. In Safari it runs a .setInterval().

    At any rate, I wasn’t looking to compete with jquery’s .ready() so much as deal with the JS/CSS entanglement issue. So really, if you’re happy with .ready() then by all means, use it! :-)

  7. I definitely agree their implementation is a little hacky, and that the browsers really need to conform (but, if they all did, there wouldn’t be much discussion here anyway ;-) ). This is AN alternative, not THE alternative.

    But, like you said, the greater point is what matters. Behavior ends with javascript, it should start with javascript too.

  8. Have you considered adding the hasJS class to the html element? The selector .hasJS .whatever would still be in charge but you could do that in the head and don’t have to clutter the body with script tags for better separation of content and behaviour.

  9. The solution I developed was to insert a link to the stylesheet into the dom with javascript. That way you can create a separate stylesheet for the features that require javascript without having to preface every selector with html.hasJS. If you don’t mind a little shameless self promotion, I wrote a brief blog post about it here.

  10. <html> element hasn’t got class attribute in any of the most popular DTD’s used for WWW.
    E. g.
    http://www.w3.org/TR/REC-html40/struct/global.html#h-7.3

    I noticed that only when I was trying some time ago to add class=”someLanguage” in addition to lang=”someLanguage” and xml:lang=”someLanguage” attributes, because of lack of :lang() CSS selector support in browsers.

    I understand you could insert any custom attribute or element with DOM methods (even <html hasJS="hasJS">; then CSS like html[hasJS]…), but you should thank browsers developers that “.someClassName” selector works with invalid HTML, thank that HTML isn’t instantly being validated and browsers don’t refuse to display invalid documents.

    Such a layer-separation-aware article should take it into consideration.

  11. Cezary: Good point. I’m leaning more towards Jim Ramsey’s solution anyway because it allows me to keep the initial states rules in a separate file (as in the first example) and it also keeps me from having to prefix everything with a .hasJS class name.

  12. Good catch, Cezary! I assumed I could attach a class because I can use html as selector…

  13. It is nice idea, I used to create extra css for js by DOM, this seems much more simple. But in your example there is one big logic mistake. If browser do’nt know document.getElementById it loose sence, because you have think also about this. So in your example should be
    if(document.getElementById){document.body.className += “hasJS”;}

  14. Another method would be to make use of the noscript tag, and place a link to a css file in it which would declare the hidden objects to be visible. Doing so could prevent the need for any javascript to run that would change the style on load.

  15. noscript seems like it should work, but the noscript tag doesn’t validate when used in the head and the link tag doesn’t validate when used in the body.

  16. Well, to be fair, not all browsers follow w3c spec. :) If you must have validation, the css required to show aforementioned elements would probably only consist of a few lines, so you could use a noscript tag in the body of your html, containing a style tag with the css required to show the hidden elements. Not the cleanest method perhaps, but I still believe this is better than adding more javascript to the page.

  17. Before everyone gets carried away, I’d just to like to point out that when I tried to use the example page via keyboard, I was completely unable to access the link by tabbing in either Firefox 2 or IE6. Personally, I’d be very uncomfortable with any potential solution that created barriers for keyboard navigators.

  18. Mel: The example wasn’t written with the intent of demonstrating the accessibility of the JavaScript code (which didn’t incorporate a hyperlink at all), rather it was written “quick and dirty” to demonstrate how the page’s initial state would be if JavaScript was available or unavailable in a given browser. However, you’ll be happy to find that I’ve fixed the problem so as to be able to access the content via tabbing. Sorry about the oversight.

  19. I like it! Very nice and quite simple!

  20. I have discovered one “best practice” using a technique like this. In some cases, especially during development, errors can occur in the code for hiding/revealing parts of the page. For example, your onclick event might not get set up correctly. In such a case, the hidden content will never be revealed and the page will be unusable.

    So if possible, after all my setup has run, I run a separate script that removes the CSS I used to temporarily hide the content. That way if my code is borked I still get a usable page.

  21. I believe Shaun Inman was using a similar approach back in 2005, even adding a check for a loaded style sheet along with .hasJS.

  22. I have been applying this technique to the html element for about two years now, without any drawbacks that I can see. Cezary Okupski rightfully points out that the class attribute is not a valid attribute for the html element in any of the appropriate DTDs, but it is important to note two things about that:

    1. DTDs are created to validate the document as it is delivered, and not the interpreted or modified document held in memory by the client app. Thus, class attributes added to the html tag are invalid, but className values added to the html element via js are perfectly valid.

    2. CSS selectors do not check themselves against the html DTD, and any element can have any class, so long as both the class and element name follow the proper naming convention (e.g., not starting with a number, no spaces, etc.).

    So, it is valid to add className values to the html element, and to target your CSS selectors to it.

    The pattern that I use is this:
    a) when the JS executes, add one permanent and one temporary className:
    document.documentElement.className += ‘ domCapable domLoading’;

    b) after the DOM has been loaded (via a similar technique to the JQuery “ready”), replace the temp className with one that recognizes the new state:
    document.documentElement.className += ‘ domReady’;
    document.documentElement.className = document.documentElement.className.replace(/\bdomLoading\b/,”).replace(/\s+/,’ ‘);

    Most of my “hide until JS runs” CSS then goes like this, where the “off” state is triggered by the html class and the “on” state is both the default and triggered by a class interactively added by JS:

    html.domCapable #foo ul { display:none; }
    #foo ul,
    div#foo ul.show { display:block; }

    (Notice the extra specificity of the added “div” in the “on” state to match the “off” state specificity — you could also just remove the “html” from the “off” state selector.)

  23. Thanks Ara for opening this topic, brilliant.

    I’ve been struggling to prevent accessible hidden content from flashing up on page load.
    Tried the domready technique but wasn’t impressed with the results.
    Even tried placing hidden content in tags then redefining via the DOM. Unfortunately Firefox has a bug.

    I prefer Ben’s method purely for removing script from the body but I cannot get it to work with IE.
    Any workarounds Ben or just use Ara’s?

  24. Nice work dudes.I
    s there a specific reason that these techniques work online but not locally?

  25. mike 2k:)2: I’m not sure what you mean by the technique not working locally. Is it because you’re using IE and it blocks JavaScript on locally loaded files by default?

  26. Yes, but normally once the security risk is accepted the JS runs/ works.
    Though my PC has been playing up today.
    Works perfectly when online.

  27. @mike 2k:)2:

    Some browsers do not automatically have the document.documentElement object. I’ve corrected this in my library with this line of code:

    if (!document.documentElement) document.documentElement = document.getElementsByTagName(’html’)[0];

    Sorry I didn’t include that — I thought it was for an ancient browser and not something still in use like IE. Guess I gotta comment my code…

    I can’t help you with the local/online issue, but if you’re doing serious development you might want to explore running a webserver on your local machine. You can find easy installers for “WAMP” server configs just through a google search.

  28. For ofline testing you can use mark of the web http://msdn.microsoft.com/workshop/author/dhtml/overview/motw.asp

  29. Nice idea.

    Even so, I’ll think I’ll stick to the method I’ve been using as I:
    a) don’t agree with having javascript in the html document (and most definitely not within the body) – this should be in a seperate file.
    b) find it useful (and far less confusing) to work with two seperate css files: one which contains the “normal” state of a page, one which adds/overwrites the normal state for those users which have js available.

    The technique I use is a variation on the first method. It *does* use document.write, but from within the js file.
    I don’t mind it being “tied to a specific place in the document” as that place is and should always be the same anyway: the js file should load from the head after the css file has been loaded.

    For those interested: I’ve described this method in more detail as part of an accessible fold-out menu tutorial here:
    http://adviesenzo.nl/examples/cssjsmenu/

  • hgh
  • tadalafil generic cialis
  • cialis headache
  • annuaires sp cialis s
  • buy cialis on line
  • cialis release news
  • find lowest price for cialis
  • 40 grams of cialis
  • cialis and fertility
  • relationship between the prostate cialis
  • on line cialis
  • cialis levitra xanax us approved pharmacies
  • cialis and clarithromycin
  • what does cialis look like
  • expired cialis still safe
  • cialis taken by women in europe
  • cialis viagra celebrex best price
  • cialis soft tab india
  • side effects cialis
  • cialis levitra viagra
  • cialises
  • brand cialis
  • cutting pill cialis
  • 10mg call cialis refills
  • u 17590 cialis
  • cialis soft gel india
  • where to puchase cialis online usa
  • cialis dangers
  • gay men viagra vs cialis
  • enseignement sp cialis atelier cuisine
  • canada cialis
  • cialis overnigth
  • cialis for bph
  • file viewtopic t 21513 cialis
  • uk cialis supplier
  • beta blockers and cialis
  • cialis trial pack $38
  • lowest cost for cialis 20mm tablets
  • cialis availability in uk
  • cialis next day delivery
  • cialis and lopressor
  • cialis from mexico
  • marijuana cialis
  • cheap sildenfil with 4 free cialis
  • cialis testamonial
  • cialis no perscription
  • cialis photo
  • cialis free trial
  • 100 dollars cialis
  • enseignement sp cialis
  • prescription cialis
  • cialis illegal philippines
  • buy cialis domain
  • cialis multiple orgasms
  • cheap cialis find
  • viagra cialis levitra buy viagra
  • cialis not effective
  • cialis shipping
  • cialis on-line medication
  • cialis does it work
  • buy 1 cialis
  • cialis lesions
  • grapefruit and cialis
  • generic cialis uk
  • cialis response
  • cialis w
  • u id password cialis
  • cialis en ligne de pharmacie
  • viagra cialis no prescription fast
  • cialis achalasia
  • cialis sales
  • dont buy generic cialis
  • what is better levitra viagra cialis
  • generisch cialis
  • cialis flagstaff
  • product team cialis
  • cialis long term
  • viagra cialis store
  • what if cialis does not work
  • cialis generic viagra rss feed
  • cialis 20
  • cheap cialis indice
  • immodium cialis
  • offshore cialis
  • cialis headache and prevention
  • cialis 20 mg discoun
  • ne cialis
  • inexpensive cialis
  • buy cialis online rss feed
  • cialis soft tab rss feed
  • cialis recreational use
  • buy cialis grand rapids michigan
  • generic name for cialis
  • women and cialis
  • cialis duration of effectiveness
  • double dose of cialis
  • pn 1 cialis
  • will insurance pay for cialis
  • my cialis
  • cialis opposite effec
  • buy cialis online viagra
  • generic cialis viagra
  • cialis for men
  • cialis impotence drug eli
  • india generic cialis
  • is generic cialis ok
  • sublingual cialis
  • cialis allergic lesions
  • cialis causes high blood pressure
  • canadian cialis
  • find cheap cialis
  • cialis pictures descriptions
  • generic cialis mg amp mg
  • buy cialis online uk
  • cialis eye problems
  • cialis online buy cialis without prescription
  • cialis drug interactions
  • price cialis
  • 10 mg cialis
  • cialis contraindications
  • best source information about cialis
  • cialis and alcohol
  • information cialis
  • alchohol and cialis
  • best cialis price
  • cialis overnight shipping usa pharmacy
  • cialis drug intereactions
  • buy sublingual cialis online
  • cialis substitutes
  • buy cheap cialis without a prescription
  • cialis pills
  • cialis and violent sex
  • canada cialis levitra
  • cialis experiences
  • on line prescriptions for cialis
  • prices soft tab cialis
  • geniune cialis no prescription
  • cialis questions
  • cialis side effect
  • cialis and grapefruit
  • approval cialis fda
  • searchstring cialis type all
  • buy levitra
  • levitra
  • generic levitra
  • cheap levitra
  • buy levitra online
  • discount levitra
  • order levitra
  • levitra online
  • levitra sale
  • cialis versus levitra
  • info levitra
  • bayer levitra samples
  • new drug levitra
  • levitra side effects
  • levitra dangers
  • levitra medicine
  • levitra website
  • canada in levitra
  • levitra vs viagra
  • levitra attorneys
  • levitra woman
  • levitra lawyers
  • levitra review
  • viagra cialis levitra
  • levitra versus viagra
  • viagra vs levitra
  • levitra prescribing
  • levitra users
  • levitra free samples
  • levitra 2007
  • levitra cialis
  • levitra clinical data
  • levitra lowest price
  • levitra dosage
  • online drug purchase levitra
  • discount levitra online
  • apcalis levitra vs
  • what is better viagra or levitra
  • levitra for sale
  • levitra young people
  • levitra actress pics
  • cialis vs levitra
  • levitra vs cialis
  • apcalis levitra viagra
  • levitra stories
  • genuine levitra no prescription
  • levitra cheap fast
  • levitra price
  • what is levitra
  • viagra levitra cialis pharmacist perscription drugs
  • cialis and levitra
  • levitra and alcohol
  • cheapest generic levitra
  • levitra 2003 latest
  • does levitra work
  • 20mg levitra
  • levitra for women
  • levitra canada
  • levitra medication
  • levitra without a prescription
  • bayer and levitra
  • levitra information
  • levitra discount
  • levitra cialis viagra
  • levitra on line
  • levitra consumer information
  • levitra eye problems
  • levitra dose
  • levitra bayer
  • find how to use levitra
  • levitra grapefruit
  • levitra headache
  • cost levitra
  • levitra prescriptions
  • levitra experience
  • levitra doses
  • levitra women
  • generic for levitra
  • cialis viagra levitra
  • order levitra online
  • viagra levitra cialis
  • levitra men video
  • levitra reviews
  • levitra los angeles
  • drug impotence levitra
  • where to buy levitra
  • efficacy levitra
  • key levitra
  • levitra and marijana
  • levitra half life
  • female levitra
  • purchase levitra
  • levitra vardenafil
  • levitra blood urine
  • generic levitra 32
  • levitra online us pharmacy
  • levitra alternative
  • what is thedrug levitra
  • levitra to purchas
  • online levitra
  • buy generic levitra
  • levitra alcohol
  • effects of grapefruit with levitra
  • levitra tabs
  • levitra abuse
  • levitra and exercise
  • levitra pill picture
  • levitra faq
  • levitra vs flomax
  • levitra results
  • women who take levitra
  • levitra pills
  • levitra and heart medicin
  • grapefruit levitra
  • canadian pharmacy levitra
  • levitra guy home page
  • diabetics levitra
  • buy levitra line
  • buy levitra on-line
  • headaches levitra
  • levitra funny video
  • viagra cialic levitra
  • dosage levitra
  • levitra case study
  • soma
  • soma carisoprodol
  • buy soma online
  • buy soma
  • cheap soma
  • drug soma
  • discount soma
  • order soma
  • order soma carisoprodol
  • soma mandal
  • watson soma
  • soma online
  • soma muscle relaxant
  • soma cube
  • prescription drug called soma
  • soma side effects
  • aura soma
  • soma drug
  • effects of soma
  • soma fm
  • soma addiction
  • soma san diego
  • buy soma online without rx
  • soma drug toxicity
  • soma drug history
  • soma effects
  • generic soma
  • somas
  • soma sonic
  • soma cheap without rx
  • soma 350mg
  • cod soma
  • soma without a prescription
  • soma snakeoil
  • soma overdose
  • side effects of soma
  • what is soma
  • buy generic soma
  • soma intimates
  • soma cod
  • soma life
  • akane soma
  • soma carisoprodol online
  • soma on line
  • prescription soma
  • soma no prescription
  • soma discount code
  • soma without prescription
  • is there benzo in soma
  • online soma
  • soma generic
  • big hits of mid america soma
  • soma 350 mg
  • soma groove
  • buy soma online no prescription
  • soma discount codes
  • drug test soma
  • soma hernandez
  • akane soma lasvegas
  • sinful girl and lady soma
  • soma lingerie
  • next day soma
  • soma waterbed
  • soma smashing pumpkins
  • is soma a benzo
  • medication soma
  • buy soma 120 no prescription
  • soma fabrications
  • online pharmacies for valium and somas
  • watson brand soma without prescription
  • soma dosage
  • fda soma 250 mg
  • san francisco gay club soma
  • somas sent cod
  • order soma 32
  • is soma a controlled substance
  • skelaxin vs soma
  • soma cafe
  • soma no rx
  • drug testing times for soma
  • soma bicycles
  • soma medication
  • soma abuse
  • soma cube solution
  • villa soma san francisco
  • buying soma without a prescription
  • soma purchase
  • soma watson brand
  • myth of soma
  • soma bike frame
  • soma overnight
  • soma bras
  • buy soma cheap
  • soma double cross
  • soma silk
  • buy soma without prescription
  • american soma
  • lady soma
  • buying soma online
  • soma online pharmacy
  • buy soma with online prescription
  • order soma order
  • somatropin hgh
  • soma cube directions
  • soma records
  • order soma online
  • soma pictures
  • soma diesel flowering time
  • soma cube shapes
  • soma ship to florida
  • soma fla
  • watson brand soma
  • soma b johari
  • cod soma phone oklahoma
  • soma therapy
  • generic soma online
  • soma without a perscription
  • soma blue
  • soma 250mg
  • where to order soma
  • download soma sonic crazy
  • checkered soma cube puzzle solutions
  • soma by chicos coupons coupons
  • cheapest online soma
  • soma yoga
  • cheap soma and or fiorecet online
  • soma overnight delivery
  • soma 1000 diagram
  • what are somas used for
  • soma triathlon
  • soma watson
  • ahnu soma
  • purchase soma online
  • soma pills
  • temp soma
  • nextday soma
  • is there benzoin soma
  • what is a soma puzzle
  • cheapest soma
  • us soma online
  • overdose soma
  • soma med spa
  • buy soma in florida
  • soma matress
  • soma shampoo
  • soma technology inc
  • somas muscle relaxer
  • current soma discount codes
  • cheap soma online
  • soma by chicos
  • chicos soma
  • akane soma gallery akane soma
  • meat holes soma
  • soma street price
  • mixing soma
  • dangers of soma
  • soma smoothie
  • soma orange county hair remove
  • buy cheap soma
  • soma holiday
  • somas cod
  • soma sonic crazy moon lyrics
  • soma identification
  • soma the drug
  • soma tools
  • soma tech
  • soma in urine
  • soma mg
  • buy cod soma
  • soma technologies
  • soma life hgh
  • english to soma online dictionary
  • soma and drug testing
  • soma theatre san diego
  • cheap somas
  • soma 350
  • soma chicos
  • no overnight prescription soma
  • hgh somatropin
  • buy online soma
  • lcd projectors buy soma
  • soma pill
  • soma fm cryosleep
  • buy soma codeine online
  • drug soma drug
  • auro soma
  • soma cheap cod
  • cheap soma without prescription
  • soma practitioner
  • soma theatre san deigo
  • unichem soma
  • soma technology
  • soma by chicos coupon codes
  • villa soma
  • soma blue response ii
  • soma tramadol
  • soma sale
  • soma shipped to florida
  • ibuprofin and soma
  • cheapest soma online
  • what does generic soma look like
  • soma tablets
  • cod overnight soma
  • soma watson with same day shipping
  • human growth hormone somatropin
  • identify soma
  • brookstone soma pillow
  • soma picture 58
  • soma wholesale
  • soma pill description
  • special report brave world happiness soma
  • soma methodone
  • soma radio
  • soma half ironman
  • soma ingredients
  • jon alan carroll soma literary review
  • soma promo codes
  • xanax and soma interaction
  • akane soma youtube
  • side effects of somas
  • soma sleep apnea pillow
  • buy soma cod
  • vicodin and soma
  • soma locations
  • type of drug is soma
  • soma intamates locations
  • soma collection chelsea
  • soma airmail
  • soma textiles
  • soma drug testing
  • can 5 somas kill you
  • soma drug classification
  • function of a soma
  • soma coupons
  • space station soma
  • cheapest sites for buying soma online
  • cod soma watson
  • soma no prescrition overnight shipping
  • somas for cheap
  • soma internet radio
  • soma steel mountain bike frames
  • bharat sanchar nigam ltd bsnl soma
  • jerri lynn soma
  • pictures of soma the prescription drug
  • what is soma used for
  • soma hair removal
  • ordering soma online overnight delivery
  • soma drug testing times
  • soma erowid
  • soma detox
  • trauma soma
  • soma 325 mg
  • is soma addictive
  • soma bed
  • soma for dogs
  • soma ottawa
  • withdrawal symptoms from soma
  • soma rush
  • generic soma 150 tablets
  • soma life ghp
  • soma health products
  • soma akane
  • soma valium
  • soma moustache handlebar
  • fly northwest airline soma
  • soma life independent distributors
  • ashes of soma lyrics
  • soma st john
  • soma info
  • ashes of soma tabs
  • paxil
  • paxil side effects
  • paxil cr
  • paxil withdrawal
  • paxil withdrawal symptoms
  • st louis paxil lawyers
  • side effects of paxil
  • paxil and weight gain
  • paxil and pregnancy
  • paxil and alcohol
  • paxil weight gain
  • side effects of paxil drug
  • paxil generic
  • paxil withdrawl
  • withdrawal and effexor and paxil