// strings.js

  function wordCount(str) {
        var BG=new Array();
        BG[0]='#333333';
        BG[1]='#777777';
        BG[2]='#000077';
        BG[3]='#0000aa';
        BG[4]='#0000ff';
        BG[5]='#00ffff';
        BG[6]='#00ff00';
        BG[7]='#ffff00';
        BG[8]='#ffaa77';
        BG[9]='#ff7777';
        BG[10]='#ff0000';
 
        var Guiraud = new Array(); 
        var fomenko = new Array();
        var Freq = new Array();
        var Zipf = new Array();
	var NZipf = new Array();
        var finvariant = 0;
        var hstr='на с за к по из у от для во без до о через со при про об ко над из-за из-под под и что но а да хотя когда чтобы если тоже или то есть зато будто не как же даже бы ли только вот то ни лишь ведь вон то-есть нибудь уже либо';

        var foma =hstr.split(/\s+/);
        for ( var i=0;i<foma.length; i++ ){
            fomenko[foma[i]]=1;
        }
        
	var wordLenHisto = new Array();
        var htextsize = str.length;
	str = prepStr(str);
	var tempArray = str.split(' ').sort();
	var count = 1;	// Iterate through all the words
        var wordlensum = 0;
        var wordlensumsq = 0;
        var totalwords = 0;
        var wlhMax=-1;
	for (var i = 0; i < tempArray.length; i++) {		// If an array element with the same name as
           var s = tempArray[i];
           var l = s.length;
           if( l < 30 ){  // Unlikely word length
                if( l > 0 ){
                   wordlensum += l;
                   wordlensumsq += l*l;
                   totalwords++;
                   if( fomenko[s] ){
                       finvariant++;
                   }
                }
                if( Freq[s] > 0 ){ Freq[s]++; }else{ Freq[s]=1; }
                if( wordLenHisto[l] ){
                   wordLenHisto[l]++;
                }else{
                   wordLenHisto[l]=1;
                }
                if( wordLenHisto[l] > wlhMax ){
                    wlhMax=wordLenHisto[l];
                }
           }
	}
 

       if( totalwords > 0 ){
           averl = wordlensum/totalwords;
           varl=wordlensumsq/totalwords-averl*averl;
           varlteor=3.89*averl-10.67;
       }else{
           averl=0;
           varl=0;
           varlteor = 0;
       }
       res = '<b>ОТВЕТ ХУДЛОМЕРА:</b><br>';

var termcolor = '';

AVERMIN=3.89;

if( varlteor - varl > 3.89 ){
   termcolor='#00FF00'; //green == too little dispersion
}else if( (varlteor - varl < -3.89)|| ( averl< AVERMIN) ){
   termcolor='#5555FF'; //blue == too much dispersion. or too short words
}else{
   termcolor='#FF0000';
}

if( averl < AVERMIN ){ 
   averl = AVERMIN 
};

if( averl > 7.9 ){ averl=7.9 };

hwidth=100;

hwidth=Math.floor(25*(averl-AVERMIN));
 
message = '<TABLE WIDTH=100% BORDER=1 CELLSPACING=0 CELLPADDING=0 BGCOLOR=#FFFFDD>';
message += '<TR ALIGN=CENTER VALIGN=TOP>';
message += '<TH COLSPAN=4><small>';
message += '<A href="http://teneta.rinet.ru/2001/hudlomer/">ХУДЛОМЕР</a>';
message += ' СЧИТАЕТ, ЧТО ЭТОТ ТЕКСТ:</small></TH></TR><TR ALIGN=CENTER VALIGN=TOP>';

var c1 = '';
var c2 = '';
var c3 = '';
var c4 = '';


if( hwidth < 25 ){
    c1=' BGCOLOR=' + termcolor + ' ';
}else if( hwidth < 50 ){
    c2=' BGCOLOR=' + termcolor + ' ';
}else if( hwidth < 75 ){
    c3=' BGCOLOR=' + termcolor + ' ';
}else{
    c4=' BGCOLOR=' + termcolor + ' ';
}


  message+=  '<TD WIDTH=25% ' + c1 + '><small>РАЗГОВОРНАЯ РЕЧЬ</small></TD>';
  message+=  '<TD WIDTH=25% ' + c2 + '><small>ХУДЛО</small></TD>';
  message+=  '<TD WIDTH=25% ' + c3 + '><small>ГАЗЕТНАЯ СТАТЬЯ</small></TD>';
  message+=  '<TD WIDTH=25% ' + c4 + '><small>НАУЧНАЯ СТАТЬЯ</small></TD>';
  message+=  '</TR></TABLE>';


  if( hwidth > 0){
     message+='<TABLE WIDTH=100% BORDER=1  cellspacing=0 cellpadding=0><TR><TD WIDTH=';
     message+= hwidth + '%';
     message+=' BGCOLOR=';
     message+= termcolor;
     message+='><font size=1>&nbsp;</font></TD><TD><font size=1>&nbsp;</font></TD></TR></TABLE>';
  }

  res += message;
  res += '<br><br>';
  res += '<b>НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ХАРАКТЕРИСТИКИ ТЕКСТА:</b><br>';
  res += '<table border=1 cellspacing=0 cellpadding=5 width=100%><tr><td>'; 
  res += '<b>СПЕКТР ДЛИН СЛОВ (СПЕКТР МЕНДЕНХОЛЛА)</b><br>';
  res += '<table border=0 cellspacing=0 cellpadding=1>';
  res += '<tr>';
  var hsum=0;
  if( wlhMax > 0 ){
     factor = 150/wlhMax;
     factor1 = 100/totalwords;
  }else{
     factor = 0;
  }
  for ( var i = 1; i<wordLenHisto.length; i++ ){
      if( wordLenHisto[i] ){ // could be = NaN
         h = factor * wordLenHisto[i];
         h1 = factor1 * wordLenHisto[i];
      }else{
         h = 0;
         h1 = 0;
         wordLenHisto[i]=0;
      }
      res += '<td align=center valign=bottom width=22><small>' + Math.round(h1)+ '%</small> <img src=blue.gif width=20 height=' + h + '></td>';
      hsum+=wordLenHisto[i];
  }
  res += '</tr><tr>';
  for ( var i = 1; i<wordLenHisto.length; i++ ){
      res += '<td align=center>' + i + '</td>';
  }
  res += '</tr></table></td></tr><tr><td>';
  res += '<b>По горизонтали:</b> длина слова. &nbsp;&nbsp;&nbsp; <b>По вертикали:</b> Вероятность такой длины.';

  res += '</td></tr></table>';
     res += '<b>Слов: </b>' + totalwords + '<br>';
      res += '<b>Размер текста: </b>' + htextsize + ' (в символах)<br>';
     res += '<b>Суммарная длина всех слов (без учёта пробелов и пунктуации): </b>' + wordlensum + ' (в символах)<br>';
      var spaces = htextsize - wordlensum;
      res += '<b>Пробелы + пунктуация: </b>' + spaces + ' (в символах)<br>';
      iaverl=Math.round(100*averl)/100;
       res += '<b>Средняя длина слова: </b>' + iaverl + ' (в символах)<br>';
      ivarl=Math.round(100*varl)/100;
      ivarlteor=Math.round(100*varlteor)/100;
      res += '<b>Дисперсия: </b>' + ivarl + '<br>';
      res += '<b>Теоретическая дисперсия: </b>' + ivarlteor + '<br><br>';

   finvariant = Math.round( 10000 * finvariant/totalwords)/100;
   res += '<b>Инвариант Фоменко:</b> ' + finvariant + '%<br>';

  var  f1 = 2/Math.log(10);
  ZMax = 1;
  for ( var f in Freq ){
      var ll = Math.ceil( f1 * Math.log(Freq[f]) );
  //     res += 'F:' + f + ' ' + Freq[f] +'<br>'
      if( Zipf[ll] ){
         Zipf[ll] += Freq[f];
         NZipf[ll]++;
      }else{
         NZipf[ll]=1;
         Zipf[ll] = Freq[f];
      }
      var len=f.length;
      if( len > 30 ){
          len=30;
      }
      if( Guiraud[30 * ll + len] ){
         //Guiraud[ 30 * ll+len]+=Freq[f];
         Guiraud[ 30 * ll+len]++;
      }else{
         Guiraud[ 30 * ll+len]=1;
      }
      if( Zipf[ll] > ZMax ){
          ZMax=Zipf[ll];
      }
  }
  if( ZMax ){
     factor=100/ZMax;
  }else{
     factor=0;
  }
  res += '<b>ЗАКОН ЦИПФА:</b><br>';
  res += '<table>';
  res += '<tr>';
  for ( var i=0; i< Zipf.length;i++ ){
     res += '<td align=center valign=bottom>';
     res += '<img src=blue.gif width=20 height=';
     if  ( Zipf[i] ){
        res += factor*Zipf[i];
     }else{
        res += '0';
     }
     res += '>';
     res += '</td>';
  }
  res += '</tr>';
  res += '<tr>';
  for ( var i=0; i< Zipf.length;i++ ){
     res += '<td align=center valign=bottom>';
     if  ( Zipf[i] ){
        res += Zipf[i];
     }else{
        res += '0';
     }
     res += '</td>';
  }
  res += '</tr>';
  res += '<tr>';
  for ( var i=0; i< Zipf.length;i++ ){
     res += '<td align=center valign=bottom>';
     if  ( NZipf[i] ){
        res += NZipf[i];
     }else{
        res += '0';
     }
     res += '</td>';
  }
  res += '</tr>';
  res += '<tr>';
  for ( var i=0; i< Zipf.length;i++ ){
     res += '<td align=center valign=bottom>';
     res += Math.floor(Math.exp(0.5*i*Math.log(10)));
 
     res += '</td>';
  }
  res += '</tr>';
  res += '</table>';
  var f1 = 1/Math.log(2);
  res += '<b>ЗАКОН ГИРО:</b><br>';
  res += '<table cellspacing=0 cellpadding=0 border=1>';
  res += '<tr>';
  for ( var i=Zipf.length-1; i>= 0;i-- ){
  res += '<tr>';
  for ( var l=1; l<= 30; l++ ){
     k = 30*i+l;
     res += '<td align=center width=20 valign=bottom bgcolor=';
     if( Guiraud[k] ){
         ll = Math.ceil( f1 * Math.log(Guiraud[k]) );
         if( ll >= BG.length ){
            ll=BG.length-1;
         }
     }
     if  ( Guiraud[k] ){
        res += BG[ll];
     }else{
        res += '#ffffff';
     }
     res += '> &nbsp;';
     if( Guiraud[k] ){
        res += Guiraud[k];
     }
     res += '</td>';
  }
  res += '</tr>';


  }
  res += '<tr>';
  for ( var l=1; l<= 30; l++ ){
     res += '<td align=center width=20 valign=bottom bgcolor=';
     res += '#ffffff';
     res += '> &nbsp;';
     res += l;
     res += '</td>';
  }
  res += '</tr>';

  res += '</table>';
 
  if( totalwords < 75 ) {
     res = 'Исследуемый худломером текст должен содержать не менее 75 слов.<br>';
  }
  res += '<hr><a href=gb0.html>Обсудить</a> || ';
  res += '<a href=http://teneta.rinet.ru/2001/america/CAM/992347022171007.html>Проголосовать</a> || ';
  res += '<a href=http://teneta.rinet.ru/cgi-bin/teneta2001survey.cgi?survey_name=america/CAM/992347022171007>Результаты голосования</a>';
  
   return res;
}

// Define a function to format strings for easier manipulation
//
//
//
function prepStr(str) {
	str = str.toLowerCase();
	str = str.replace(/['"-]/g, "");
	//str = str.replace(/\W/g, " ");
   str = str.replace(/[^абвгдеёжзийклмнопрстуфхцчшщъыьэюя\-a-z]/g,' ');

	str = str.replace(/\s+/g, " ");
	return str;	
}

