What is your star-sign?
JavaScript, 285 bytes

(My first answer here after lurking here for a while)



d=prompt(m=prompt(e='MutableCardinalFixedAirWaterFireEarthCapricornAquariusPiscesAriesTaurusGeminiCancerLeoVirgoLibraScorpioSagittarius'.match(/[A-Z][a-z]+/g)));alert(m&gt;0&amp;m&lt;13&amp;d&gt;0&amp;d&lt;29-~'202121221212'[--m]?e[n=7+m%12+(d&gt;18-~'121012333413'[m])]+', '+e[n%4+3]+', '+e[n%3]:'Invalid date')




The first prompt() is the month in numerical form, and the second prompt() is the day of the month (Ignore the text of the prompt). Leading zeroes are optional for both. The output is displayed with alert(). (Thanks to bitpwner, Snack, edc65, and core1024 for helping shorten the code.)

Try it above using Stack Snippets or at http://jsfiddle.net/8vq89/5/.

Code with whitespace and comments to explain the confusing parts added:

var m = prompt(), d = prompt(),
e = 'MutableCardinalFixedAirWaterFireEarthCapricornAquariusPiscesAries\
TaurusGeminiCancerLeoVirgoLibraScorpioSagittarius'.match(/[A-Z][a-z]+/g);
alert(m > 0 && m &lt; 13 && d > 0
      & d &lt; 29 - ~'202121221212'[--m] /* ~ is bitwise NOT, which yields -(x + 1). It also
                                         converts a string to a number. Subtracting that
                                         number from 29 gives the number of days in the
                                         month given. */
      ? e[n = 7 + // 7 is added to skip over the 7 qualities and elements in array e.
      m % 12 // The modulus allows dates near the end of December to wrap around to January.
      + (d > 18 - ~'121012333413'[m])] + ', ' +
      e[n % 4 + 3] + /* Qualities and elements follow a pattern, so the modulus determines
                        which one it is. 3 is added to skip over the 3 qualities. */
      ', ' + e[n % 3] : 'Invalid date')