C, 210 bytes
i,k,t,s;f(char*g){char*l=malloc(strlen(g)),*p=g;for(i=s=t=0;*p;*p>35&&(t?l[i++]=*p:1)&&(*p=32),*p++-35&t&&++s)t=*p-35?t:!t;for(k=i;i;t&*p==32&&(*p=l[--i]))t=*--p-35?t:!t;printf("%s\n%d",g,k?k-s?k*2<s?1:2:3:0);}
Outputs 0 for empty glass, 1 for mostly empty, 2 for mostly full, and 3 for full.
First loops through the input string counting the space inside the glass, marking down letters that are inside the glass, and changing all letters to spaces. Then loops through the string backwards placing all the letters that were in the glass at the bottom of the glass.
Unrolled:
i,k,t,s;
f(char*g)
{
char *l=malloc(strlen(g)), *p=g;
for (i=s=t=0; *p; *p>35&&(t?l[i++]=*p:1)&&(*p=32), *p++-35&t&&++s)
t = *p-35 ? t : !t;
for (k=i; i; t&*p==32 && (*p=l[--i]))
t = *--p-35 ? t : !t;
printf("%s\n%d", g, k?k-s?k*2<s?1:2:3:0);
}