/*
  Code from "Developing Featherweight Web Services with JavaScript"
      http://feather.elektrum.org/
  (c)An Elektrum Press, retain this notice
      License: http://feather.elektrum.org/appendix/licenses.html
*/

// -----------------------------------
// extend String objects to do ucFirst() like Perl
String.prototype.ucFirst = function () {
  return this.substr(0,1).toUpperCase() +
    this.substr(1,this.length);
}

// -----------------------------------
// Configuration variables we only need to load once
var loremIpsum = 
 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc' +
 'feugiat. Sed suscipit libero nec sem. Vestibulum aliquet neque nec' +
 'nisl. Fusce turpis tortor, blandit in, posuere at, hendrerit vitae,' +
 'magna. Suspendisse nulla purus, dapibus vel, venenatis sed, fermentum' +
 'vitae, nulla. In suscipit, nulla sagittis cursus tempor, arcu pede' +
 'vestibulum lacus, at semper tortor ligula eget erat. Cras scelerisque' +
 'leo eu erat. Quisque egestas, turpis vel facilisis nonummy, mauris' +
 'enim rutrum quam, vitae pharetra massa quam ac felis. Vestibulum pede' +
 'quam, semper vitae, interdum vel, pulvinar ut, diam. Mauris aliquam' +
 'elementum pede. Suspendisse feugiat enim sit amet erat facilisis' +
 'sagittis. Duis laoreet turpis at risus. Sed at est et dolor tristique' +
 'scelerisque. Maecenas dui. Vivamus ut lorem. Vestibulum lacus quam,' +
 'tempus et, luctus at, scelerisque nec, libero';

var Words = loremIpsum.split(/\W+/);

// retrieve the [SCRIPT OBJ] currently being executed/called
var scripts = document.getElementsByTagName('script');
var scriptIndex = scripts.length - 1;
var myScript = scripts[scriptIndex];

var queryString = myScript.src.replace(/^[^\?]+(\?)*/,'');
var params = parseQuery( queryString );

var Delims = new Object({ p:['<p>','</p>']
                         ,div:['<div>','</div>']
                         ,blockquote:['<blockquote>','</blockquote>']
                         ,br:['<br />']
                         ,brbr:['<br /><br />']
                         ,plain:["\n\n"]
                         });

var Types = new Object({ para:1, email:1, username:1
                        ,url:1, title:1, name:1 });
 
var type = params['type'] || 'para';

var minP = params['pc'] ? Number(params['pc'].split(',')[0]) : 0;
var maxP = params['pc'] ? Number(params['pc'].split(',')[1]) : 0;

var minW = params['wc'] ? Number(params['wc'].split(',')[0]) : 0;
var maxW = params['wc'] ? Number(params['wc'].split(',')[1]) : 0;

var Class = params['class'];

var delim = params['delim'];
var Delimiter =  ( delim && Delims[delim] ) ? Delims[delim] : Delims['p'];
if ( Class && Delimiter[0].match(/^</) ) {
    Delimiter[0] = Delimiter[0].replace(/.$/, ' class="' + Class + '">');
}

if ( type && Types[type] ) {
  switch ( type ) {
    case 'para' : document.write( paragraphs(minP,maxP,minW,maxW) ); break;
    case 'url'  : document.write( url() ); break;
    case 'title': document.write( title() ); break;
    case 'name' : document.write( fullName() ); break;
    case 'email': document.write( email() ); break;
    case 'username': document.write( username() ); break;
  }
}
else
{
  document.write("<div style='color:#930'>Misconfigured greeking! " +
                 "Invalid or missing 'type' parameter.</div>");
}

// script ends; functions begin ------

// -----------------------------------
function randWord () {
    var email = '';
    var index = _randNum( Words.length - 1 );
    return Words[index].toLowerCase();
}

// -----------------------------------
function paragraphs ( minP, maxP, minW, maxW ) {
   if ( ! minP && ! maxP )  {
      minP = 1;
      maxP = 8;
   }
   else if ( ( ! maxP ) || ( maxP < minP ) ) {
      maxP = minP;
   }

   var paraCount = _randNum( maxP, minP );

   var paras = new Array ();

   while ( paraCount-- ) {
      if ( Delimiter.length == 2 ) {
         paras.push( Delimiter[0] + para(minW,maxW) + Delimiter[1] );
      } else {
         paras.push( para(minW,maxW) );
      }
   }
   if ( Delimiter.length == 2 ) {
      return paras.join("\n");
   } else {
      return paras.join(Delimiter[0]);
   }
}

// -----------------------------------
function para ( minW,maxW ) {
   if ( ! minW && ! maxW )  {

      minW = _randNum(20) + 10;
      maxW = _randNum(40) + minW;
   }
   else if ( ( ! maxW ) || ( maxW < minW ) ) {
      maxW = minW;
   }

   var wordCount = _randNum(minW,maxW);

   var para = new Array ();
   while ( wordCount-- ) {
      para.push( randWord() );
   }
   para[0] = para[0].ucFirst();
   return para.join(' ') + '.';
}

// -----------------------------------
function title () {
  var wordCount = _randNum(8);
  var title = new Array ();
  while ( wordCount-- ) {
    var word = randWord().ucFirst();
    if ( word.length < 5 && Math.random() < .7 ) {
      word = word.toLowerCase();
    }
    title.push( word );
  }
  title[0] = title[0].ucFirst();
  var lastIndex = title.length - 1;
  if ( lastIndex > 0 ) title[lastIndex] = title[lastIndex].ucFirst();
  return title.join(' ');
}

// -----------------------------------
function email () {
   var user = username();
   var host = server();
   return user + '@' + host;
}

// -----------------------------------
function url () {
   var host = server();
   var path = new Array ();

   var pathParts = _randNum(6) - 1;
   while ( pathParts-- ) {
      path.push( randWord() );
   }
   return 'http://' + host + '/' + path.join('/');
}

// -----------------------------------
function fullName () {
   var name = new Array ();
   var nameParts = _randNum(2,3);
   while ( nameParts-- ) name.push( randWord().ucFirst() );
   return name.join(' ');
}

// -----------------------------------
function username () {
   var joins = new Array ( '-', '.', '_', '' );
   var joinChar = joins[ _randNum( joins.length ) - 1 ];
   var nameParts = _randNum(3);
   var username = new Array ();
   while ( nameParts-- ) username.push( randWord() );
   return username.join( joinChar );
}

// -----------------------------------
function server () {
   var hostParts = _randNum(2,3);
   var host = new Array ();
   while ( hostParts-- ) {
      host.push( randWord() );
   }
   return host.join('.');
}

// -----------------------------------
function _randNum ( min,max ) {
   if ( ! min ) return false
   if ( ! max || max < min ) // 1 .. min
   {
      return Math.floor( Math.random() * min ) + 1;
   }
   else // min .. max
   {
      var range = max - min + 1;
      return Math.floor( Math.random() * range ) + min;
   }
}

// -----------------------------------
function parseQuery ( query ) {  
   if ( ! query ) return false;
   var Pairs = query.split(/[;&]/);
   var Params = new Object ();
   for ( var i = 0; i < Pairs.length; i++ ) {
      var KeyVal = Pairs[i].split('=');
      if ( ! KeyVal || KeyVal.length != 2 ) continue;
      var key = unescape( KeyVal[0] );
      var val = unescape( KeyVal[1] );
      val = val.replace(/\+/g, ' ');
      Params[key] = val;
   }
   return Params;
}
