var __documentResourcesHack = new Hash();

function createFCKEditors() {
  createFCKEditors(null);
}

function createFCKEditors(rootNode) {
  var fields = (rootNode == null) ? document.getElementsByTagName('textarea') : rootNode.getElementsByTagName('textarea');
  for ( var i = 0; i < fields.length; i++) {
    var node = fields[i];
    if (node.getAttribute('richedit') == 'yes') {
      node.removeAttribute('richedit');
      createFCKEditor(node);
    }
  }
}

function createFCKEditor(node) {
  var editorFieldName = node.getAttribute('name');
  var oFCKeditor = new FCKeditor(editorFieldName);
  oFCKeditor.BasePath = node.getAttribute('basepath');
  oFCKeditor.Width = node.getAttribute('width');
  oFCKeditor.Height = node.getAttribute('height');
  oFCKeditor.Config['CustomConfigurationsPath'] = node.getAttribute('configuration');
  oFCKeditor.Config['ProcessHTMLEntities'] = false;
  if (node.getAttribute('toolbarSet') != '') {
    oFCKeditor.ToolbarSet = node.getAttribute('toolbarSet');
  }
  
  var language = node.getAttribute('language');
  if (language && (language != '')) {
    oFCKeditor.Config['DefaultLanguage'] = language;
    oFCKeditor.Config['AutoDetectLanguage'] = false;
  }
   
  var conceptNo = node.getAttribute('conceptNo') != '' ? new Number(node.getAttribute('conceptNo')) : -1;
  var documentResourceNo = node.getAttribute('documentResourceNo') != '' ? new Number(node.getAttribute('documentResourceNo')) : -1;

  __documentResourcesHack.set(editorFieldName + '.documentResourceNo', documentResourceNo);
  __documentResourcesHack.set(editorFieldName + '.conceptNo', conceptNo);

  oFCKeditor.ReplaceTextarea();
  var form = $(node.form);

  form.disable();
  if (form._loadCounter == undefined)
    form._loadCounter = 0;
  else
    form._loadCounter++;
}

IxAbstractFCKDocumentSaver = Class.create( {
  initialize : function(saveURL, formElement) {
    this._saveURL = saveURL;
    this._formElement = formElement;
  },
  saveDocument : function(data) {
    this.showSaveDialog();
    var _this = this;

    try {
      new Ajax.Request(this._saveURL, {
        method : 'post',
        parameters : data,
        onComplete : function(transport) {
          _this.closeSaveDialog();

          if ((transport.status != 200) && (transport.status != 304)) {
            // virhetilanne
        var messageNode = transport.responseXML.documentElement.getElementsByTagName('message')[0];

        throw new Error(getElementText(messageNode));
      }
      else {
        // ok, mutta tarkistetaan tila ja paivitetaan updatecounter
        var validNode = transport.responseXML.documentElement.getElementsByTagName('valid')[0];
        var contentChangedNode = transport.responseXML.documentElement.getElementsByTagName('contentChanged')[0];

        var ret = parseInt(getElementText(validNode));
        if (ret == 1) {
          var newCounterNode = transport.responseXML.documentElement.getElementsByTagName('updateCounter')[0];
          storeAsHiddenValue(_this._formElement, 'updateCounter', parseInt(getElementText(newCounterNode)));
        }
        else {
          var messageNode = transport.responseXML.documentElement.getElementsByTagName('message')[0];
          _this.showError(getElementText(messageNode));
        }

        if (parseInt(getElementText(contentChangedNode)) == 1) {
          _this.reloadEditors();
        }
      }
    }
      });
    } catch (e) {
      this.showError(e);
    }
  },
  showSaveDialog : function() {
  },
  closeSaveDialog : function() {
  },
  showError : function(message) {
    alert(message);
  },
  reloadEditors : function() {
    window.location.href = window.location.href;
  }
});

function getElementText(node) {
  return node.textContent ? node.textContent : node.text;
}

function trim(s) {
  return s.replace(/^\s+|\s+$/g, '');
}

function isDigit(c) {
  return ((c >= '0') && (c <= '9'))
}

function ncr2unicode(s) {
  var result = '';
  var temp = '';
  for ( var i = 0; i < s.length; i++) {
    if (i < s.length - 3 && s.charAt(i) == '&' && s.charAt(i + 1) == '#' && isDigit(s.charAt(i + 2))) {
      i += 2;
      temp = '';
      while (i < s.length - 1 && isDigit(s.charAt(i))) {
        temp += s.charAt(i);
        i++;
      }
      if (s.charAt(i) == ';') {
        result += String.fromCharCode(parseInt(temp));
      }
      else {
        result += '&#' + temp;
        i--;
      }
    }
    else {
      result += s.charAt(i);
    }
  }
  return result;
}

function FCKeditor_OnComplete(editorInstance) {
  try {
    FCKeditorAPI.Instances[editorInstance.Name] = editorInstance;

    var conceptNo = __documentResourcesHack.get(editorInstance.Name + '.conceptNo');
    if (conceptNo != -1)
      editorInstance._conceptNo = conceptNo;

    var documentResourceNo = __documentResourcesHack.get(editorInstance.Name + '.documentResourceNo');
    if (documentResourceNo != -1)
      editorInstance._documentResource = documentResourceNo;

    try {
      if (typeof IxFCKeditor_OnComplete == "function")
        IxFCKeditor_OnComplete(editorInstance);
    } catch (e) {
    }

    var node = document.getElementsByName(editorInstance.Name)[0];
    var methodCall = node.getAttribute('fckInitialized');
    if (methodCall != '') {
      eval(methodCall);
    }
  } finally {
    var form = $(editorInstance.LinkedField.form);

    if (form._loadCounter == 0) {
      form.enable();
      form._loadCounter = undefined;
    }
    else {
      form._loadCounter--;
    }
  }
}

function fckSetDocumentLanguage(contentField, language) {
  var oEditor = FCKeditorAPI.Instances[contentField];
  oEditor._documentLanguage = language;
}

function fckInitializeEditor(options) {
  fckLoadLocalizedContent(options);
}

function fckLoadLocalizedContent(options) {
  var oEditor = FCKeditorAPI.Instances[options.contentField];
  var form = oEditor.LinkedField.form;
  var oXmlHttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('MsXml2.XmlHttp');

  // Haetaan halutun lokaalin mukainen dokumentti joko palvelimelta tai
  // hidden-kentasta ja paiskataan se fckEditorille

  var container = document.getElementById(options.contentField + '_' + options.language);
  if (container == null) {
    oXmlHttp.open("GET", options.contentLoader.replace('(lang)', options.language) + '&_d=' + (new Date() * 1), false);
    oXmlHttp.send(null);
    if (oXmlHttp.status == 200 || oXmlHttp.status == 304) {
      oEditor.SetHTML(oXmlHttp.responseText);
    }
  }
  else {
    oEditor.SetHTML(container.value);
  }

  // Haetaan halutun lokaalin mukainen otsikko joko palvelimelta tai
  // hidden-kentasta ja paiskataan se otsikkokenttaan

  if (options.titleField) {
    var titleElement = document.getElementsByName(options.titleField)[0];
    container = document.getElementById(options.titleField + '_' + options.language);
    if (container == null) {
      oXmlHttp.open("GET", options.titleLoader.replace('(lang)', options.language) + '&_d=' + (new Date() * 1), false);
      oXmlHttp.send(null);
      if (oXmlHttp.status == 200 || oXmlHttp.status == 304) {
        titleElement.value = ncr2unicode(trim(oXmlHttp.responseText));
      }
    }
    else {
      titleElement.value = container.value;
    }
  }

  // Tallennetaan talla hetkella kaytossa oleva lokaali niin fckChangeLanguage
  // pysyy kielen vaihtuessa perassa siita, mika kieli alunperin oli kaytossa

  storeAsHiddenValue(form, 'previousLang', options.language);

  // Vinkataan editorille minka kielista matskua se kasittelee

  fckSetDocumentLanguage(options.contentField, options.language);
}

function fckChangeLanguage(event, options) {
  var element = event.target ? event.target : event.srcElement;
  var form = element.form;

  var oldValue = document.getElementsByName('previousLang')[0].value;
  var newValue = element.value;

  // Sisallon tallentaminen

  var oEditor = FCKeditorAPI.GetInstance(options.contentField);
  storeAsHiddenValue(form, options.contentField + '_' + oldValue, oEditor.GetHTML());

  // Otsikon tallentaminen

  var titleElement = document.getElementsByName(options.titleField)[0];
  storeAsHiddenValue(form, options.titleField + '_' + oldValue, trim(titleElement.value));

  // Vinkataan editorille etta poistuva sisalto vaatii tallennusta

  storeAsHiddenValue(form, 'langModified_' + oldValue, 'true');

  // Uuden kieliversion lataaminen kayttoliittymaan

  options.language = newValue;
  fckLoadLocalizedContent(options);
}

function storeAsHiddenValue(form, fieldId, value) {
  var fields = $(form).select('input[name="' + fieldId + '"]');
  var container = (fields.length == 1) ? fields[0] : null;

  if (container == null) {
    container = document.createElement('input');
    container.type = 'hidden';
    container.name = fieldId;
    container.id = fieldId;
    form.appendChild(container);
  }
  container.value = value;
}
