/**
 * Javascript misc functions library
 *
 * @package gcms
 * @version 2.0
 * @author Pawel Zmyslowski <hocus@dronet.pl>
 */


G_changeObjectDisplayNiceAnimation = true

G_changeObjectDisplayNiceObject = null
G_changeObjectDisplayNiceShow = null
G_changeObjectDisplayNiceDiffHeight = 0
G_changeObjectDisplayNiceDiffWidth = 0
G_changeObjectDisplayNiceFinalHeight = 0
G_changeObjectDisplayNiceFinalWidth = 0
G_changeObjectDisplayNiceDeltaParameter = 4
G_changeObjectDisplayNiceTimeout = 10
G_changeObjectDisplayNiceFunctionA = 0.6
G_changeObjectDisplayNiceFunctionB = 0.1
G_changeObjectDisplayNiceOldOverflow = null

function px(value)
{
  return value.toString() + 'px'
}
 
function countDiff(old)
{
  var d = new Date()
  diff = d.getTime() - old
  alert(diff.toString())
}

function checkTimeout()
{
  var d = new Date()
  setTimeout("countDiff("+d.getTime().toString()+")",1)
}  

function speedFunction(input,a,b)
{
  if ( ! (input >= 0 && input <= 1 ) )
  {
    // alert ( "Input = " + input.toString() + ", this shouldn't have happened") 
    return 0
  } 
   
  if ( input <= 0.5)
    return a * input + b
  else 
  {
    c = 1 - input
    return speedFunction(c,a,b) 
  }
}

function inputOnKeyPress(e)
{
  if ( ! e )
    e = window.event
  if ( e.keyCode == 13 )
  {
    if ( e.preventDefault )
      e.preventDefault()
    e.returnValue = false  
  }
}

function changeObjectInProgress()
{
  return (G_changeObjectDisplayNiceObject != null)
}

function changeObjectDisplayNiceTimer()
{
  var again = true
  var readyWidth = false
  var readyHeight = false
  if ( G_changeObjectDisplayNiceObject == null )
    return;


  if ( G_changeObjectDisplayNiceUseHeight )
  {
    var currentHeight = G_changeObjectDisplayNiceObject.currentHeight
    var positionHeight = currentHeight / G_changeObjectDisplayNiceDiffHeight
    var changeHeight = Math.round(G_changeObjectDisplayNiceDeltaHeight * speedFunction(positionHeight,G_changeObjectDisplayNiceFunctionA,G_changeObjectDisplayNiceFunctionB ))
    if ( changeHeight < 1 )
      changeHeight = 1
    if ( ! G_changeObjectDisplayNiceShow)
      changeHeight = -changeHeight
    var newHeight = currentHeight + changeHeight

    if ( G_changeObjectDisplayNiceShow && newHeight >= G_changeObjectDisplayNiceFinalHeight )
    {
      readyHeight = true
      newHeight = G_changeObjectDisplayNiceFinalHeight        
    }
    if ( ! G_changeObjectDisplayNiceShow && newHeight <= 0 )
    {
      readyHeight = true
      newHeight = 0     
    }
    G_changeObjectDisplayNiceObject.currentHeight = newHeight
    G_changeObjectDisplayNiceObject.style.height = px(newHeight)
  }
  else
    readyHeight = true

///////////////////

  if ( G_changeObjectDisplayNiceUseWidth )
  {
    var currentWidth = G_changeObjectDisplayNiceObject.currentWidth
    var positionWidth = currentWidth / G_changeObjectDisplayNiceDiffWidth
    var changeWidth = Math.round(G_changeObjectDisplayNiceDeltaWidth * speedFunction(positionWidth,G_changeObjectDisplayNiceFunctionA,G_changeObjectDisplayNiceFunctionB ))
    if ( changeWidth < 1 )
      changeWidth = 1
    if ( ! G_changeObjectDisplayNiceShow)
      changeWidth = -changeWidth
    var newWidth = currentWidth + changeWidth

    if ( G_changeObjectDisplayNiceShow && newWidth >= G_changeObjectDisplayNiceFinalWidth )
    {
      readyWidth = true
      newWidth = G_changeObjectDisplayNiceFinalWidth        
    }
    if ( ! G_changeObjectDisplayNiceShow && newWidth <= 0 )
    {
      readyWidth = true
      newWidth = 0     
    }
    G_changeObjectDisplayNiceObject.currentWidth = newWidth
    G_changeObjectDisplayNiceObject.style.width = px(newWidth)
  }
  else
    readyWidth = true


//////////////////////////////

  if ( G_changeObjectDisplayNiceShow && G_changeObjectDisplayNiceScrollOnResize )
  {
    var coords = getXY(G_changeObjectDisplayNiceObject)
    var objectLeft = coords[0]
    var objectTop = coords[1]

    var pageHeight = getInnerHeight()
    var pageWidth = getInnerWidth()
    var scrollX = document.documentElement.scrollLeft
    var scrollY = document.documentElement.scrollTop

    var diffHeight = (objectTop + newHeight) - (pageHeight + scrollY)
    var diffWidth = (objectLeft + newWidth) - (pageWidth + scrollX)

    if ( diffHeight + scrollY > objectTop )
      diffHeight = objectTop - scrollY

    if ( diffWidth + scrollX > objectLeft )
      diffWidth = objectLeft - scrollX


    if ( diffHeight < 0 )
      diffHeight = 0
    if ( diffWidth < 0 )
      diffWidth = 0
//alert("("+objectTop+","+newHeight+") - ("+pageHeight+","+scrollY+")")
    scrollBy(diffWidth, diffHeight)
  }


  if ( readyHeight && readyWidth )
  {
  //alert("koniec " + G_changeObjectDisplayNiceObject.style.height )
    if ( ! G_changeObjectDisplayNiceShow ) 
    {
      G_changeObjectDisplayNiceObject.style.display = "none"
    } 
    else // show
    {
    }
    G_changeObjectDisplayNiceObject.style.overflow = G_changeObjectDisplayNiceOldOverflow
    G_changeObjectDisplayNiceShow = null
    G_changeObjectDisplayNiceDiffHeight = 0
    G_changeObjectDisplayNiceDiffWidth = 0
    G_changeObjectDisplayNiceFinalHeight = 0
    G_changeObjectDisplayNiceFinalWidth = 0
    G_changeObjectDisplayNiceOldOverflow = null

    if ( G_changeObjectDisplayNiceSetAutoSize )
    {
      G_changeObjectDisplayNiceObject.style.width = "auto"
      G_changeObjectDisplayNiceObject.style.height = "auto"
    }   
    if ( G_changeObjectDisplayNiceClearInnerHTML )
    {
      G_changeObjectDisplayNiceObject.innerHTML = ""
    }
    if ( G_changeObjectDisplayNiceRemoveObject )
    {
      G_changeObjectDisplayNiceObject.parentNode.removeChild(G_changeObjectDisplayNiceObject)
    }
    G_changeObjectDisplayNiceObject = null
  }
  else
    setTimeout("changeObjectDisplayNiceTimer()", G_changeObjectDisplayNiceTimeout)
    
}

function changeObjectDisplayNice(id, newDisplay, height, width, parameter, scrollOnResize)
{

  if ( ! G_changeObjectDisplayNiceAnimation )
  {
    obj = getObj(id)
    obj.style.display = newDisplay
    if (newDisplay != 'none')
    {
      if ( setAutoSize ) 
      {
        if ( height )
          obj.style.height = 'auto'
        if ( width ) 
          obj.style.width = 'auto'
      }
      else
      {
        obj.style.height = px(height)
        obj.style.width = px(width)
      }
    }
    return
  }
  var show = true
  if ( newDisplay == 'none' )
  {
    show = false
  }
  var currentObject = getObj(id)
  if ( G_changeObjectDisplayNiceObject != null && G_changeObjectDisplayNiceObject != currentObject)
    return;
    
  G_changeObjectDisplayNiceObject = currentObject
  G_changeObjectDisplayNiceUseHeight = height
  G_changeObjectDisplayNiceUseWidth = width
  G_changeObjectDisplayNiceClearInnerHTML = false
  G_changeObjectDisplayNiceSetAutoSize = false
  if ( scrollOnResize ) 
    G_changeObjectDisplayNiceScrollOnResize = true
  else
    G_changeObjectDisplayNiceScrollOnResize = false

  G_changeObjectDisplayNiceSetAutoSize = false
  G_changeObjectDisplayNiceClearInnerHTML = false
  G_changeObjectDisplayNiceRemoveObject = false
  switch ( parameter )
  {
    case 'autosize': G_changeObjectDisplayNiceSetAutoSize = true; break
    case 'clear' : G_changeObjectDisplayNiceClearInnerHTML = true; break
    case 'remove' : G_changeObjectDisplayNiceRemoveObject = true; break
  }
  if ( show )
  {
    G_changeObjectDisplayNiceOldOverflow = G_changeObjectDisplayNiceObject.style.overflow
    G_changeObjectDisplayNiceObject.style.overflow = "hidden"

    G_changeObjectDisplayNiceDeltaHeight = height / G_changeObjectDisplayNiceDeltaParameter
    G_changeObjectDisplayNiceDeltaWidth = width / G_changeObjectDisplayNiceDeltaParameter 
    G_changeObjectDisplayNiceDiffHeight = height 
    G_changeObjectDisplayNiceDiffWidth = width
    G_changeObjectDisplayNiceFinalHeight = height
    G_changeObjectDisplayNiceFinalWidth = width
    // ???
//    if ( currentObject.style.display == 'none' )
    {
      if ( height )
      {
        G_changeObjectDisplayNiceObject.style.height  = 0
        G_changeObjectDisplayNiceObject.currentHeight = 0
      }
      if ( width ) 
      {
        G_changeObjectDisplayNiceObject.style.width  = 0
        G_changeObjectDisplayNiceObject.currentWidth = 0
      }
    }

    G_changeObjectDisplayNiceObject.style.display  = newDisplay
  }
  else
  {
    // enabling hasLayout http://www.satzansatz.de/cssd/onhavinglayout.html
    G_changeObjectDisplayNiceObject.style.zoom = "100%"
    G_changeObjectDisplayNiceDeltaHeight = G_changeObjectDisplayNiceObject.clientHeight / G_changeObjectDisplayNiceDeltaParameter
    G_changeObjectDisplayNiceDeltaWidth = G_changeObjectDisplayNiceObject.clientWidth / G_changeObjectDisplayNiceDeltaParameter
    G_changeObjectDisplayNiceDiffHeight = G_changeObjectDisplayNiceObject.clientHeight 
    G_changeObjectDisplayNiceDiffWidth = G_changeObjectDisplayNiceObject.clientWidth
    G_changeObjectDisplayNiceFinalHeight = 0
    G_changeObjectDisplayNiceFinalWidth = 0
    if ( height )
      G_changeObjectDisplayNiceObject.currentHeight = G_changeObjectDisplayNiceObject.clientHeight
    if ( width )
      G_changeObjectDisplayNiceObject.currentWidth = G_changeObjectDisplayNiceObject.clientWidth    
    G_changeObjectDisplayNiceOldOverflow = G_changeObjectDisplayNiceObject.style.overflow
    G_changeObjectDisplayNiceObject.style.overflow = "hidden"
   }
//  alert("start " + G_changeObjectDisplayNiceObject.currentHeight)
  G_changeObjectDisplayNiceShow = show
  setTimeout("changeObjectDisplayNiceTimer()", G_changeObjectDisplayNiceTimeout)
}

function showHideObjectNice(id, newDisplay, height, width)
{
  if ( getObj(id).style.display == "none" || (G_changeObjectDisplayNiceObject == getObj(id) && ! G_changeObjectDisplayNiceShow) )
  {
    changeObjectDisplayNice(id, newDisplay, height, width)
    return true
  }
  else
  {
    changeObjectDisplayNice(id, 'none', height > 0 , width > 0)
    return false
  }
}

function getObj(id)
{
  var obj;
/*  if ( document.all )
    obj = eval ('document.all.' + id);
  else
  */
    obj = document.getElementById(id);
  return obj;
}

function setStyle( objId, style )
{ 
  var obj = getObj(objId);
  if ( obj )
    obj.className = style; 
}

function getInnerWidth()
{
  var val;
  if (self.innerWidth) // all except Explorer
    val = self.innerWidth;
  else if (document.documentElement && document.documentElement.clientWidth)
    val = document.documentElement.clientWidth;
  else if (document.body) // other Explorers
    val = document.body.clientWidth;
  return val;
}

function getInnerHeight()
{
  var val;
  if (self.innerHeight) // all except Explorer
    val = self.innerHeight;
  else if (document.documentElement && document.documentElement.clientHeight)
    val = document.documentElement.clientHeight;
  else if (document.body) // other Explorers
    val = document.body.clientHeight;
  return val;
}

function escapeFrames()
{
  if( top.location.href != self.location.href )
    parent.location = self.location.href;
}

function centerDiv(div)
{
  var pageWidth = document.body.offsetWidth ? document.body.offsetWidth : window.innerWidth;
  var pageHeight= document.body.offsetHeight? document.body.offsetHeight : window.innerHeight;
  var obj = getObj(div);
  if ( !pageHeight || pageHeight < 600 )
    pageHeight = 600;
  obj.style.left = ((pageWidth - obj.offsetWidth)/2)+'px';
  obj.style.top = ((pageHeight - obj.offsetHeight)/2) + document.body.scrollTop - (obj.offsetHeight/2) +'px';
}

function showAlert(txt, type)
{
  var obj     = getObj('alertDiv'  );
  var screen  = getObj('blockerDiv');
  var abody   = getObj('alertBody' );
  var atitle  = getObj('alertTitle');
  var aheader = getObj('alertHeader');
  obj.alertType = type;

  if ( aheader )
  {
    if ( type == 'info' )
    {
      aheader.className = 'alert_info_header';
      atitle.innerHTML = alertInfoTitleMsg;
    }
    else
    {
      aheader.className = 'alert_warning_header';
      atitle.innerHTML = alertWarningTitleMsg;
    }
  }

  abody.innerHTML = txt;
  obj.style.visibility = 'visible';
  screen.style.visibility = 'visible';
  centerDiv('alertDiv');
  if(dd.elements['alertDiv'])
    dd.elements.splice('alertDiv', 1);
  ADD_DHTML('alertDiv');
}

// 
function showObjectInfoWindow(txt, header)
{
  var obj     = getObj('alertDiv'  );
  var screen  = getObj('blockerDiv');
  var abody   = getObj('alertBody' );
  var atitle  = getObj('alertTitle');
  var aheader = getObj('alertHeader');

  if ( aheader )
  {
    aheader.className = 'alert_info_header';
    atitle.innerHTML = header;
  }

  abody.innerHTML = txt;
  obj.style.visibility = 'visible';
  screen.style.visibility = 'visible';
  centerDiv('alertDiv');
  if(dd.elements['alertDiv'])
    dd.elements.splice('alertDiv', 1);
  ADD_DHTML('alertDiv');
}

inputQueryOkCallback     = null;
inputQueryCancelCallback = null;

function changeInputQuery()
{
  var obj = getObj("inputQueryValue")
  getObj("inputQueryOk").enabled = ( obj.value != '' )
    
}

function showShowInputQuery(hdr, txt, onOk, onCancel, okText, cancelText, defaultText)
{
  var obj     = getObj('inputQueryDiv' );
  var qbody   = getObj('inputQueryBody');
  var screen  = getObj('blockerDiv');
  var header  = getObj('inputQueryTitle');
  
  header.innerHTML = hdr
  qbody.innerHTML = txt;
  getObj('inputQueryOk').value = okText
  getObj('inputQueryCancel').value = cancelText
  obj.style.visibility = 'visible';
  screen.style.visibility = 'visible';
  centerDiv('inputQueryDiv');
  if(dd.elements['inputQueryDiv'])
    dd.elements.splice('inputQueryDiv', 1);
  ADD_DHTML('inputQueryDiv');
  if (defaultText)
    getObj('inputQueryValue').value = defaultText
  else  
    getObj('inputQueryValue').value = ""    
  changeInputQuery()
  inputQueryOkCallback     = onOk;
  inputQueryCancelCallback = onCancel;
}



function okInputQuery()
{
  var obj = getObj('inputQueryDiv');
  var screen = getObj('blockerDiv');
  var inputQueryValue = getObj('inputQueryValue').value
  getObj('inputQueryValue').value = ""
  screen.style.visibility = 'hidden';
  obj.style.visibility = 'hidden';
  if ( inputQueryOkCallback != null )
    inputQueryOkCallback(inputQueryValue);
}

function cancelInputQuery()
{
  var obj = getObj('inputQueryDiv');
  var screen = getObj('blockerDiv');
  screen.style.visibility = 'hidden';
  obj.style.visibility = 'hidden';
  if ( inputQueryCancelCallback != null )
    inputQueryCancelCallback();
}

questionOkCallback     = null;
questionCancelCallback = null;

function showQuestion(txt, onOk, onCancel, type)
{
  var obj     = getObj('questionDiv' );
  var qbody   = getObj('questionBody');
  var screen  = getObj('blockerDiv');

  qbody.innerHTML = txt;
  switch (type)
  {
    case 'yesno':
        getObj('questionOk').value = questionAnswerYesMsg
        getObj('questionCancel').value = questionAnswerNoMsg
      break;
  
     default:
        getObj('questionOk').value = questionAnswerOkMsg
        getObj('questionCancel').value = questionAnswerCancelMsg
      break    
  }
  obj.style.visibility = 'visible';
  screen.style.visibility = 'visible';
  centerDiv('questionDiv');
  if(dd.elements['questionDiv'])
    dd.elements.splice('questionDiv', 1);
  ADD_DHTML('questionDiv');
  
  questionOkCallback     = onOk;
  questionCancelCallback = onCancel;
}

function okQuestion()
{
  var obj = getObj('questionDiv');
  var screen = getObj('blockerDiv');
  screen.style.visibility = 'hidden';
  obj.style.visibility = 'hidden';
  if ( questionOkCallback != null )
    questionOkCallback();
}

function cancelQuestion()
{
  var obj = getObj('questionDiv');
  var screen = getObj('blockerDiv');
  screen.style.visibility = 'hidden';
  obj.style.visibility = 'hidden';
  if ( questionCancelCallback != null )
    questionCancelCallback();
}

function hideAlert()
{
  var obj = getObj('alertDiv');
  var screen = getObj('blockerDiv');
  obj.style.visibility = 'hidden';
  screen.style.visibility = 'hidden';

  // callback function - call if exists
  if ( (typeof onHideAlert) == 'function' )
    onHideAlert(obj.alertType);
}

function showElement(oid, reference)
{
  var obj = getObj(oid);
  obj.style.top = 10;
  obj.style.left = 10;
  obj.style.visibility = 'visible';
}

function hideElement(oid)
{
  var obj = getObj(oid);
  obj.style.visibility = 'hidden';
}

function trimString(sInString) 
{
  sInString = sInString.replace( /^\s+/g, "" );
  return sInString.replace( /\s+$/g, "" );
}

function getXY(oElement) 
{
  var oOrgElm = oElement;
  var iX=0;
  var iY=0;
  var iCount;
  var oElement2;
  var oElementOffset = oElement.offsetParent;

/*
  while(oElement) 
  {
    oElement2 = oElement.parentNode;
    if(oElementOffset == oElement) 
    {
      iX += oElement.offsetLeft;
      iY += oElement.offsetTop;
      //iX += oElement.left
      //iY += oElement.top
      // Add for borders
      iY += parseInt2(oElement.style.borderTopWidth);
      iX += parseInt2(oElement.style.borderLeftWidth);
      // Add for scrolling
      iX -= parseInt2(oElement.scrollLeft);
      iY -= parseInt2(oElement.scrollTop);
      // Get the next offsetParent
      oElementOffset = oElementOffset.offsetParent;
    }
    else 
    {
      iX -= parseInt2(oElement.scrollLeft);
      iY -= parseInt2(oElement.scrollTop);
    }

    oElement = oElement2;
  }
*/
  while(oElement) 
  {
    iX += oElement.offsetLeft;
    iY += oElement.offsetTop;
    //iX += oElement.left
    //iY += oElement.top
    // Add for borders
    //iY += parseInt2(oElement.style.borderTopWidth);
    //iX += parseInt2(oElement.style.borderLeftWidth);
    // Add for scrolling
//    iX -= parseInt2(oElement.scrollLeft);
//    iY -= parseInt2(oElement.scrollTop);
//    iX -= parseInt2(window.scrollLeft);
//    iY -= parseInt2(window.scrollTop);
//    iX -= parseInt2(document.documentElement.scrollLeft);
//    iY -= parseInt2(document.documentElement.scrollTop);
    // Get the next offsetParent
    oElement = oElement.offsetParent;

  } 
  return [iX, iY];
}

function parseInt2(sInt) 
{
  var i = parseInt(sInt);
  if(isNaN(i)) return 0;
  else return i;
}

function getFormAsArray(P_form)
{
  var a = new Object(); 
  var attributeNumber = 0
  for ( var i = 0; i < document[P_form].elements.length; i++ )
  {
    switch ( document[P_form].elements[i].nodeName.toLowerCase() )
    {
      case 'input':
        switch ( document[P_form].elements[i].type.toLowerCase() )
        {
          case 'checkbox':
            a[document[P_form].elements[i].name] = document[P_form].elements[i].checked?1:0;
            break;
          default: 
            var matchResult = document[P_form].elements[i].name.match(/attribute_value_(.*)/)
            if (matchResult)
            {
              var elementNumber = matchResult[1]
              var keyword = document.getElementById('attribute_keyword_' + elementNumber).value

              a['attributes[' + attributeNumber + ']'] = keyword  + '=' + document[P_form].elements[i].value
              attributeNumber++ 
              break;
            }
            a[document[P_form].elements[i].name] = document[P_form].elements[i].value;
            break;
         }
        break;
      case 'select':
        if (document[P_form].elements[i].name.match(/attribute_keyword_(.*)/))
          break
      default:
        a[document[P_form].elements[i].name] = document[P_form].elements[i].value;
        break;
    }
  }
  return a;
}

function eventBubbleStop(P_event)
{
  P_event.cancelBubble = true;
  if ( !document.all )
    P_event.stopPropagation();
}

function getSelectedRows(P_tableId)
{
  if ( !P_tableId )
    P_tableId = 'contentTable';

  var selectedRows = new Array();
  var contentTable = getObj(P_tableId);
  for ( var i = 0; i < contentTable.rows.length; i++ )
    if ( contentTable.rows[i].selected )
      selectedRows[selectedRows.length] = contentTable.rows[i].id;
  return selectedRows;
}

function selectAll(P_tableId)
{
  if ( !P_tableId )
    P_tableId = 'contentTable';

  var contentTable = getObj(P_tableId);
  for ( var i = 0; i < contentTable.rows.length; i++ )
  {
    var row = contentTable.rows[i];
    if ( row.id != '' && !row.selected )
    {
      row.selected = true;
      row.oldClass = row.className;
      row.className = 'selected';
      var checkImg = getObj('checkbox_' + row.id);
      if ( checkImg )
        checkImg.src = "src/img/check_on.gif";
    }
  }
}

function selectNone(P_tableId)
{
  if ( !P_tableId )
    P_tableId = 'contentTable';

  var contentTable = getObj(P_tableId);
  for ( var i = 0; i < contentTable.rows.length; i++ )
  {
    var row = contentTable.rows[i];
    if ( row.id != '' && row.selected )
    {
      row.selected = false;
      row.className = row.oldClass;
      var checkImg = getObj('checkbox_' + row.id);
      if ( checkImg )
        checkImg.src="src/img/check_off.gif";
    }
  }
}

function invertSelection(P_tableId)
{
  if ( !P_tableId )
    P_tableId = 'contentTable';

  var contentTable = getObj(P_tableId);
  for ( var i = 0; i < contentTable.rows.length; i++ )
  {
    var row = contentTable.rows[i];
    if ( row.id != '' )
    {
      var checkImg = getObj('checkbox_' + row.id);
      if ( row.selected )
      {
        row.selected = false;
        row.className = row.oldClass;
        if ( checkImg )
          checkImg.src="src/img/check_off.gif";
      }
      else
      {
        row.selected = true;
        row.oldClass = row.className;
        row.className = 'selected';
        if ( checkImg )
          checkImg.src = "src/img/check_on.gif";
      }
    }
  }
}

function getScreenWidth() 
{
  if (self.screen) 
    return screen.width;
  else 
    if (navigator.javaEnabled && navigator.javaEnabled())
      return java.awt.Toolkit.getDefaultToolkit().getScreenSize().width;
    else
      return -1;
}

function getScreenHeight()
{
  if (self.screen) 
    return screen.height;
  else 
    if (navigator.javaEnabled && navigator.javaEnabled())
      return java.awt.Toolkit.getDefaultToolkit().getScreenSize().height;
    else
      return -1;
}

function isValidNumber(numval)
{
  if (numval=="")
    return false;
  var myRegExp = new RegExp("^[/+|/-]?[0-9]*[/.]?[0-9]*$");
  return myRegExp.test(numval);
}

function storeCaret(textEl) 
{
  if (textEl.createTextRange) 
    textEl.caretPos = document.selection.createRange().duplicate();
}


function resizeToInner(x,y)
{
  self.innerWidth = x;
  self.innerHeight = y;
}

function preloadImages()
{
  preloadedImages = new Array();
  for ( var i = 0; i < arguments.length; i++ )
  {
    preloadedImages[i] = new Image();
    preloadedImages[i].src = arguments[i];
  }
}

function newImage(url)
{
  var img = new Image();
  img.src=url;
  return img;
}

function imageIsLoaded(img)
{
 if ( !img.complete )
   return false;
 if ( typeof img.naturalWidth != "undefined" && img.naturalWidth == 0 )
   return false;

 return true;
}

function fadeIn(objId, opac, inc, delay, runAfter) 
{
  var newOpac = opac + inc;
  var obj = getObj(objId);
  if ( newOpac < 100 ) 
  {
    obj.style.opacity = '.'+newOpac;
    obj.style.filter = "alpha(opacity:"+newOpac+")";
    opacityTimeout = window.setTimeout("fadeIn(\""+objId+"\","+newOpac+","+inc+","+delay+",\""+runAfter+"\")", delay);
  }
  else 
  { 
    obj.style.opacity = '100';
    obj.style.filter = "alpha(opacity:100)";
    if ( typeof runAfter != 'undefined' && runAfter.length > 0 )
      window.setTimeout(runAfter, 10);
  }
}

function fadeOut(objId, opac, dec, delay, runAfter) 
{
  var newOpac = opac - dec;
  var obj = getObj(objId);
  if ( newOpac > 0 ) 
  {
    obj.style.opacity = '.'+newOpac;
    obj.style.filter = "alpha(opacity:"+newOpac+")";
    opacityTimeout = window.setTimeout("fadeOut(\""+objId+"\","+newOpac+","+dec+","+delay+",\""+runAfter+"\")", delay);
  }
  else 
  { 
    obj.style.opacity = '0';
    obj.style.filter = "alpha(opacity:0)";
    if ( typeof runAfter != 'undefined' && runAfter.length > 0 )
      window.setTimeout(runAfter, 10);
  }
}

function getScrollY()
{
  if (self.pageYOffset) // all except Explorer
    return self.pageYOffset;
  else if (document.documentElement && document.documentElement.scrollTop) // Explorer 6 Strict
    return document.documentElement.scrollTop;
  else if (document.body) // all other Explorers
    return document.body.scrollTop;
}

function toggleNotification()
{
  var result = rpcQuery('rpc.php?function=toggleNotification', new Array());
  if ( result[0] != 'OK' )
    parent.showAlert(result[1]);
  else
    parent.showAlert(result[1], 'info');
}

function escapeSingleQuote(str)
{
  return str.replace(/'/g, "\\'");
}

function escapeDoubleQuote(str)
{
  return str.replace(/"/g, '\\"');
}

function htmlEscapeDoubleQuote(str)
{
  return str.replace(/"/g, '&quot;');
}

function getFlashMovieObject(movieName)
{
  if (window.document[movieName]) 
  {
      return window.document[movieName];
  }
  if (navigator.appName.indexOf("Microsoft Internet")==-1)
  {
    if (document.embeds && document.embeds[movieName])
      return document.embeds[movieName]; 
  }
  else // if (navigator.appName.indexOf("Microsoft Internet")!=-1)
  {
    return document.getElementById(movieName);
  }
}

function fakeThread(body, end)
{
  threadText="var threadReturnValue="+body+";";
  if ( end )
    threadText += end+"(threadReturnValue);";
  setTimeout(threadText, 100)
}

function addNewMultiValue(fieldName, cssClass)
{
  contentChanged(getObj(fieldName))
  G_multiValueCurrentId[fieldName] += 1
  var currentId = G_multiValueCurrentId[fieldName]
  var el = document.createElement('p'); 
  var parentName = 'multiValueList_' + fieldName
  var arrayKey = fieldName + '[' + currentId + ']'

  el.setAttribute('id', arrayKey)
  el.style.display = 'none'

  var html = '<input type="text" class="'+ cssClass +'" value="" name="'+ arrayKey +'" style="width:200px"/>' + "\n" +
             '<a style="text-decoration:none" href="javascript:deleteElementById(\'' + parentName + '\',\'p\', \''+arrayKey+'\')"><img src="src/img/del-small.gif"/></a>'
             
  el.innerHTML = html
  el.style.margin = "0px 0px 2px 0px"
  getObj(parentName).appendChild(el)
  changeObjectDisplayNice(arrayKey, 'block', 22, 0, 'autosize');
}

function deleteElementById(parentId, elementType, fullId)
{
  var parentObject = getObj(parentId)   
  contentChanged(parentObject) 
  var element = parentObject.getElementsByTagName(elementType);
/*  
  for (var i=0; i < element.length;i++)
  {
    if ( element[i].id == fullId ) 
    {
      var node = element[i];
      break;
    }
  }
*/
  changeObjectDisplayNice(fullId, 'none', true, false, 'remove');  
//  if (typeof node != "undefined")
//    node.parentNode.removeChild(node)  
//  else
//    alert('Node not found: parentId=' + parentId + ' elementType=' + elementType + ' fullId=' + fullId)
}

function addNewAttribute(parentName, cssClass)
{
  contentChanged(getObj(parentName))
  G_attributesCurrentId += 1
  var currentId = G_attributesCurrentId

  var el = document.createElement('p'); 

  var keywordId = 'attribute_keyword_' + currentId.toString()
  var valueId = 'attribute_value_' + currentId.toString()
  var elementId = 'attribute_element_' + currentId.toString()

  el.setAttribute('id', elementId)
  el.style.margin = "0px 0px 2px 0px"
  el.style.display = 'none'

  var typesHtml = ""
  var currentType = G_attributesTypes

  for ( var i = 0; i < currentType.length; i++ )
  {
    typesHtml += '<option value="' + currentType[i]['keyword'] + '">' + currentType[i]['name'] + '</option>' + "\n";
  }

  var html =  '<select name="' + keywordId + '" id="' + keywordId + '" class='+cssClass+'>' + typesHtml + '</select>' + "\n" + 
              '<input type="text" class="'+ cssClass +'" value="" name="'+ valueId + '" style="width:200px"/>'+ "\n"+
              '<a style="text-decoration:none" href="javascript:deleteElementById(\'' + parentName + '\',\'p\',\''+elementId+'\')"><img src="src/img/del-small.gif"/></a>'
  el.innerHTML = html
  el.style.margin = "0px 0px 2px 0px"
//  styleObj = getObj(elementId).style
//  styleObj.margin = "0px 0px 2px 0px"
  getObj(parentName).appendChild(el)
  changeObjectDisplayNice(elementId, 'block', 24, 0, 'autosize');
}

function showHelp(key)
{
  wnd = window.open("cmd.php?cmd=help&key=" + key, "helpWindow", 'menubar=no, toolbar=no, location=no, scrollbars=auto, resizable=yes, status=no, width=500, height=400')
}


/*
function checkRpcError()
{
  if ( result[2] && result[2].length > 0 )
    setStyle('td_' + result[2], 'description_error');
  var field = eval('document.objectForm.' + result[2]);
  if ( result[1] && result[1].length > 0 )             // expected answer
    parent.showAlert(result[1]);
  else if ( result[0] && result[0].length > 0 )        // unexpected answer 
    parent.showAlert('Unexpected answer: ' +  result[0]);
  else                                                 // all is corrupt
    alert(result);
}
*/
