/*
 * Collection of helpful javascript classes/methods
 *
 * @author Markus Kobler
 */

var StringUtil = {

  upperCaseFirstChar: function( text ) {
    var ch = text.charAt( 0 ).toUpperCase();
    return ch + text.substring( 1, text.length);
  },

  lowerCaseFirstChar: function( text ) {
    var ch = text.charAt( 0 ).toLowerCase();
    return ch + text.substring( 1, text.length);
  },

  signValue: function( value ) {
    return value > 0 ? "+"+value : value;
  },

  _numPostfix: ["st","nd","rd","th"],

  formatPos: function( value ) {
    var postfix = (value-1) % 10;
    if( postfix > 3 ) { postfix = 3 }
    return value + StringUtil._numPostfix[postfix];
  },

  fixed: function( value, places ) {
    return value.toFixed ? value.toFixed( places ) : value;
  }

};

var HtmlUtil = {

  createElement: function( name /*, [ cssClass | parentNode ]*/ ) {
    var node = document.createElement( name );
    for( var i=1; i<arguments.length; i++ ) {
      var param = arguments[i];
      if( typeof param == "string" ) {
        node.className = param;
      } else if( param && param.appendChild ) {
        param.appendChild( node );
      }
    }
    return node;
  },

  createTextElement: function() {
    var name;
    var cssClass;
    var parent;
    var text;
    
    switch( arguments.length ) {
      case 2:
        name = arguments[0];
        text = arguments[1];
        break;
      case 3:
        name = arguments[0];
        if(arguments[1].appendChild) {
          parent = arguments[1];
        } else {
          cssClass = arguments[1];
        }
        text = arguments[2];
        break;
      case 4:
        name = arguments[0];
        cssClass = arguments[1];
        parent = arguments[2]
        text = arguments[3];
        break;
      default:
        alert( "createTextElement invalid arguments [" +arguments.length+"]" );        
        break;
    }

    var node = HtmlUtil.createElement( name, cssClass, parent );
    node.appendChild( document.createTextNode( text ) );
    
    return node;
  },

  clearChildren: function( element ) {
    while( element.hasChildNodes() ) {
      element.removeChild( element.childNodes[0]);
    }
  }

};

var FunctionUtil = {

  scopedPointer: function( thisObj, func ) {
    var f = typeof func == "string" ? thisObj[func] : func;
    return function() {
      f.apply(thisObj, arguments );
    };
  }

};