Esta es una función que me calcula diferencia entre 2 fechas, tomando en cuenta años biciestos, que al Javascript se le escapan... no se si te soluciona la vida, pero te puede servir para marearte una rato y ver su comportamiento..
    
Código Javascript
:
Ver original// JavaScript Document
function mostrarDias(){
    
    var fechaInicio = document.getElementById("fechaInicio").value;
    var fechaFin = document.getElementById("fechaFin").value;
 
    if (fechaInicio.length != 10 || fechaFin.length != 10){
        document.getElementById("diasDisfrutados").value = 0;
    }
    
    else{
        
        //Separamos las fechas en dias, meses y años
        var diaInicio=fechaInicio.substring(0,2);
        var mesInicio=fechaInicio.substring(3,5);
        var anoInicio=fechaInicio.substring(6,10);
        
        var diaFin=fechaFin.substring(0,2);
        var mesFin=fechaFin.substring(3,5);
        var anoFin=fechaFin.substring(6,10);
            
        //Los meses empiezan en 0 por lo que le restamos 1
        mesFin = mesFin -1;
        mesInicio = mesInicio -1;
        
        //Creamos una fecha con los valores que hemos sacado
        var fInicio =  new Date(anoInicio,mesInicio,diaInicio);
        var fFin =  new Date(anoFin,mesFin,diaFin);
        
        diasTotal = 0;
    
        if(fFin>fInicio){
            
            //Para sumarle 365 días tienen que haber 2 años de diferencia
            //Si no solamente sumo los días entre meses
            anoInicio++;
            while(anoFin>anoInicio){
            
            alert("Entro aquí si hay dos años de diferencia");
            
            if(esBisiesto(anoFin))
            {
                dias_e_anio=366;
            }
            else
                {
                    dias_e_anio=365;
                }
            diasTotal = diasTotal + dias_e_anio;
            anoFin--;
            }
            
            //Para sumarle los días de un mes completo, tengo que ver que haya diferencia de 2 meses
            mesInicio++;            
            while(mesFin>mesInicio){
                dias_e_mes = getDays(mesFin-1,anoFin);
                diasTotal = diasTotal + dias_e_mes;
                mesFin--;
            }
            
            //Solamente falta sumar los días 
            mesInicio--;
            if(mesInicio==mesFin){
                diasTotal=diaFin-diaInicio+1;
            }
            else{
                
                //Saco los días desde el mesInicio hasta fin de mes
                dias_e_mes=getDays(mesInicio,anoInicio);
                diasTotal = diasTotal + (dias_e_mes-diaInicio) +1;
                //ahora saco los días desde el principio de mesFin hasta el día
                diasTotal = diasTotal + parseInt(diaFin);
                
            }           
        }
        
        //Si la fechaFin es mayor
        else if (fechaFin<fechaInicio){
            alert("La fecha de fin no puede ser mayor que la fecha de inicio");
            diasTotal=0;        
        }
        
        //Si las fechas son iguales
        else{
            diasTotal = 1;
        }
 
    }
}
 
function esBisiesto(ano) {
    if (ano % 4 == 0)
    return true
    /* else */
    return false
} 
 
function getDays(month, year) {
 
    var ar = new Array(12)
    ar[0] = 31 // Enero
    if(esBisiesto)
        {
            ar[1]=29
        }
    else
        {
            ar[1]=28
        }
    ar[2] = 31 // Marzo
    ar[3] = 30 // Abril
    ar[4] = 31 // Mayo
    ar[5] = 30 // Junio
    ar[6] = 31 // Julio
    ar[7] = 31 // Agosto
    ar[8] = 30 // Septiembre
    ar[9] = 31 // Octubre
    ar[10] = 30 // Noviembre
    ar[11] = 31 // Diciembre
 
    return ar[month];
    }