// New Interfaces:
// - sys_createXMLHTTP()
// - sys_sprintf(format_[, ...])
// - sys_addSlashes(value_)
// - sys_stripSlashes(value_)
// - gui_loadTab(nr_)
// - gui_triggerCallbackButton(name_, value_, version_, confirm_, dialog_)
// - gui_changeKey(textControl_, evt_, keyChecker_)
// - gui_umlautsToASCII(textControl_, keyCode_, key_)
// - gui_digitsToX(textControl_, keyCode_, key_)
// - gui_charToEntity(textControl_, keyCode_, key_)
// - gui_openWindow(targetURL_, winName_, userOpts_)
// - gui_closeWindow()
// - gui_autoClear(control_, initialValue_)
// - gui_setRating(formName_, controlName_, value_)
// - loc_loadIDsForSection(section_, continuation_)
// - loc_loadIDsForSectionIntoSelect(section_, select_, currentSection_, currentID_, continuation_)
// - loc_loadTranslations(section_, id_, continuation_)
// - loc_loadTranslationsIntoDiv(section_, id_, div_)

//==============================================================================
// sys_createXMLHTTP()
//==============================================================================
function sys_createXMLHTTP()
{
  // IE?
  var xmlHTTP;
  if(document.all)
    xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
  else
    xmlHTTP = new XMLHttpRequest();
  if(!xmlHTTP)
    alert('Unsupported browser.');
  return xmlHTTP;
}
//------------------------------------------------------------------------------


//==============================================================================
// sys_sprintf(format_[, ...])
//==============================================================================
function sys_sprintf()
{
  if(!arguments || arguments.length<1 || !RegExp)
    return;
  var str=arguments[0];
  var re=/([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
  var a=b=[], numSubstitutions=0, numMatches=0;
  while(a=re.exec(str))
  {
    var leftpart=a[1], pPad=a[2], pJustify=a[3], pMinLength=a[4];
    var pPrecision=a[5], pType=a[6], rightPart=a[7];
    numMatches++;
    if(pType=='%')
      subst = '%';
    else
    {
      numSubstitutions++;
      if(numSubstitutions>=arguments.length)
        alert('sprintf(): Not enough function arguments ('+(arguments.length-1)+', excluding the string)\nfor the number of substitution parameters in string ('+numSubstitutions+' so far).');
      var param=arguments[numSubstitutions];
      var pad='';
      if(pPad && pPad.substr(0,1)=="'")
        pad = leftpart.substr(1,1);
      else if(pPad)
        pad = pPad;
      var justifyRight=true;
      if(pJustify && pJustify==="-")
        justifyRight=false;
      var minLength=-1;
      if (pMinLength)
        minLength = parseInt(pMinLength);
      var precision=-1;
      if (pPrecision && pType=='f')
        precision=parseInt(pPrecision.substring(1));
      var subst=param;
      switch(pType)
      {
      case 'b':
        subst=parseInt(param).toString(2);
        break;
      case 'c':
        subst=String.fromCharCode(parseInt(param));
        break;
      case 'd':
        subst=parseInt(param)?parseInt(param):0;
        break;
      case 'u':
        subst=Math.abs(param);
        break;
      case 'f':
        subst=(precision>-1)?Math.round(parseFloat(param)*Math.pow(10, precision))/Math.pow(10, precision):parseFloat(param);
        break;
      case 'o':
        subst=parseInt(param).toString(8);
        break;
      case 's':
        subst=param;
        break;
      case 'x':
        subst=(''+parseInt(param).toString(16)).toLowerCase();
        break;
      case 'X':
        subst=(''+parseInt(param).toString(16)).toUpperCase();
        break;
      }
      var padLeft=minLength-subst.toString().length;
      if(padLeft>0)
      {
        var arrTmp=new Array(padLeft+1);
        var padding=arrTmp.join(pad?pad:" ");
      }
      else
      {
        var padding="";
      }
    }
    str=leftpart+padding+subst+rightPart;
  }
  return str;
}
//------------------------------------------------------------------------------


//==============================================================================
// sys_addSlashes(string_)
//==============================================================================
function sys_addSlashes(string_)                                               { return string_.replace(/\\/g,"\\\\").replace(/\'/g,"\\'").replace(/\"/g,"\\\""); }
//------------------------------------------------------------------------------


//==============================================================================
// sys_stripSlashes(string_)
//==============================================================================
function sys_stripSlashes(string_)                                            { return string_.replace(/(\\)([\\\'\"])/g,"$2") }
//------------------------------------------------------------------------------


//==============================================================================
// gui_loadTab(nr_)
//==============================================================================
function gui_loadTab(nr_)
{
  gui_currentDialog.tabControl.value=nr_;
  gui_currentDialog.submit();
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_triggerCallbackButton(name_, value_, version_, confirm_, dialog_)
//==============================================================================
function gui_triggerCallbackButton(name_, value_, version_, confirm_, dialog_)
{
  if(null==confirm_ || ''==confirm_ || confirm(confirm_))
  {
    if(dialog_)
    {
      document.forms[dialog_].mzag_callbackButtonName.value=name_;
      document.forms[dialog_].mzag_callbackButtonValue.value=value_;
      document.forms[dialog_].submit();
    }
    else
    {
      document.forms.gui_CallbackButtonForm.callbackButtonName.value=name_;
      document.forms.gui_CallbackButtonForm.callbackButtonValue.value=value_;
      document.forms.gui_CallbackButtonForm.submit();
    }
  }
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_changeKey(textControl_, evt_, keyChecker_)
//==============================================================================
function gui_changeKey(textControl_, evt_, keyChecker_)
{
  var keyCode = evt_.keyCode ? evt_.keyCode :
                evt_.charCode ? evt_.charCode :
                evt_.which ? evt_.which : void 0;
  var key;
  if (keyCode)
  {
    key = String.fromCharCode(keyCode);
  }
  var keyCheck = keyChecker_(textControl_, keyCode, key);
  if (keyCode && window.event && !window.opera)
  {
    if (keyCheck.cancelKey)
    {
      return false;
    }
    else if (keyCheck.replaceKey)
    {
      window.event.keyCode = keyCheck.newKeyCode;
      if (window.event.preventDefault)
      {
        window.event.preventDefault();
      }

      if (keyCheck.submit)
      {
        textControl_.form.submit();
      }

      return true;
    }
    else
    {
      return true;
    }
  }
  else if (typeof textControl_.setSelectionRange != 'undefined')
  {
    if (keyCheck.cancelKey)
    {
      if (evt_.preventDefault)
      {
        evt_.preventDefault();
      }
      return false;
    }
    else if (keyCheck.replaceKey)
    {
      if (evt_.preventDefault)
      {
        evt_.preventDefault();
      }
      var oldSelectionStart = textControl_.selectionStart;
      var oldSelectionEnd = textControl_.selectionEnd;
      var selectedText = textControl_.value.substring(oldSelectionStart, oldSelectionEnd);
      var newText = typeof keyCheck.newKey != 'undefined' ? keyCheck.newKey : String.fromCharCode(keyCheck.newKeyCode);
      textControl_.value = textControl_.value.substring(0, oldSelectionStart) + newText + textControl_.value.substring(oldSelectionEnd);
      textControl_.setSelectionRange(oldSelectionStart + newText.length, oldSelectionStart + newText.length);

      if (keyCheck.submit)
      {
        textControl_.form.submit();
      }

      return false;
    }
    else
    {
      return true;
    }
  }
  else if (keyCheck.cancelKey)
  {
    if (evt_.preventDefault)
    {
      evt_.preventDefault();
    }
    return false;
  }
  else
  {
    return true;
  }
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_umlautsToASCII(textControl_, keyCode_, key_)
//==============================================================================
function gui_umlautsToASCII(textControl_, keyCode_, key_)
{
    // we do not need this function now
    return { cancelKey: false };
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_digitsToX(textControl_, keyCode_, key_)
//==============================================================================
function gui_digitsToX(textControl_, keyCode_, key_)
{
  if ("0123456789".indexOf(key_) != -1)
  {
    return { replaceKey: true, newKeyCode: "X".charCodeAt(), newKey: "X", submit: false };
  }
  else
  {
    return { cancelKey: false };
  }
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_charToEntity(textControl_, keyCode_, key_)
//==============================================================================
function gui_charToEntity(textControl_, keyCode_, key_)
{
  if('"'.indexOf(key_) != -1)
  {
    return { replaceKey: true, newKeyCode: '"'.charCodeAt(), newKey: '&quot;', submit: false };
  }
  else
  {
    return { cancelKey: false };
  }
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_openWindow(targetURL_, winName_, userOpts_)
//==============================================================================
function gui_openWindow(targetURL_, winName_, userOpts_)
{
  if (winName_ == "")
  {
    alert( "kein Fenstername" );
    return false;
  }
  var options = "";
  var arrOpts = new Array();
  arrOpts["width"] = 430;
  arrOpts["height"] = 425;
  arrOpts["top"] = 10;
  arrOpts["left"] = 10;
  arrOpts["scrollbars"] = "yes";
  arrOpts["menubar"] = "no";
  arrOpts["resizable"] = "no";
  arrOpts["status"] = "no";
  arrOpts["location"] = "no";
  arrOpts["toolbar"] = "no";
  if (userOpts_ && (userOpts_.length > 0))
  {
    if (userOpts_.indexOf(",") == - 1)
    {
      var sepPos = userOpts_.indexOf("=");
      arrOpts[userOpts_.substring(0, sepPos)] = userOpts_.substring(sepPos + 1, userOpts_.length);
    }
    else
    {
      arrUserOpts = userOpts_.split(",");
      for(var i in arrUserOpts)
      {
        userOption = arrUserOpts[i];
        var sepPos = userOption.indexOf("=");
        arrOpts[userOption.substring(0, sepPos)] = userOption.substring(sepPos + 1, userOption.length);
      }
    }
  }
  arrOpts["screenY"] = arrOpts["top"];
  arrOpts["screenX"] = arrOpts["left"];
  for (var option in arrOpts)
  {
    options += option + "=" + arrOpts[option] + ",";
  }
  options = options.substr(0, options.length);

  if(!eval("window." + winName_) || eval( winName_ + ".closed"))
  {
    window[winName_] = window.open(targetURL_, winName_, options);
  }
  else
  {
    if (window[winName_].location.href != targetURL_)
    {
      window[winName_].location.href = targetURL_;
    }
  }
  eval( winName_ + ".focus();" );
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_closeWindow()
//==============================================================================
function gui_closeWindow()
{
    if(opener)
        opener.focus();
    this.close();
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_autoClear(control_, initialValue_)
//==============================================================================
function gui_autoClear(control_, initialValue_)
{
  if(control_.value==initialValue_)
    control_.value=''
}
//------------------------------------------------------------------------------


//==============================================================================
// gui_setRating(formName_, controlName_, value_)
//==============================================================================
function gui_setRating(formName_, controlName_, value_)
{
  for(i=0; i<5; ++i)
    document.images[controlName_+"Star"+i].src='mzag2/images/icons/rating_'+(value_>=(i+1)*20?'':'no_')+'star.png';
  document.forms[formName_][controlName_].value=value_;
}
//------------------------------------------------------------------------------


//==============================================================================
// loc_loadIDsForSection(section_, continuation_)
//==============================================================================
function loc_loadIDsForSection(section_, continuation_)
{
  // request IDs from server.
  var xmlHTTP=sys_createXMLHTTP();
  xmlHTTP.open("GET", '?scriptlet=Localization/IDsForSection&section='+section_, true);
  xmlHTTP.onreadystatechange = function()
  {
    if(xmlHTTP.readyState!=4)
      return;
    continuation_(xmlHTTP.responseText.split('\n'));
  };
  xmlHTTP.send('');
}
//------------------------------------------------------------------------------


//==============================================================================
// loc_loadIDsForSectionIntoSelect(section_, select_, currentSection_, currentID_, continuation_)
//==============================================================================
function loc_loadIDsForSectionIntoSelect(section_, select_, currentSection_, currentID_, continuation_)
{
  loc_loadIDsForSection(section_, function(ids_)
    {
      select_.options.length=0;
      for(var i=0; i<ids_.length; ++i)
      {
        if(!ids_[i])
          continue;
        var option=document.createElement("OPTION");
        select_.options.add(option);
        option.innerHTML = ids_[i];
        option.value = ids_[i];
      }
      if(section_==currentSection_)
        select_.value = currentID_;
      else
        select_.value = ids_[0];
      continuation_();
    });
}
//------------------------------------------------------------------------------

//==============================================================================
// loc_loadTranslations(section_, id_, continuation_)
//==============================================================================
function loc_loadTranslations(section_, id_, continuation_)
{
  // request translations from server.
  var xmlHTTP=sys_createXMLHTTP();
  xmlHTTP.open("GET", '?scriptlet=Localization/Translation&section='+section_+'&id='+id_, true);
  xmlHTTP.onreadystatechange = function()
  {
    if(xmlHTTP.readyState!=4)
      return;
    var rest=xmlHTTP.responseText;
    var languages=new Array(), texts=new Array();
    var index;
    while((index=rest.indexOf(';'))!=-1)
    {
      // parser language.
      language=rest.substr(0, index);
      rest=rest.substr(index+1);

      // parse text.
      index=rest.indexOf(';');
      textLength=parseInt(rest.substr(0, index));
      rest=rest.substr(index+1);
      text=rest.substr(0, textLength);
      rest=rest.substr(textLength+1);

      // add translation.
      languages[languages.length]=language;
      texts[texts.length]=text;
    }
    continuation_(languages, texts);
  };
  xmlHTTP.send('');
}
//------------------------------------------------------------------------------

//==============================================================================
// loc_loadTranslationsIntoDiv(section_, id_, div_)
//==============================================================================
function loc_loadTranslationsIntoDiv(section_, id_, div_)
{
  loc_loadTranslations(section_, id_, function(languages_, texts_)
    {
      div_.innerHTML='<table border="0" cellspacing="0" cellpadding="0" style="margin-top: 5px"><tr>';
      for(var i=0; i<languages_.length; ++i)
      {
        div_.innerHTML+='<td><img src="mzag2/images/icons/lang/'+languages_[i]+'.png" border="0" /></td><td>'+texts_[i]+'&nbsp;</td>';
      }
      div_.innerHTML+='</tr></table>';
    });
}
//------------------------------------------------------------------------------
