function pl(AStr)
{
  var e = document.createElement("DIV");
  e.innerHTML = AStr;
  document.body.appendChild(e);
}

function dumpScalarValue(AObject)
{
  var result = '';
  var propertyValue = AObject;
  if (typeof(AObject) == 'string')
    propertyValue = '\'' + propertyValue + '\'';
  result += (AObject === null ? '' : '(' + typeof(AObject) + ') ') + propertyValue;
  return result;
}

function dumpProperties(AObject, AObjectName, ASeparator)
{
  if (!ASeparator)
    ASeparator = ";\n";
  var result = '';

  for (propertyName in AObject)
    result += (AObjectName ? AObjectName + '.' : '.') + propertyName + ' = ' + dumpScalarValue(AObject[propertyName]) + ASeparator;

  result += (AObjectName ? AObjectName + ' = ' : '') + dumpScalarValue(AObject) + ASeparator;

  return result;
}

function vd(AObject, AObjectName)
{
  alert(dumpProperties(AObject, AObjectName));
  return AObject;
}

function isImage(fileName)
{
  if (!fileName) return false;

  var imageExtensions = '.gif.jpg.jpeg.png.bmp.tif.tiff';
  //var imageExtensions = '.jpg.jpeg.png.bmp.tif.tiff';

  dots = fileName.split('.');
  ext = '.' + dots[dots.length - 1];

  return (imageExtensions.indexOf(ext) > -1);
}

function getFileName(filePath)
{
  pathElements = filePath.split('\\');
  if (pathElements.length == 1)
    pathElements = filePath.split('/');

  lastElement = pathElements[pathElements.length - 1];
  fileNameElements = lastElement.split('.');

  return fileNameElements[0];
}

function getFileNameWithExtension(filePath)
{
  pathElements = filePath.split('\\');
  if (pathElements.length == 1)
    pathElements = filePath.split('/');

  lastElement = pathElements[pathElements.length - 1];

  return lastElement;
}

function explodeSelectOptions(selectElement)
{
  var result = '';
  var length = selectElement.options.length;
  for (var i=0; i<length; i++) {
    if (i > 0) result = result + ',';
    result = result + selectElement.options[i].value;
  }

  return result;
}

function selectOption(element, value)
{
  for (var i=0; i<element.options.length; i++)
    if (element.options[i].value == value) {
      element.selectedIndex = i;
      break;
    }
}

function selectExistsValue(element, value)
{
  exists = false;

  for (var i=0; i<element.options.length; i++)
    if (element.options[i].value == value) {
      exists = true;
      break;
    }

  return exists;
}

function replaceURLMacros(url, map)
{
  var result = url;

  for (var i in map) {
    var pattern = '%25' + i + '%25';
    var str = map[i];
    var re = new RegExp('/' + pattern + '/gim');
    result = result.replace(pattern, str);
  }

  return result;
}

// name - name of the cookie
// value - value of the cookie
// [expires] - expiration date of the cookie (defaults to end of current session)
// [path] - path for which the cookie is valid (defaults to path of calling document)
// [domain] - domain for which the cookie is valid (defaults to domain of calling document)
// [secure] - Boolean value indicating if the cookie transmission requires a secure transmission
// * an argument defaults when it is assigned null as a placeholder
// * a null placeholder is not required for trailing omitted arguments
function setCookie(name, value, expires, path, domain, secure) {
  var curCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  document.cookie = curCookie;
}

// name - name of the desired cookie
// * return string containing value of specified cookie or null if cookie does not exist
function getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}

function firstTimeInSession(AName)
{
  AName = 'sft_' + AName;
  var firstTime = !getCookie(AName, 1);
  if (firstTime)
    setCookie(AName, 1);
  return firstTime;
}

function getPlatformInfoArray()
{
  return {
    'dc': document.defaultCharset,
    'l':   navigator.language,
    'bl':  navigator.browserLanguage,
    'sl':  navigator.systemLanguage,
    'ul':  navigator.userLanguage,

    'sx': screen.width,
    'sy': screen.height,
    'sc': screen.colorDepth
    }
}

function arrayToHTMLAttributesSimple(AArray, ATagName)
{
  var result = '';
  for (var i in AArray)
    result += (result ? ' ' : '') + i + '="' + (AArray[i] ? AArray[i] : '') + '"';
  if (ATagName)
    result = '<' + ATagName + (result ? ' ' + result : '') + '>';
  return result;
}

function logPlatformInfo()
{
  setCookie('pi', arrayToHTMLAttributesSimple(getPlatformInfoArray(), 'pi'));
}

function in_array()
{
  var result = false;
}

function arrayFlip(AArray, AToTrue)
{
  var result = {};
  if (typeof(AArray) == 'object')
    for (var i in AArray)
      result[AArray[i]] = (AToTrue ? true : i);
  return result;
}

function splitToKeys(AStr, ASeparator)
{
  return ((typeof(AStr) == 'string') ? arrayFlip(AStr.split(ASeparator), true) : null);
}

function arrayCopy(ASource, AArrayFactory)
{
  if ((ASource === null) || (typeof(ASource) != 'object'))
    return ASource;
  var result = (AArrayFactory ? AArrayFactory() : new Array());
  for (var i in ASource)
    result[i] = arrayCopy(ASource[i], AArrayFactory);
  return result;
}