// MiscLib 
// Written by Eddie Hartman, IBM
//
// This library includes a number of convenience functions for left/right/center
// justifying strings. There are also a handful of functions for returning
// External Property values, plus a few functions for converting a string
// to a series of Hexidecimal digits (string) and vice versa.
//

task.logmsg("* Miscellaneous Function Library Included : MiscLib vrs. 1.0");

// This global variable is used by the functions below
_gblBlankStr = "                                                                                                                                                       ";

// Array used for Hex conversions
_hexChars = "0123456789ABCDEF";

//
// function LJ( str, len )				// left-justifies str in a string with length = len
// function RJ( str, len )				// right-justifies str in a string with length = len
// function CJ( str, len )				// center-justifies str in a string with length = len
// function PadR( str, len )		    // alias for LJ()
// function PadL( str, len )		    // alias for RJ()
// function PadC( str, len )		    // alias for CJ()
// function getExtProp( propname )		// returns propname value from External Properties (ExtProp)
// function getExtPropPath( propname )	// returns ExtProp (propname) as dir. path with slash at end (/)
// function getExtPropNumber( propname )// returns ExtProp (propname) as number (if possible)
//

// Pad out a string to the right with spaces - e.g. left-justify str in len spaces
//
function LJ( str, len ) // Returns JS String
{
	str = String(str); // Cast to JS String object, just in case
	if ( len <= str.length )
		return str
	else
		return (str + _gblBlankStr).substr( 0, len );
}


// Pad out a string to the left with spaces - e.g. right-justify str in len spaces
//
function RJ( str, len ) // Returns JS String
{
	str = String(str); // Cast to JS String object, just in case
	if ( len <= str.length )
		return str
	else
		return padR( "", len-str.length ) + str; 
}


// Pad out a string on both sides to length (parameter = len) - e.g. centers str in len spaces
//
function CJ( str, len ) // Returns JS String
{
	str = String(str); // Cast to JS String object, just in case
	if ( len <= str.length )
		return str
	else
	{
		_rightPad = Math.floor((len-str.length) / 2);
		_leftPad = (len-str.length) - _rightPad;
		return padR( "", _leftPad ) + str + padR( "", _rightPad ); 
	}
}


// Return an External Property value
//
function getExtProp( propname ) // Returns Java String
{
    var retVal = new java.lang.String("");

	try
	{
		retVal = main.getMetamergeConfig().getExternalProperties().getParameter( propname );
	}
	catch (errMsg)
	{
		// Do nothing if the above fails
	}

	return retVal;
}



// Return an External Property value as a directory path
//
function getExtPropPath( propname ) // Returns Java String
{
    var retVal = new java.lang.String("");

	try
	{
		retVal = main.getMetamergeConfig().getExternalProperties().getParameter( propname );
	}
	catch (errMsg)
	{
		return "";
	}

	if ( (retVal.indexOf("\\") != (retVal.length-1)) || (retVal.indexOf("/") != (retVal.length-1)) )
		retVal = retVal + "/";

	return retVal;
}



// Return an External Property as a number value
//
function getExtPropNumber( propname ) // Returns Java String
{
    var retVal = "0";

	try
	{
		retVal = main.getMetamergeConfig().getExternalProperties().getParameter( propname );
	}
	catch (errMsg)
	{
		// Do nothing if the above fails
	}

	return retVal - 0;  // Subtracting 0 turns this from string into a number
}


// Aliases for the above String functions
//
function padR( str, len ) // Returns JS String
{
   return LJ( str, len )
}

function padL( str, len ) // Returns JS String
{
   return RJ( str, len )
}

function padC( str, len ) // Returns JS String
{
   return CJ( str, len )
}


// Converts a number to Hex
//
function decToHex(val)
{
   firstDigit = Math.floor(val / 16);
   secondDigit = val % 16;

// task.logmsg("miscLib:decToHex - val: " + val + " = " + firstDigit + "*16 + " + secondDigit);

   return _hexChars[firstDigit] + _hexChars[secondDigit];
}


// Converts a two-digit hex value (string) to decimal
//
function hexToDec(hVal)
{
// task.logmsg("miscLib:hexToDec - hVal : \"" + hVal + "\" = " + (_hexChars.indexOf(hVal[0])*16 + _hexChars.indexOf(hVal[1])));

   return _hexChars.indexOf(hVal[0])*16 + _hexChars.indexOf(hVal[1]);
}


// Converts a string to hex representation
//
function toHex(str)
{
   var hStr = "";
   str = String(str); // Convert to JS String

   for (var i=0; i<str.length; i++)
      hStr = hStr+decToHex(str[i].charCodeAt());

   return hStr;
}

// Converts a series of hex characters to a string.
// Note: hStr parameter must be an even number of two-digit
//       hex numbers.
//
function fromHex(hStr)
{
   var str = "";
   hStr = String(hStr).toUpperCase(); // Convert to JS String

   for (var i=0; (i+1)<hStr.length; i=i+2)
      str = str + String.fromCharCode(hexToDec(hStr[i]+hStr[i+1]));
                                   
   return str;
}

