// You also have to adjust the error function in server/include/constants.php

//
// Ajax call
//


if (document.location.host == "localhost")
  var ADMIN_HOST = "http://login.mlm-control2.com/";
else if (document.location.host == 'login.mlm-control2.com')
  var ADMIN_HOST = "http://login.mlm-control2.com/";
else if (document.location.port > 80 && document.location.port < 90)
  var ADMIN_HOST = "http://" + document.location.host + "/";
else 
  var ADMIN_HOST = "https://" + document.location.host + "/";

var REQUEST_GETDATA = 1;
var REQUEST_SETDATA = 2;
var REQUEST_SENDTESTMAIL = 3;
var REQUEST_DOWNLOAD = 4;

var MAX_UPLOAD_SIZE = 20; // in MB
var MAX_UPLOAD_REALSIZE = MAX_UPLOAD_SIZE * 1024 * 1024;


// get actions
var ACTION_READ_MODULES               = "101";
var ACTION_READ_BLANK_WEBSITE_MODULE  = "102";
var ACTION_READ_MODULE_EDITOR         = "103";
var ACTION_READ_NAVIGATION_EDITOR     = "104";
var ACTION_CANCEL_WEBSITE_MODULE      = "105";
var ACTION_READ_MODULE_STYLE          = "106";
var ACTION_READ_LINK_EDITOR           = "107";
var ACTION_READ_LAYOUT                = "108";
var ACTION_READ_RESONDER_CAMPAIGNS    = "109";
var ACTION_READ_RESONDER_MESSAGE      = "110";
var ACTION_READ_RESONDER_LAYOUT       = "111";
var ACTION_READ_TESTMAIL_DIALOG       = "112";
var ACTION_READ_NEWSLETTER_CONTENT    = "113";
var ACTION_READ_GROUPLIST             = "114";
var ACTION_READ_ADDRESSLIST           = "115";
var ACTION_READ_GROUP_CAMPAIGN_LIST   = "116";
var ACTION_READ_CAMPAIGN_MESSAGE_LIST = "117";
var ACTION_READ_NEWSLETTER_LIST       = "118";
var ACTION_READ_NEWSLETTER_TEXT       = "119";
var ACTION_READ_DOMAIN_NAVIGATION     = "120";
var ACTION_READ_MODULE_CONTENT        = "121";
var ACTION_READ_MODULE_DATA           = "122";
var ACTION_READ_SETTINGS_ITEM         = "123";
var ACTION_DOWNLOAD_INVOICE           = "124";
var ACTION_READ_ADMINISTRATION_CONTENT= "125";
var ACTION_READ_CUSTOMER_CONTENT      = "126";
var ACTION_READ_IMPORTADDRESSEDITOR   = "127";
var ACTION_READ_FILEMANAGER           = "128";
var ACTION_READ_CREATEFOLDER          = "129";
var ACTION_READ_CHANGEFOLDER          = "130";
var ACTION_READ_FOLDERFILES           = "131";
var ACTION_READ_ORDER_CONTENT         = "132";
var ACTION_READ_PRODUCT_CONTENT       = "133";
var ACTION_READ_ORDER                 = "134";
var ACTION_READ_CUSTOMER              = "135";
var ACTION_READ_INVOICE_CONTENT       = "136";
var ACTION_READ_ORDER_PACKAGES        = "137";
var ACTION_READ_NEXTINVOICE_CONTENT   = "138";
var ACTION_READ_PRODUCT               = "139";
var ACTION_READ_SUBSCRIBERS_CONTENT   = "140";
var ACTION_READ_SUBSCRIBER            = "141";
var ACTION_READ_STYLE                 = "142";
var ACTION_GET_DOMAIN_STYLE           = "143";
var ACTION_READ_HEADER_EDITOR         = "144";
var ACTION_READ_RESPONDERHTML_DIALOG  = "145";
var ACTION_CUSTOMER_TERMINATIONS      = "146";
var ACTION_RESTORE_AUTOSAVE           = "147";
var ACTION_READ_PAYMENTMANAGER        = "148";
var ACTION_READ_MYPRODUCT             = "149";
var ACTION_GET_AFFILIATE_DETAILS      = "150";
var ACTION_READ_ADDRESS               = "151";

// set actions
var ACTION_SEND_KEEPALIVE             = "000";
var ACTION_SORT_SECTIONS              = "101";
var ACTION_REMOVE_WEBSITE_MODULE      = "102";
var ACTION_SAVE_WEBSITE_MODULE        = "103";
var ACTION_WRITE_NAVIGATION_LIST      = "104";
var ACTION_SET_PICTURE_ZOOM           = "105";
var ACTION_SET_DOMAIN_LAYOUT          = "106";
var ACTION_SAVE_CAMPAIGN              = "107";
var ACTION_SAVE_MESSAGE               = "108";
var ACTION_REMOVE_CAMPAIGN            = "109";
var ACTION_REMOVE_MESSAGE             = "110";
var ACTION_SAVE_NEWSLETTER_GROUP      = "111";
var ACTION_REMOVE_GROUP               = "112";
var ACTION_SAVE_NEWSLETTER_ADDRESS    = "113";
var ACTION_REMOVE_ADDRESS             = "114";
var ACTION_SAVE_NEWSLETTER            = "115";
var ACTION_REMOVE_NEWSLETTER          = "116";
var ACTION_SET_CURRENT_DOMAIN         = "117";
var ACTION_SAVE_SETTINGS_ITEM         = "118";
var ACTION_IMPORTADDRESSES            = "119";
var ACTION_SAVE_FOLDER                = "120";
var ACTION_REMOVE_FOLDER              = "121";
var ACTION_REMOVE_FILES               = "122";
var ACTION_SAVE_PRODUCT               = "123";
var ACTION_REMOVE_PRODUCT             = "124";
var ACTION_SAVE_ORDER                 = "125";
var ACTION_REMOVE_ORDER               = "126";
var ACTION_SAVE_CUSTOMER              = "127";
var ACTION_REMOVE_CUSTOMER            = "128";
var ACTION_ACCEPT_ORDER               = "129";
var ACTION_SAVE_USERPRODUCT           = "130";
var ACTION_REMOVE_USERPRODUCT         = "131";
var ACTION_REMOVE_SUBSCRIBER          = "132";
var ACTION_SET_DOMAIN_STYLE           = "133";
var ACTION_SAVE_HEADERIMAGE           = "134";
var ACTION_SAVE_TERMINATION           = "135";
var ACTION_SEND_AUTOSAVE              = "136";
var ACTION_SAVE_INVOICE               = "137";
var ACTION_CHANCE_MYPRODUCT           = "138";
var ACTION_COPY_NEWSLETTER            = "139";
var ACTION_RESET_DOMAIN_STYLE         = "140";

// testmail actions
var ACTION_SEND_TESTMAIL              = "101";
var ACTION_SEND_MAILAGAIN             = "102";

// special rights
var SPECIALRIGHTS_CUSTOMER_NEWSLETTER = 0x00000001;

// license
var LICENSE_PACKAGE_FREE    = 0x00000000;
var LICENSE_PACKAGE_BASIC   = 0x00000001;
var LICENSE_PACKAGE_COMFORT = 0x00000002;

// Package
var PACKAGE_FREE    = "FREE";
var PACKAGE_BASIC   ="BASIC";
var PACKAGE_COMFORT ="COMFORT";

//
// errors
//

// database installation
var ERROR_INVALID_LOCATION      = -100;
var ERROR_INVALID_PORT          = -101;
var ERROR_INVALID_USER          = -102;
var ERROR_INVALID_PASSWORD      = -103;
var ERROR_DATABASE_INSTALLED    = -104;
var ERROR_DATABASE              = -105;

// infos
var INFO_DUPLICATE_ENTRY        = -200;

// misc. erros
var NOERROR                     = 0;
var ERROR_NOID                  = 1;
var ERROR_NODATA                = 2;
var ERROR_UNKNOWN_ACTION        = 3;
var ERROR_INVALID_REQUEST       = 4;
var ERROR_INVALID_SESSION       = 5;
var ERROR_INVALID_LOGIN         = 6;
var ERROR_DELETE_IMAGE          = 7;
var ERROR_SEND_MAIL             = 8;
var ERROR_INVALID_PARAMS        = 9;
var ERROR_INVALID_DATA          = 10;
var ERROR_FILE_NOTFOUND         = 11;
var ERROR_FILE_COPYERROR        = 12;

// misc constants
var FARBTASTIC_WIDTH = 139;

// Editor toolbar
// theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect,fontselect,fontsizeselect",
// theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
// theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
// theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,spellchecker,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,blockquote,pagebreak,|,insertfile,insertimage",

// Editor plugins
// plugins : 'safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template',

var pluginsTinyMCE = '-mlmcontrol,table,paste,advimage';
var buttonsLine1 = 'pastetext,pasteword,|,bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,outdent,indent,mclink,|,forecolor,backcolor,|,pastetext,hr,removeformat,|,undo,redo,|,mcplacehoderresponder,|,code';
var buttonsLine2 = 'tablecontrols,|,hr,removeformat,visualaid,|,image,|,formatselect,fontsizeselect';

var pluginsWebsite = '-mlmcontrol,table,paste,advimage';
var buttonsWebsiteLine1 = 'pastetext,pasteword,|,bold,italic,underline,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,outdent,indent,mclink,|,forecolor,backcolor,|,pastetext,hr,removeformat,|,undo,redo,|,code';
var buttonsWebsiteLine2 = 'tablecontrols,|,hr,removeformat,visualaid,|,image,|,formatselect,fontsizeselect';

// translated texts
var _i18n_Text = null;

(function($)
{
  String.prototype.ltrim = function(clist)
  {
    if (clist)
      return this.replace(new RegExp ('^[' + clist + ']+'), '');
    return this.replace(/^\s+/, '');
  }
  String.prototype.rtrim = function(clist)
  {
    if (clist)
      return this.replace(new RegExp ('[' + clist + ']+$'), '');
    return this.replace(/\s+$/, '');
  }
  String.prototype.trim = function(clist)
  {
    if (clist)
      return this.ltrim(clist).rtrim(clist);
    return this.ltrim().rtrim();
  };

  createGuid = function()
  {
    var newDate = new Date;

    // date
    var y = newDate.getFullYear()
    var m = newDate.getMonth()+1;
    if (m < 10)
      m = '0' + m.toString();
    var d = newDate.getDate();
    if (d < 10)
      d = '0' + d.toString();

    // time
    var h = newDate.getHours();
    if (h < 10)
      h = '0' + h.toString();
    var mi = newDate.getMinutes();
    if (mi < 10)
      mi = '0' + mi.toString();
    var s = newDate.getSeconds();
    if (s < 10)
      s = '0' + s.toString();
    var ms = newDate.getMilliseconds();
    if (ms < 10)
      ms = '00' + ms.toString();
    else if (ms < 100)
      ms = '0' + ms.toString();

    // random number
    var rnd = Math.random().toString().substr(2);

    // create guid
    return (y.toString() + m + d + h + mi + s + ms + rnd).substr(0, 32);
  }

  strEncode = function(str)
  {
    str = encodeURIComponent(str);
    str = str.replace(/&/g, "&amp;");
    str = str.replace(/"/g, "&quot;");
    str = str.replace(/'/g, "&rsquo;");
    str = str.replace(/%22/g, "&quot;");
    str = str.replace(/%27/g, "&rsquo;");
    str = str.replace(/</g, "&lt;");
    str = str.replace(/>/g, "&gt;");
    str = str.replace(/%3C/g, "&lt;");
    str = str.replace(/%3E/g, "&gt;");
    return str;
  }
  strDecode = function(str)
  {
    str = decodeURIComponent(str);
    //str = str_replace('"', "&quot;", str);
    //str = str_replace("'", "&rsquo;", str);
    //str = str_replace("%22", "&quot;", str);
    //str = str_replace("%27", "&rsquo;", str);
    //str = str.replace(/&lt;/g, "<");
    //str = str.replace(/&gt;/g, ">");
    return str;
  }

  isDate = function(strDate, minDate, maxDate)
  {
    try
    {
      if (strDate == null || strDate === "")
        return false;

      var date = Date.fromString(strDate);
      if (!minDate)
        minDate = Date.fromString("1900-01-01", "yyyy-mm-dd");
      if (date < minDate)
        return false;

      if (!maxDate)
        maxDate = Date.fromString("2999-12-31", "yyyy-mm-dd");
      if (date > maxDate)
        return false;
    }
    catch(exception)
    {
      return false;
    }

    return true;
  }

  isExtensionAllowed = function(fileName, extension)
  {
    var ext = getFileExtension(fileName).toLowerCase();
    for (var i = 0; i < extension.length; i++)
    {
      if (extension[i] == ext)
      {
        return true;
      }
    }

    return false;
  }

  isImage = function(fileName)
  {
    return isExtensionAllowed(fileName, allowedImageExtensions());
  }

  isVideo = function(fileName)
  {
    return isExtensionAllowed(fileName, allowedVideoExtensions());
  }

  isMusic = function(fileName)
  {
    return isExtensionAllowed(fileName, allowedMusicExtensions());
  }

  allowedImageExtensions = function()
  { 
    return ['jpeg', 'jpg', 'gif', 'png', 'svg'];
  }

  allowedVideoExtensions = function()
  { 
    return ['swf', 'flv', 'mov', 'mp4'];
  }

  allowedMusicExtensions = function()
  { 
    return ['mp3', 'wav'];
  }


  //
  // show/hide a message panel (Error, Waring, Info, etc.)
  //

  $.showMessage = function(msg, speed, timeout, success)
  {
    if (success === true)
      success = 'success';
    else if (!success)
      success = 'error';

    var p = getMainParent();
    var msgPanel = $(p.document.getElementById('hintMessage'));
    //msgPanel.css({opacity: 0});
    msgPanel.css({display: 'none'});
    msgPanel.html('<p class="' + success + '">' + msg + '</p>');

    msgPanel.stop().slideDown(speed || 'fast', function()
    //msgPanel.stop().animate({opacity: 1}, speed || 'fast', function()
    {
      if (timeout > 0)
      {
        $.timer(timeout, function(timer)
        {
          timer.stop();
          $.hideMessage(speed);
        });
      }
    });
    return msgPanel;
  };
  $.hideMessage = function(speed)
  {
    var p = getMainParent();
    var msgPanel = $(p.document.getElementById('hintMessage'));
    if (msgPanel.get(0).style.display !== 'none')
    {
      //return msgPanel.stop().animate({opacity: 0}, speed || 'fast');
      return msgPanel.stop().slideUp(speed || "fast");
    }
    return null;
  };

  //
  // adds a tooltip to the given filtered elements
  //

  $.setTooltip = function(filter)
  {
    $(filter).tooltip(
    {
      id :'mc-tooltip-id',
      delay :150,
      duration :500,
      xOffset :15,
      yOffset :15,
      opacity :0,
      showURL :false
    });
  };
  $.hideTooltip = function()
  {
    $.tooltip.hide();
  };

  $.loadScript = function(fileName, success)
  {
    // TODO: script.length is always 0
    var cnvFileName = fileName.replace(/\./g, "\\.");
    cnvFileName = cnvFileName.replace(/\//g, "\\/");
    var script = $('head').find('script[src*=' + cnvFileName + ']');
    if (parseInt(script.length) > 0)
    {
      if (success)
        success();
      return;
    }

    script = document.createElement("script");
    script.type = "text/javascript";
    script.src = fileName;

    // Attach handlers for all browsers
    var done = false;
    script.onload = script.onreadystatechange = function()
    {
      if (!done
          && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete"))
      {
        done = true;
        if (success)
          success();
        // head.removeChild(script);
      }
    };

    var head = document.getElementsByTagName("head")[0];
    head.appendChild(script);
  };

  $.loadStyle = function(fileName, success)
  {
    var cnvFileName = fileName.replace(/\./g, "\\.");
    cnvFileName = cnvFileName.replace(/\//g, "\\/");
    var style = $('head').find('link[href=' + cnvFileName + ']');
    if (parseInt(style.length) == 0)
    {
      style = document.createElement("link");
      style.type = "text/css";
      style.rel = "stylesheet";
      style.href = fileName;

      var head = document.getElementsByTagName("head")[0];
      head.appendChild(style);
    }

    if (success)
      success();
  };

  rgb = function(red, green, blue)
  {
    var decColor = red + 256 * green + 65536 * blue;
    var hex = "000000"+decColor.toString(16);
    return hex.substr(hex.length-6).toUpperCase();
  }
  // not tested
  RGBToHex = function(rgb)
  {
    var char = "0123456789ABCDEF";
    return String(char.charAt(Math.floor(rgb / 16))) + String(char.charAt(rgb - (Math.floor(rgb / 16) * 16))); 
  }

  //
  // creates an error provider on the right side of an element
  //
  $.fn.addErrorProvider = function(message)
  {
    $(this).after('<div class="inputerror" title="' + message + '" />');
    return $(this);
  };

  //
  // remove all error provider
  //
  $.fn.clearErrorProvider = function()
  {
    $(".inputerror").each(function(el)
    {
      $(this).remove();
    });

    return this;
  };

  $.fn.showLoader = function(visible, hideOverlay)
  {
    if (visible)
    {
      //$(this).addClass('mc-admin-site-module-loader');
      var ofs = $(this).offset();

      var loader = $('<div class="mc-admin-site-module-overlay"><div class="mc-admin-site-module-loader"></div></div>');
      loader.css(
      {
      top: 0,
      left: 0,
      width: 0,
      height: 0
      }).css(
      {
      top: ofs.top,
      left: ofs.left,
      width: $(this).outerWidth(),
      height: $(this).outerHeight()
      });
      $('body').append(loader);
      if (!hideOverlay)
      {
        $(this).css('opacity', 0.7);
      }
    }
    else
    {
      //$(this).removeClass('mc-admin-site-module-loader');
      $(this).css('opacity', 1);
      var loader = $('body').find('.mc-admin-site-module-overlay');
      loader.remove();
    }
    return $(this);
  };

  $.fn.unwrap = function()
  {
    var t = $(this);
    var child = t.children().eq(0);
    if (child && child.length > 0)
    {
      t.before(child);
    }
    else
    {
      var html = t.html();
      t.replaceWith(html);
    }
    t.remove();
  };

  getLocale = function()
  {
    return "de";
  };

  i18n = function(formated)
  {
    // no arguments - no text
    var argc = i18n.arguments.length - 1;
    if (argc < 0)
      return "";

    // translate
    if (!_i18n_Text)
    {
      return formated;
    }

    var translated = _i18n_Text[formated];
    if (translated != null && translated != "")
    {
      formated = translated;
    }

    // no arguments
    if (argc == 0)
    {
      return formated;
    }

    // insert arguments
    return formatString(formated, i18n.arguments);
  };

  formatString = function(formated /* , arguments */)
  {
    // no arguments - no text
    var argc = this.formatString.arguments.length - 1;
    if (argc < 0)
      return "";

    // no arguments - with text
    // var formated = this.formatString.arguments[0];
    if (formated.basename == "LocalizedString")
      formated = formated.toString();
    if (argc == 0)
      return formated;

    // convert arguments
    for ( var i = 1; i < this.formatString.arguments.length; ++i)
    {
      var key = "/%" + i + "/g";
      var value = this.formatString.arguments[i];
      formated = formated.replace(eval(key), value);
    }

    return formated;
  };

  checkMailFormat = function(mail)
  {
    function checkChar(ch, moreIncludeChars)
    {
      var includeChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
      if (includeChars.indexOf(ch) >= 0)
      {
        return true;
      }
      if (moreIncludeChars.length)
      {
        if (moreIncludeChars.indexOf(ch) >= 0)
        {
          return true;
        }
      }

      return false;
    }
    
    mail = mail.trim();
    if (mail == "")
    {
      return false;
    }

    mail = decodeURIComponent(mail);
    var result = mail.search(/^[äöüÄÖÜa-zA-Z0-9._-]+@[äöüÄÖÜa-zA-Z0-9._-]+\.([a-zA-Z]{2,4})$/);
    if (result == -1)
    {
      return false;
    }

    // find TLD
    var pos = mail.lastIndexOf('.');
    if (pos == -1)
    {
      return false;
    }
    
//    // on specific TLD's allow "äöü" ...
//    var tld = mail.substr(pos+1).toLowerCase();
//    switch (tld)
//    {
//      case "de":
        var includeChars = "äöüÄÖÜ";
//        break;
//      default:
//        var includeChars = "";
//        break;
//    }

    var searchChar = ".@";
    for (var i = 0; i < mail.length; i++)
    {
      var s = mail.charAt(i);

      if (i == 0)
      {
        if (!checkChar(s, includeChars))
          return false;        
      }
      else if (i == mail.length-1)
      {
        if (!checkChar(s))
          return false;        
      }
      else if (searchChar.indexOf(s) != -1)
      {
        if (!checkChar(mail.charAt(i-1), includeChars)
        ||  !checkChar(mail.charAt(i+1), includeChars))
          return false;        
      }
    }
    
    return true;
  }

  getFileExtension = function(fileName)
  {
    var s = fileName.split('.');
    if (s.length == 0)
      return '';
    else
      return s[s.length-1];
  }

  isLocalhost = function()
  {
    if (document.location.host == "localhost")
      return true;
    return false;
  }

  getMainParent = function()
  {
    var p = window.parent;
    while (p.self != p.parent)
    {
      p = p.parent;
    }
    
    return p;
  }

  sendHtmlRequest = function(requestMode, action, responseCallback, userData,
      errorCallback, noFillData)
  {

    var path = ADMIN_HOST;
    switch (requestMode)
    {
      case REQUEST_SETDATA:
        path += "setdata.php";
        break;
      case REQUEST_GETDATA:
        path += "getdata.php";
        break;
      case REQUEST_SENDTESTMAIL:
          path += "sendtestmail.php";
          break;
      case REQUEST_DOWNLOAD:
          path += "download.php";
          break;

      default:
        return;
    }


    var useParam = true;
    if (!noFillData)
    {
      var data = new Object();
      data["action"] = action;
      data["locale"] = getLocale();
      if (userData != null)
        data["data"] = userData;
    }
    else if (userData != null)
    {
      var data = userData;
    }
    else
    {
      useParam = false;
    }

    if (useParam)
    {
      var jtext = "request=" + JSON.stringify(data);
    }
    else
    {
      var jtext = "";
    }

    // encode text
    jtext = jtext.replace(/&/g, "%26");

    if (requestMode == REQUEST_DOWNLOAD)
    {
      location.href = path + '?' + jtext;
      return;
    }

    // send to server
    $.post(path, jtext,
    function(responseData, status)
    {
      if (!responseData || responseData.error > 0)
      {
        if (!responseData)
        {
          alert(i18n("No response data received"));
          return;
        }

        if (responseData.error == ERROR_INVALID_SESSION)
        {
          // logout
          window.content.document.location.href = "index.php?a=logout&r=timeout";
          return;
        }

        if (errorCallback != null)
        {
          if (responseData)
            errorCallback(responseData.error,
            responseData.errorMsg ? responseData.errorMsg
                                 : "html request error (" + responseData.error + ") occured");
          else
            errorCallback(-1, i18n("Unknown html request error occured"));
        }
        else
        {
          if (responseData)
            alert(responseData.errorMsg ? responseData.errorMsg
                                       : "html request error (" + responseData.error + ") occured");
          else
            alert(i18n("Unknown html request error occured"));
        }
      }
      else if (responseCallback != null)
      {
        responseCallback(responseData);
      }
    }, "json");
  };

  /**
   *
   * timer() provides a cleaner way to handle intervals
   *
   * @usage $.timer(interval, callback);
   *
   *
   * @example $.timer(1000, function (timer) { alert("hello"); timer.stop(); });
   * @desc Show an alert box after 1 second and stop
   *
   * @example var second = false; $.timer(1000, function (timer) { if (!second) {
   *          alert('First time!'); second = true; timer.reset(3000); } else {
   *          alert('Second time'); timer.stop(); } });
   * @desc Show an alert box after 1 second and show another after 3 seconds
   *
   *
   */

  $.timer = function(interval, callback)
  {
    var interval = interval || 100;

    if (!callback)
      return false;

    _timer = function(interval, callback)
    {
      this.stop = function()
      {
        clearInterval(self.id);
      };

      this.internalCallback = function()
      {
        callback(self);
      };

      this.reset = function(val)
      {
        if (self.id)
          clearInterval(self.id);

        var val = val || 100;
        this.id = setInterval(this.internalCallback, val);
      };

      this.interval = interval;
      this.id = setInterval(this.internalCallback, this.interval);

      var self = this;
    };

    return new _timer(interval, callback);
  };

  $.getScrollbarWidth = function ()
  {
    // Scrollbalken im Body ausschalten
    document.body.style.overflow = 'hidden';
    var width = document.body.clientWidth;

    // Scrollbalken
    document.body.style.overflow = 'scroll';

    width -= document.body.clientWidth;

    // Der IE im Standardmode
    if(!width) width = document.body.offsetWidth-document.body.clientWidth;

    // urspr?ngliche Einstellungen
    document.body.style.overflow = '';

    return width;
  };

  //
  // autosave sends every minute the content
  // from the given editor to server.
  //
  var autosavetime = 1*60*1000; // check ervery 1 minutes
  startAutoSave = function(callback, interval)
  {
    var interval = interval || autosavetime;
    var autoSaveTimer = $.timer(interval, function(timer)
    {
      if (autoSaveTimer.autosaveIsRunning)
      {
        var result = callback();
        var userData = new Object();
        userData['id'] = result['id'];
        userData['content'] = result['text'];
        userData['store'] = 1;

        // send data to server
        sendHtmlRequest(REQUEST_SETDATA, ACTION_SEND_AUTOSAVE,
        function (responseData)
        {
          $.showMessage(responseData.message, 'slow', 3500, true);
        }, userData);
      }
      else
      {
        timer.stop();
      }
    });
    autoSaveTimer.autosaveIsRunning = true;
    return autoSaveTimer;
  }
  stopAutoSave = function(autoSaveTimer, id)
  {
    if (autoSaveTimer)
      autoSaveTimer.autosaveIsRunning = false;

    if (!id || id === "")
      return;

    var userData = new Object();
    userData['id'] = id;
    userData['store'] = 0;

    // send data to server
    sendHtmlRequest(REQUEST_SETDATA, ACTION_SEND_AUTOSAVE,
    function (responseData)
    {
    }, userData);
  }
  restoreAutoSave = function(id, callback)
  {
    if (!id || id === "")
      return;

    var userData = new Object();
    userData['id'] = id;

    // send data to server
    sendHtmlRequest(REQUEST_GETDATA, ACTION_RESTORE_AUTOSAVE,
    function (responseData)
    {
      if (responseData.content.length > 0)
      {
        $.messagebox(
        {
          caption: responseData.restoreAutoSaveTitle,
          message: responseData.restoreAutoSaveMessage,
          buttonState: "yes|no",
          defaultButton: 2,
          iconState: "question",
          callback: function(options, buttonState)
          {
            if (buttonState == "YES")
            {
              callback(responseData.content);
            }
          }
        });
      }
    }, userData);
  }

  //
  // main
  //

  $(document).ready(
  function()
  {
    $.getScript('/globalscripts/locale/resource.' + getLocale() + '.js',
    function()
    {
      // alert("loaded");
    });
  });
})(jQuery);

