/* $Date: 2009-08-18 00:38:58 +0200 (ti, 18 aug 2009) $    $Revision: 5200 $ */

var ajaxtiny = new Array();

function AjaxTiny(targetdiv, param, propId) {

  var styles = "";
  var hasTemplates = false;
  var language = "sv";
  var tl = null;
  var thisref = this;

  this.isChanged = false;
  var tinyIsReady = false;

  if (typeof(targetdiv) != "object")
    targetdiv = $(targetdiv);
  if (!targetdiv) return;
  this.targetdiv = targetdiv;

  this.hasPermission = new Object();

  var mainProp = new Object();
  if (propId) mainProp.id = propId;
  else {
    try { mainProp.id = parseInt(targetdiv.attributes.propid.nodeValue); }
    catch(e) { mainProp.id = 0; }
    if (isNaN(mainProp.id)) mainProp.id = 0;
    mainProp.name = (targetdiv ? targetdiv.id : "");
  }
  var tinyId = (targetdiv ? "tiny_" + targetdiv.id : "");

  this.param = param;
  if (this.param == null) this.param = new Object();
  if (this.param.width == null) this.param.width = (targetdiv.offsetWidth == 0 ? 300 : targetdiv.offsetWidth+4) + "px";
  if (this.param.height == null) this.param.height = (targetdiv.offsetHeight == 0 ? 150 : targetdiv.offsetHeight+30) + "px";
  if (this.param.dateControlled == null) this.param.dateControlled = false;
  if (this.param.relativeUrls == null) this.param.relativeUrls = true;
  if (this.param.baseUrl == null) this.param.baseUrl = "/";
  if (this.param.convertUrls == null) this.param.convertUrls = true;
  if (this.param.css == null) this.param.css = '/css/base.css, /css/tiny.css';
  if (this.param.toolbarItems == null) this.param.toolbarItems = "";
  if (this.param.toolbarConfig == null) this.param.toolbarConfig = (this.param.toolbarItems.length == 0 ? "extended" : "custom");
  if (this.param.languageDependent == null) this.param.languageDependent = true;
  if (this.param.toolbarLocation == null) this.param.toolbarLocation = "top";
  if (this.param.contentByAjax == null) this.param.contentByAjax = false;
  if (this.param.fixParentOverflow == null) this.param.fixParentOverflow = true;
  if (this.param.useZipTiny == null) this.param.useZipTiny = false;
  if (this.param.onInitDone == null) this.param.onInitDone = null;
  if (this.param.beforeShowEditor == null) this.param.beforeShowEditor = null;
  if (this.param.beforeHideEditor == null) this.param.beforeHideEditor = null;
  if (this.param.afterShowEditor == null) this.param.afterShowEditor = null;
  if (this.param.afterHideEditor == null) this.param.afterHideEditor = null;
  if (this.param.validElements == null) this.param.validElements = "script[charset|defer|language|src|type]";

  this.init = function() {
    if (targetdiv && (_loggedin || this.param.contentByAjax))
      this.getControlInfo(this.param.contentByAjax, function(){thisref.init2();});
    else {
      this.statdiv = targetdiv;
      if (this.param.onInitDone) this.param.onInitDone(this);
    }
  }

  this.init2 = function(response) {

    if (this.hasPermission.edit) {
      addCssToHead('admin/jstools/ajaxtiny/ajaxtiny.css');
      if (this.param.dateControlled) {
        addCssToHead('admin/jstools/datetimepicker/skins/tiger/theme.css');
        addJSToHead('admin/jstools/datetimepicker/calendar.js');
        addJSToHead('admin/jstools/datetimepicker/lang/calendar-' + language + '.js');
      }
    }

    this.generateDOM(function(){thisref.init3();});
  }

  this.init3 = function() {
    if (this.param.onInitDone) this.param.onInitDone(this);
  }

  this.getControlInfo = function(getContent, callback) {
    NFN.BasePage.GetControlInfo(_pageId, mainProp.id, mainProp.name, getContent, function(r) {thisref.getControlInfo2(r, getContent, callback)});
  }

  this.getControlInfo2 = function(response, getContent, callback) {
    if (response.error) {
      try { console.log("Error in GetControlInfo: " + response.error.Message); } catch(e){};
      return;
    }
    if (!response.value) {
      try { console.log("Error in GetControlInfo: response is null."); } catch(e){};
      return;
    }

    var propInfo = response.value[0];
    var permInfo = response.value[1];
    var extraInfo = response.value[2];

    mainProp.id = parseInt(propInfo[0]);
    mainProp.name = propInfo[1];
    mainProp.modDate = propInfo[2];
    mainProp.modBy = propInfo[3];
    mainProp.publishedDate = propInfo[4];
    mainProp.publishedBy = propInfo[5];
    mainProp.isPublished = propInfo[6] == "y";
    mainProp.isVisible = propInfo[7] == "y";
    mainProp.isShared = propInfo[8] == "y";
    mainProp.canBeShared = propInfo[9] == "y";
    mainProp.isCommon = propInfo[10] == "y";
    mainProp.canBeCommon = propInfo[11] == "y";
    mainProp.startDate = propInfo[12];
    mainProp.endDate = propInfo[13];
    if (getContent)
      mainProp.value = propInfo[14];
    else
      mainProp.value = targetdiv.innerHTML;

    this.hasPermission.isSysAdmin = permInfo[0] == "y";
    this.hasPermission.edit = permInfo[1] == "y";
    this.hasPermission.publish = permInfo[2] == "y";
    this.hasPermission.show = permInfo[3] == "y";
    this.hasPermission.share = permInfo[4] == "y";
    this.hasPermission.Paragraph = permInfo[5] == "y";
    this.hasPermission.Font = permInfo[6] == "y";
    this.hasPermission.Css = permInfo[7] == "y";
    this.hasPermission.Character = permInfo[8] == "y";
    this.hasPermission.CharacterExtended = permInfo[9] == "y";
    this.hasPermission.Color = permInfo[10] == "y";
    this.hasPermission.Justify = permInfo[11] == "y";
    this.hasPermission.Paste = permInfo[12] == "y";
    this.hasPermission.PasteExtended = permInfo[13] == "y";
    this.hasPermission.Undo = permInfo[14] == "y";
    this.hasPermission.Search = permInfo[15] == "y";
    this.hasPermission.Link = permInfo[16] == "y";
    this.hasPermission.DocumentBank = permInfo[17] == "y";
    this.hasPermission.Media = permInfo[18] == "y";
    this.hasPermission.HtmlTemplates = permInfo[19] == "y";
    this.hasPermission.List = permInfo[20] == "y";
    this.hasPermission.Indent = permInfo[21] == "y";
    this.hasPermission.Table = permInfo[22] == "y";
    this.hasPermission.TableExtended = permInfo[23] == "y";
    this.hasPermission.Style = permInfo[24] == "y";
    this.hasPermission.Layer = permInfo[25] == "y";
    this.hasPermission.Zoom = permInfo[26] == "y";
    this.hasPermission.Special = permInfo[27] == "y";
    this.hasPermission.SpecialExtended = permInfo[28] == "y";
    this.hasPermission.Advanced = permInfo[29] == "y";

    styles = extraInfo[0];
    hasTemplates = extraInfo[1] == "y";
    language = extraInfo[2];

    if (callback) callback();
  }


  this.generateDOM = function(callback) {
    this.maindiv = $C("DIV");
    this.maindiv.id = tinyId + "_main";

    if (this.hasPermission.edit) {
      if (this.param.dateControlled) {
        this.inpstartdate = $CA("input", this.maindiv, {type:"hidden", value:mainProp.startDate});
        this.inpenddate = $CA("input", this.maindiv, {type:"hidden", value:mainProp.endDate});
      }

      if (this.hasPermission.isSysAdmin) {
        this.permdiv = $CA("DIV", this.maindiv, { className:"ajaxPermissions" }, { backgroundColor:"#fff", width:this.param.width, height:this.param.height });

        var adiv = $CA("DIV", this.permdiv, { className:"ajaxHeadDiv" });
        var aanc = $CA("A", adiv, { href:"javascript:void(0)", onfocus:function(){this.blur();}, onclick:function(e) {thisref.stopPropagation(e);thisref.permdiv.style.display = "none";} } );
        var aimg = $CA("IMG", aanc, { src:"admin/gfx/closewind.gif", alt:this.translate("Stäng"), border:"0" } );

        this.permroles = $CA("DIV", this.permdiv, { className:"ajaxRolesDiv" });
        this.permsettings = $CA("DIV", this.permdiv, { className:"ajaxPermissionDiv" });
      }

      this.viewdiv = $CA("DIV", this.maindiv, { className:"ajaxToolbarStatic", onmouseover:function(){thisref.highlight(true)}, onmouseout:function(){thisref.highlight(false)} }, {zIndex:"10"});

      var atable = $CA("TABLE", this.viewdiv);
      var atbody = $CA("TBODY", atable);
      var atr = $CA("TR", atbody);
      var atd = $CA("TD", atr);
      var aimg = $CA("IMG", atd, { src:"admin/gfx/hidden.gif", alt:this.translate("Elementet visas inte på den publika sidan"), title:this.translate("Elementet visas inte på den publika sidan") }, { display:"none" });

      atd = $CA("TD", atr);
      var atitle = this.translate("Redigera elementet") + " " + tinyId.substring(5) + "(" + mainProp.id + ")\n\r" + this.translate("Senast redigerat av") + " " + mainProp.modBy + " " + mainProp.modDate + "\n\r" + this.translate("Senast publicerat av") + " " + mainProp.publishedBy + " " + mainProp.publishedDate;
      this.editlink = $CA("A", atd, { href:"javascript:void(0)", onfocus:function(){this.blur();}, onclick:function(e){thisref.edit(e);}, title:atitle });
      aimg = $CA("IMG", this.editlink, { src:"admin/gfx/edit.gif", alt:this.translate("Redigera elementet"), border:"0" });

      if (this.hasPermission.isSysAdmin) {
        atd = $CA("TD", atr);
        var aanc = $CA("A", atd, { href:"javascript:void(0)", onfocus:function(){this.blur();}, onclick:function(e){thisref.showPermissions(e);}, onmouseover:function(){thisref.highlight(true);}, onmouseout:function(){thisref.highlight(false);}, title:this.translate("Redigera behörigheter") });
        aimg = $CA("IMG", aanc, { src:"admin/gfx/permission.gif", alt:this.translate("Redigera behörigheter"), border:"0" });
      }

      if (this.hasPermission.publish) {
        atd = $CA("TD", atr);
        this.publishbtn = $CA("A", atd, { href:"javascript:void(0)", onfocus:function(){this.blur();}, onclick:function(e){thisref.publish(e);}, onmouseover:function(){thisref.highlight(true);}, onmouseout:function(){thisref.highlight(false);}, title:this.translate("Publicera ändringar") }, {display:(mainProp.isPublished ? "none" : "inline")});
        aimg = $CA("IMG", this.publishbtn, { src:"admin/gfx/publish.gif", alt:this.translate("Publicera ändringar"), border:"0" });

        atd = $CA("TD", atr);
        this.unpublishbtn = $CA("A", atd, { href:"javascript:void(0)", onfocus:function(){this.blur();}, onclick:function(e){thisref.unpublish(e);}, onmouseover:function(){thisref.highlight(true);}, onmouseout:function(){thisref.highlight(false);}, title:this.translate("Ångra till senast publicerat") }, {display:(mainProp.isPublished ? "none" : "inline")});
        aimg = $CA("IMG", this.unpublishbtn, { src:"admin/gfx/unpublish.gif", alt:this.translate("Ångra till senast publicerat"), border:"0" });
      }
      else {
        atd = $CA("TD", atr);
        this.publishinfo = $CA("SPAN", atd, null, { display:(mainProp.isPublished ? "none" : "inline") });
        aimg = $CA("IMG", this.publishinfo, { src:"admin/gfx/publish.gif", alt:this.translate("Elementets innehåll är ändrat men inte publicerat"), border:"0" });
      }
    }

    this.statdiv = $CA("DIV", this.maindiv, { id:tinyId + "_static" });
    this.setStaticContent(mainProp.value);

    if (this.hasPermission.edit) {
      this.statdiv.onmouseover = function() {thisref.highlight(true);};
      this.statdiv.onmouseout = function() {thisref.highlight(false);};

      this.editdiv = $CA("DIV", this.maindiv, null, { display:"none", position:"relative", left:"-1px", top:"-1px" });
      adiv = $CA("DIV", this.editdiv, { id:tinyId + "_mce", innerHTML:mainProp.value });
    }

    setTimeout(function(){thisref.whenDomLoaded(callback);}, 500);

  },

  this.whenDomLoaded = function(callback) {
    while (targetdiv.firstChild) targetdiv.removeChild(targetdiv.firstChild);
    targetdiv.appendChild(this.maindiv);
    callback();
  }

  this.replaceScripts = function(aval) {
    var re = new RegExp(/<script\b[^>]*>(.*?)<\/script>/);
    var scripts = "";
    var s = re.exec(aval);
    var count = 0;
    while (s && count < 100) {
      var ascript = s[0].substring(31, s[0].length-9);
      ascript = ascript.replace(/writeFlash\(/g, "writeFlash('_fs" + tinyId + count + "_',");
      ascript = ascript.replace(/writeShockWave\(/g, "writeShockWave('_fs" + tinyId + count + "_',");
      ascript = ascript.replace(/writeQuickTime\(/g, "writeQuickTime('_fs" + tinyId + count + "_',");
      ascript = ascript.replace(/writeRealMedia\(/g, "writeRealMedia('_fs" + tinyId + count + "_',");
      ascript = ascript.replace(/writeWindowsMedia\(/g, "writeWindowsMedia('_fs" + tinyId + count + "_',");
      scripts += ascript;
      aval = aval.replace(s[0], "<span id='_fs" + tinyId + count + "_'></span>");
      count++;
      s = re.exec(aval);
    }
    return [aval, scripts];
  },

  this.setStaticContent = function(cont) {
    var res = this.replaceScripts(cont);
    this.statdiv.innerHTML = res[0];
    if (res[1].length > 0)
      eval(res[1]);
  },

  this.setProperty = function(propertyName, propertyId, callback) {
    mainProp.id = propertyId;
    mainProp.name = propertyName;
    this.getControlInfo(true, function() {thisref.setProperty2(callback);});
  },

  this.setProperty2 = function(callback) {
    this.setStaticContent(mainProp.value);
    if (this.hasPermission.edit)
      this.setTinyContent(mainProp.value);
    var atitle = this.translate("Redigera elementet") + " " + tinyId.substring(5) + "(" + mainProp.id + ")\n\r" + this.translate("Senast redigerat av") + " " + mainProp.modBy + " " + mainProp.modDate + "\n\r" + this.translate("Senast publicerat av") + " " + mainProp.publishedBy + " " + mainProp.publishedDate;
    if (this.editlink)
      this.editlink.title = atitle;
    if (callback) callback();
  },

  this.tinyInstance = function() {
    return tinyMCE.editors[tinyId + "_mce"];
  }

  this.getToolbars = function() {
    var res = null;
    if (this.param["toolbarItems"].length == 0) {
      if (this.param["toolbarConfig"] == "empty") {
        this.param["toolbarItems"] = "";
        if (this.hasPermission.isSysAdmin) this.param["toolbarItems"] += "Advanced";
      }
      else if (this.param["toolbarConfig"] == "simple") {
        this.param["toolbarItems"] = "Character;Link;Undo;DocumentBank";
        if (this.hasPermission.isSysAdmin) this.param["toolbarItems"] += ";Advanced";
      }
      else if (this.param["toolbarConfig"] == "standard") {
        this.param["toolbarItems"] = "Paragraph;Character;Css;Justify;Paste;Undo;Link;DocumentBank;HtmlTemplates";
        if (this.hasPermission.isSysAdmin) this.param["toolbarItems"] += ";Advanced";
      }
      else if (this.param["toolbarConfig"] == "extended") {
        this.param["toolbarItems"] = "Paragraph;Css;Character;Justify;Paste;Undo;Link;DocumentBank;Media;HtmlTemplates;List;TableExtended;Layer;Style;Advanced";
      }
      else if (this.param["toolbarConfig"] == "advanced") {
        this.param["toolbarItems"] = "Paragraph;Font;Css;CharacterExtended;Color;Justify;Paste;Undo;Link;DocumentBank;Media;HtmlTemplates;List;Indent;TableExtended;Style;Layer;Zoom;Special;Advanced";
      }
      else if (this.param["toolbarConfig"] == "full") {
        this.param["toolbarItems"] = "Paragraph;Font;Css;CharacterExtended;Color;Justify;Paste;Undo;Search;Link;DocumentBank;Media;HtmlTemplates;List;Indent;TableExtended;Style;Layer;Zoom;SpecialExtended;Advanced";
      }
    }
    return this.param["toolbarItems"];
  },


  this.getTools = function() {

    function addItem(s, item) {
      if (s.length > 0) s += ",separator,";
      s += item;
      return s;
    }

    var showShare = this.hasPermission.share && mainProp.canBeShared;
    var showCommon = this.hasPermission.share && mainProp.canBeCommon;
    var s = "save";
    if (this.hasPermission.publish) s += ",savepublish";
    s += ",cancel";
    if (this.hasPermission.show || showShare || showCommon) {
      s += ",separator";
      if (this.hasPermission.show) s += ",showhide";
      if (showShare) s += ",share";
      if (showCommon) s += ",common";
    }
    if (this.param.dateControlled)
      s += ",startdate,enddate";

    var tbstr = this.getToolbars();
    var tb = tbstr.split(';');;
    for (var i=0; i < tb.length; i++) {
      if (tb[i] == "Paragraph" && this.hasPermission.Paragraph) s = addItem(s, "formatselect");
      else if (tb[i] == "Font" && this.hasPermission.Font) s = addItem(s, "fontselect,fontsizeselect");
      else if (tb[i] == "Css" && this.hasPermission.Css && styles.length > 0 ) s = addItem(s, "styleselect");
      else if (tb[i] == "Character" && tbstr.indexOf("CharacterExtended") < 0 && this.hasPermission.Character) s = addItem(s, "bold,italic");
      else if (tb[i] == "CharacterExtended" && this.hasPermission.CharacterExtended) s = addItem(s, "bold,italic,underline,strikethrough,sub,sup");
      else if (tb[i] == "Color" && this.hasPermission.Color) s = addItem(s, "forecolor,backcolor");
      else if (tb[i] == "Justify" && this.hasPermission.Justify) s = addItem(s, "justifyleft,justifycenter,justifyright,justifyfull");
      else if (tb[i] == "Paste" && tbstr.indexOf("PasteExtended") < 0 && this.hasPermission.Paste) s = addItem(s, "cut,copy,paste");
      else if (tb[i] == "PasteExtended" && this.hasPermission.PasteExtended) s = addItem(s, "cut,copy,paste,pastetext,pasteword,selectall");
      else if (tb[i] == "Undo" && this.hasPermission.Undo) s = addItem(s, "undo,redo");
      else if (tb[i] == "Search" && this.hasPermission.Search) s = addItem(s, "search,replace");
      else if (tb[i] == "Link" && this.hasPermission.Link) s = addItem(s, "link,unlink,anchor");
      else if (tb[i] == "DocumentBank" && this.hasPermission.DocumentBank) s = addItem(s, "docbank,image");
      else if (tb[i] == "Media" && this.hasPermission.Media) s = addItem(s, "media");
      else if (tb[i] == "HtmlTemplates" && this.hasPermission.HtmlTemplates && hasTemplates) s = addItem(s, "template");
      else if (tb[i] == "List" && this.hasPermission.List) s = addItem(s, "bullist,numlist");
      else if (tb[i] == "Indent" && this.hasPermission.Indent) s = addItem(s, "outdent,indent");
      else if (tb[i] == "Table" && tbstr.indexOf("TableExtended") < 0 && this.hasPermission.Table) s = addItem(s, "table,delete_col,delete_row,col_after,col_before,row_after,row_before");
      else if (tb[i] == "TableExtended" && this.hasPermission.TableExtended) s = addItem(s, "table,row_props,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,split_cells,merge_cells");
      else if (tb[i] == "Style" && this.hasPermission.Style) s = addItem(s, "styleprops,removeformat");
      else if (tb[i] == "Layer" && this.hasPermission.Layer) s = addItem(s, "insertlayer,moveforward,movebackward,absolute");
      else if (tb[i] == "Zoom" && this.hasPermission.Zoom) s = addItem(s, "zoom");
      else if (tb[i] == "Special" && tbstr.indexOf("SpecialExtended") < 0 && this.hasPermission.Special) s = addItem(s, "hr,charmap");
      else if (tb[i] == "SpecialExtended" && this.hasPermission.SpecialExtended) s = addItem(s, "hr,charmap,emotions,insertdate,insterttime,nonbreaking");
      else if (tb[i] == "Advanced" && this.hasPermission.Advanced) s = addItem(s, "cleanup,code");
    }
    return s;
  },


  this.getPlugins = function(tools) {
    var plugins = "inlinepopups";
    if (tools.length > 0) plugins += ",contextmenu";
    if (tools.indexOf("styleprops") >= 0) plugins += ",style";
    if (tools.indexOf("insertlayer") >= 0) plugins += ",layer";
    if (tools.indexOf("table") >= 0) plugins += ",table";
    if (tools.indexOf("template") >= 0) plugins += ",template";
    if (tools.indexOf("zoom") >= 0) plugins += ",zoom";
    if (tools.indexOf("link") >= 0) plugins += ",advlink";
    if (tools.indexOf("image") >= 0) plugins += ",advimage";
    if (tools.indexOf("emotions") >= 0) plugins += ",emotions";
    if (tools.indexOf("insertdate") >= 0) plugins += ",insertdatetime";
    if (tools.indexOf("paste") >= 0) plugins += ",paste";
    if (tools.indexOf("search") >= 0) plugins += ",searchreplace";
    if (tools.indexOf("nonbreaking") >= 0) plugins += ",nonbreaking";
    if (tools.indexOf("media") >= 0) plugins += ",media";
    return plugins;
  },

  this.initTiny = function(callback) {
    var tools = this.getTools();
    var plugins = this.getPlugins(tools);

    if (this.param.useZipTiny) {
      tinyMCE_GZ.init({
        plugins : plugins,
        themes : 'advanced',
        languages : 'en',
        disk_cache : true,
        debug : false
      });
    }

    this.tinyConfigs = {
      mode:'exact',
      elements:tinyId + '_mce',
      relative_urls:this.param["relativeUrls"],
      remove_script_host : false,
      document_base_url : this.param["baseUrl"],
      convert_urls:this.param["convertUrls"],
      theme:'advanced',
      language:language,
      onchange_callback: function() { thisref.onChange() },
      init_instance_callback : function(inst) { thisref.initTinyDone(callback); },
      content_css:this.param["css"],
      width:this.param["width"],
      height:this.param["height"],
      plugins:plugins,
      media_use_script:false,
      extended_valid_elements:this.param.validElements,
      strict_loading_mode : false,
      theme_advanced_toolbar_location: this.param["toolbarLocation"],
      theme_advanced_containers_default_align:'left',
      theme_advanced_buttons1:tools,
      theme_advanced_buttons2:"",
      theme_advanced_buttons3:"",
      theme_advanced_styles:styles,
      template_templates: this.getHtmlTemplates(),
      file_browser_callback:function(field_name, url, type, win) { thisref.openDocumentBank(field_name, url, type, win); },
      setup : function(ed) {
        ed.addButton('save', { title:thisref.translate("Spara ändringar"), image:'admin/tiny_mce3/gfx/save.gif', onclick:function(e){ thisref.save(e,false); }});
        ed.addButton('savepublish', { title:thisref.translate("Spara och publicera ändringar"), image:'admin/tiny_mce3/gfx/savepublish.gif', onclick:function(e){ thisref.save(e,true); }});
        ed.addButton('cancel', { title:thisref.translate("Ångra ändringar"), image:'admin/tiny_mce3/gfx/cancel.gif', onclick:function(e){ thisref.undo(e); }});
        ed.addButton('showhide', { title:(mainProp.isVisible ? thisref.translate("Dölj elementet på den publika sidan") : thisref.translate("Visa elementet på den publika sidan")), image:(mainProp.isVisible ? "admin/tiny_mce3/gfx/hide.gif" : "admin/tiny_mce3/gfx/show.gif"), onclick:function(e){ thisref.showHide(e); }});
        ed.addButton('share', { title:(mainProp.isShared ? thisref.translate("Ångra delning av elementets egenskaper med andra webbsidor") : thisref.translate("Dela elementets egenskaper med andra webbsidor")), image:(mainProp.isShared ? "admin/tiny_mce3/gfx/unshare.gif" : "admin/tiny_mce3/gfx/share.gif"), onclick:function(e){ thisref.share(e); }});
        ed.addButton('common', { title:(mainProp.isShared ? thisref.translate("Ångra delning av elementets egenskaper med hela sajten") : thisref.translate("Dela elementets egenskaper med hela sajten")), image:(mainProp.isCommon ? "admin/tiny_mce3/gfx/uncommon.gif" : "admin/tiny_mce3/gfx/common.gif"), onclick:function(e){ thisref.common(e); }});
        ed.addButton('startdate', { title:thisref.translate("Sätt startdatum för visning"), image:"admin/tiny_mce3/gfx/starttime.gif", onclick:function(e){ thisref.setStartDate(e); }});
        ed.addButton('enddate', { title:thisref.translate("Sätt slutdatum för visning"), image:"admin/tiny_mce3/gfx/endtime.gif", onclick:function(e){ thisref.setEndDate(e); }});
        ed.onPaste.add(function(ed, e, o) {
          ed.execCommand('mcePasteText', true);
          return tinymce.dom.Event.cancel(e);
        });
      }
    }
    tinyMCE.init(this.tinyConfigs);
  },


  this.initTinyDone = function(callback) {
    var tt = $(tinyId + "_mce_toolbar1");
    var tr = tt.firstChild;
    if (tr.tagName != "TR") tr = tr.firstChild;

    var tdiv = $C("DIV");
    for (var i=0; i < tr.childNodes.length; i++) {
      var adiv = $C("DIV");
      if (document.all) adiv.style.styleFloat = "left";
      else adiv.style.cssFloat = "left";
      //adiv.style.width = "auto";
      var elem = tr.childNodes[i].firstChild;
      tr.childNodes[i].removeChild(elem);
      adiv.appendChild(elem);
      tt.parentNode.appendChild(adiv);
    }
    var cdiv = $C("DIV");
    cdiv.className = "clearfloat";
    tt.parentNode.appendChild(cdiv);
    tt.parentNode.removeChild(tt);
    tr.firstChild.style.width = this.param["width"];;

    tinyIsReady = true;

    callback();
  }

  this.setStartDate = function(e) {
    this.stopPropagation(e);
    var inp = this.inpstartdate;
    var icon = $(tinyId + '_mce_startdate');
    showCalendar(inp, icon, false, function(cal, adate){inp.value=adate;mainProp.startDate=adate;});
  }

  this.setEndDate = function(e) {
    this.stopPropagation(e);
    var inp = this.inpenddate;
    var icon = $(tinyId + '_mce_enddate');
    showCalendar(inp, icon, false, function(cal, adate){inp.value=adate;mainProp.endDate = adate;});
  }

  this.resize = function(w, h) {
    if (!tinyIsReady) {
      this.initTiny(function(){thisref.resize(w, h);});
      return;
    }
    if (this.tinyInstance()) {
      var docFrame = this.tinyInstance().contentAreaContainer.firstChild;
      docFrame.style.width = w + "px";
      docFrame.style.height = h + "px";
    }
  }

  this.getHtmlTemplates = function() {
    var response = NFN.BasePage.GetHtmlTemplates();
    var res = new Array(response.value.length);
    for (var i=0; i < response.value.length; i++) {
      var vals = response.value[i].split('|');
      var d = (vals.length > 2 ? vals[1] : vals[0]);
      var v = (vals.length > 2 ? vals[2] : vals[1]);
      res[i] = {title:vals[0], value:v, description:d};
    }
    return res;
  },

  this.openDocumentBank = function(field_name, url, type, win) {
    tinyMCE.activeEditor.windowManager.open({
      file : "/admin/DocumentBank/DocumentBank.aspx?fromtiny=y&maxwidth=" + this.param["width"],
      title : this.translate('Mediabank'),
      width : 900,
      height : 600,
      resizable : "yes",
      inline : "yes",
      close_previous : "yes"
    },
    {
      window : win,
      input : field_name,
      allowedtype : type
    });
    return false;
  },

  this.onChange = function() {
    this.isChanged = true;
  },

  this.translate = function(txt) {
    if (language == "sv") return txt;
    if (tl == null) tl = new Object();
    if (!tl[language]) {
      var s = "Stäng|Elementet visas inte på den publika sidan|Redigera elementet|Senast redigerat av|Senast publicerat av|Redigera behörigheter|Publicera ändringar|Ångra till senast publicerat|Elementets innehåll är ändrat men inte publicerat|Visa elementet på den publika sidan|Dölj elementet på den publika sidan|Dela elementets egenskaper med andra webbsidor|Ångra delning av elementets egenskaper med andra webbsidor|Dela elementets egenskaper med hela sajten|Ångra delning av elementets egenskaper med hela sajten|Spara och publicera ändringar i elementet|Spara ändringar i elementet|Ångra ändringar|Posten redigeras av en annan användare. Försök senare|Är du säker på att du vill ångra ändringar och återgå till det senast publicerade värdet|Denna åtgärd medför att nuvarande information i kontrollen ersätts med delad information. Vill du fortsätta|Denna åtä¤rd medför att motsvarande informationspost på alla sajtens sidor kommer att ha samma innehåll. Vill du fortsätta|Denna åtgärd medför att motsvarande informationspost på sajtens olika sidor ej längre kommer att dela innehåll. Vill du fortsätta|Roller|Välj roll|Sätt standardbehörigheter för rollen|Behörigheter";
      var sarr = s.split('|');
      var response = NFN.BasePage.TranslateArr(sarr);
      tl[language] = new Object();
      for (var i=0; i < sarr.length; i++)
        tl[language][sarr[i]] = response.value[i];
    }
    return (tl[language][txt] ? tl[language][txt] : txt);
  },

  this.setTinyContent = function(html) {
    if (!tinyIsReady) {
      this.initTiny(function(){thisref.setTinyContent(html);});
      return;
    }
    this.tinyInstance().setContent(html);
  },

  this.checkLoggedIn = function() {
    var response = NFN.BasePage.CheckLoggedIn();
    if (!response.value) {
      this.lockProperty(false);
      window.location.reload();
    }
  },

  this.lockProperty = function(lock) {
    if (lock) NFN.BasePage.LockProperty(mainProp.id);
    else NFN.BasePage.UnlockProperty(mainProp.id);
  },

  this.stopPropagation = function(e) {
    if (e && e.stopPropagation) e.stopPropagation();
    else if (window.event && window.event.cancelBubble)
    window.event.cancelBubble = true;
  }

  this.edit = function(e) {
    this.checkLoggedIn();
    this.stopPropagation(e);
    var response = NFN.BasePage.IsLockedProperty(mainProp.id);
    if (response.value)
      alert(this.translate("Posten redigeras av en annan användare. Försök senare") + ".");
    else {
      this.lockProperty(true);
      this.showEditor(true);
    }
  },

  this.fixParentOverflow = function(show) {
    if (show) {
      this.parentelems = new Array();
      var elem = $(tinyId + "_main").parentNode;
      while (elem) {
        if (elem.style) {
          this.parentelems.push({
            elem: elem,
            overflow: elem.style.overflow
          });
          elem.style.overflow = "visible";
        }
        elem = elem.parentNode;
      }
    }
    else if (this.parentelems) {
      for (var i=0; i < this.parentelems.length; i++)
        this.parentelems[i].elem.style.overflow = this.parentelems[i].overflow;
      this.parentelems.clear();
    }
  },

  this.showEditor = function(show) {
    if (show && this.param.beforeShowEditor) this.param.beforeShowEditor(this);
    if (!show && this.param.beforeHideEditor) this.param.beforeHideEditor(this);
    if (show && !tinyIsReady) {
      this.initTiny(function(){thisref.showEditor(true);});
      return;
    }
    if (this.param.fixParentOverflow) this.fixParentOverflow(show);
    this.viewdiv.style.display = (show ? "none" : "block");
    this.statdiv.style.display = (show ? "none" : "block");
    this.editdiv.style.display = (show ? "block" : "none");
    if (show && this.param.afterShowEditor) this.param.afterShowEditor(this);
    if (!show && this.param.afterHideEditor) this.param.afterHideEditor(this);
  },

  this.showPublishButtons = function(show) {
    var disp = (show ? "inline" : "none");
    if (this.publishbtn != null) this.publishbtn.style.display = disp;
    if (this.unpublishbtn != null) this.unpublishbtn.style.display = disp;
    if (this.publishinfo != null) this.publishinfo.style.display = disp;
  }

  this.publish = function(e) {
    this.checkLoggedIn();
    this.stopPropagation(e);
    NFN.BasePage.PublishProperty(mainProp.id);
    this.showPublishButtons(false);
  },

  this.unpublish = function(e) {
    this.checkLoggedIn();
    this.stopPropagation(e);
    if (confirm(this.translate("Är du säker på att du vill ångra ändringar och återgå till det senast publicerade värdet") + "?")) {
      NFN.BasePage.UnpublishProperty(mainProp.id);
      var textProp = (language == "sv" || !this.param["languageDependent"] ? "text" : "text_" + language);
      var response = NFN.BasePage.GetPropVal(mainProp.id, textProp);
      this.setTinyContent(response.value);
      this.setStaticContent(response.value);
      this.showPublishButtons(false);
    }
  },

  this.save = function(e, publish) {
    this.stopPropagation(e);
    this.checkLoggedIn();
    //if (this.isChanged) {
      var html = this.tinyInstance().getContent();
      var sd = (this.param.dateControlled ? mainProp.startDate : null);
      var ed = (this.param.dateControlled ? mainProp.endDate : null);
      NFN.BasePage.SaveTiny(mainProp.id, "text", html, publish, mainProp.isVisible, sd, ed);

      this.setStaticContent(html);
      this.showPublishButtons(!publish);
    //}
    this.lockProperty(false);
    this.showEditor(false);
    this.isChanged = false;
  },

  this.undo = function(e) {
    this.stopPropagation(e);
    this.checkLoggedIn();
    if (this.isChanged) {
      var html = this.statdiv.innerHTML;
      this.setTinyContent(html);
    }
    this.lockProperty(false);
    this.showEditor(false);
    this.isChanged = false;
  },

  this.showHide = function(e) {
    this.stopPropagation(e);
    this.checkLoggedIn();
    var show = !mainProp.isVisible;
    NFN.BasePage.ShowHideProperty(mainProp.id, show);
    mainProp.isVisible = !mainProp.isVisible;

    $(tinyId + "_mce_showhide").title = (show ? this.translate("Dölj elementet på den publika sidan") : this.translate("Visa elementet på den publika sidan"));
    $(tinyId + "_mce_showhide").firstChild.src = (show ? "admin/tiny_mce3/gfx/hide.gif" : "admin/tiny_mce3/gfx/show.gif");
  },

  this.share = function(e) {
    this.stopPropagation(e);
    this.checkLoggedIn();

    var share = !mainProp.isShared;
    var ok = true;
    if (share) {
      var response = NFN.BasePage.ShareWillLooseData(_pageId, mainProp.name);
      if (response.value)
        ok = confirm(this.translate("Denna åtgärd medför att nuvarande information i kontrollen ersätts med delad information. Vill du fortsätta") + "?");
    }
    if (ok) {
      var response = NFN.BasePage.SetSharing(_pageId, mainProp.id, "", share);

      if (response.value.length > 0) {
        mainProp.isShared = !mainProp.isShared;
        $(tinyId + "_mce_share").title = (share ? this.translate("Ångra delning av elementets egenskaper med andra webbsidor") : this.translate("Dela elementets egenskaper med andra webbsidor"));
        $(tinyId + "_mce_share").firstChild.src = (share ? "admin/tiny_mce3/gfx/unshare.gif" : "admin/tiny_mce3/gfx/share.gif");

        var res = response.value.split('|');
        mainProp.id = res[0];
        var shared = (res[2] == "Y");
        var published = (res[3] == "Y");
        var html = res[4];
        if (html != "$nochange$") {
          this.setTinyContent(html);
          this.setStaticContent(html);
        }

        this.showPublishButtons(!published);
      }
    }
  },


  this.common = function(e) {
    this.stopPropagation(e);
    this.checkLoggedIn();
    var share = !mainProp.isCommon;
    var ok;
    if (share) ok = confirm(this.translate("Denna åtgärd medför att motsvarande informationspost på alla sajtens sidor kommer att ha samma innehåll. Vill du fortsätta") + "?");
    else ok = confirm(this.translate("Denna åtgärd medför att motsvarande informationspost på sajtens olika sidor ej längre kommer att dela innehåll. Vill du fortsätta") + "?");
    if (ok) {
      var response = NFN.BasePage.SetCommon(_pageId, mainProp.id, "", share);
      if (response.value != null && response.value.length > 0) {
        mainProp.isCommon = !mainProp.isCommon;

        mainProp.id = response.value[0];
        var shared = (response.value[2] == "Y");
        var published = (response.value[3] == "Y");
        var html = response.value[4];

        this.setTinyContent(html);
        this.setStaticContent(html);

        $(tinyId + "_mce_common").title = (share ? this.translate("Ångra delning av elementets egenskaper med hela sajten") : this.translate("Dela elementets egenskaper med hela sajten"));
        $(tinyId + "_mce_common").firstChild.src = (share ? "admin/tiny_mce3/gfx/uncommon.gif" : "admin/tiny_mce3/gfx/common.gif");
        $S(tinyId + "_mce_share").display = (shared ? "none" : "");

        this.showPublishButtons(!published);
      }
    }
  },

  this.showPermissions = function(e) {
    this.stopPropagation(e);
    var response = NFN.BasePage.GetRoles("dummy");
    var res = response.value.split(';');
    var roles = res[1].split('|');

    this.permroles.innerHTML = "";

    var ap = $CA("P", this.permroles, { className:"ajaxHeadline", innerHTML:this.translate("Roller") });
    var aselect = $CA("SELECT", this.permroles, { id:tinyId + "_rolelist", onchange:function() {thisref.tinyRoleChanged(this);} });
    $CA("OPTION", aselect, { innerHTML:"--" + this.translate("Välj roll") + "--" });
    for (var i=0; i < roles.length; i++)
      $CA("OPTION", aselect, { innerHTML:roles[i] });

    var aanc = $CA("A", this.permroles, { href:"javascript:void(0)", onfocus:function(){this.blur();}, onclick:function(e) {thisref.tinyDefaultPermissions();}, title:this.translate("Sätt standardbehörigheter för rollen") }, { marginLeft:"20px" });
    $CA("IMG", aanc, { src:"admin/gfx/default.gif", alt:this.translate("Sätt standardbehörigheter för rollen"), border:"0" });

    this.permsettings.innerHTML = "";
    this.permdiv.style.display = "block";
  },

  this.highlight = function(hl) {
    this.statdiv.className = (hl ? "highlightEdit" : "");
    this.viewdiv.style.display = (hl ? "block" : "none");
  },

  this.tinyDefaultPermissions = function(e) {
    this.stopPropagation(e);
    var list = $(tinyId + "_rolelist");
    if (list.selectedIndex == 0)
      alert(this.translate("Välj roll"));
    else {
      var role = list.options[list.selectedIndex].innerHTML;
      var response = NFN.BasePage.SetDefaultPermissions(mainProp.id, role);
      this.tinyRoleChanged(list);
    }
  },

  this.tinyRoleChanged = function(list) {
    if (list.selectedIndex == 0) {
      this.permsettings.innerHTML = "";
    }
    else {
      var role = list.options[list.selectedIndex].innerHTML;
      var response = NFN.BasePage.GetPermissionInfo(role, mainProp.id);

      this.permsettings.innerHTML = "";
      var ap = $CA("P", this.permsettings, { className:"ajaxHeadline", innerHTML:this.translate("Behörigheter") } );

      var atable = $CA("TABLE", this.permsettings, { cellSpacing:"0", cellPadding:"0" });
      var atbody = $CA("TBODY", atable);
      for (var i=0; i < response.value.length; i++) {
        var help = response.value[i].split('|');
        var atr = $CA("TR", atbody);
        var atd = $CA("TD", atr, { innerHTML:help[0] });
        atd = $CA("TD", atr);
        $CA("INPUT", atd, { type:"checkbox", checked:(help[2] == "y"), onclick:function(e){thisref.permClicked(e, role, help[1], this.checked);} });
      }
    }
  },

  this.permClicked = function(e, role, actiontype, permission) {
    this.stopPropagation(e);
    NFN.BasePage.SetRichTextPermission(mainProp.id, role, actiontype, permission);
  }

  this.init();

  ajaxtiny.push(this);
}


function showEditControls() {
  var divs = document.getElementsByTagName("DIV");
  for (var i=0; i < divs.length; i++) {
    if (divs[i].className == "ajaxToolbarStatic")
      divs[i].style.display = "block";
  }
}


function writeFlash(id, p) {
  if (!p) return;
  if (!p.wmode) p.wmode = "transparent";
  writeEmbed(id,
    'D27CDB6E-AE6D-11cf-96B8-444553540000',
    'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
    'application/x-shockwave-flash',
    p
  );
}

function writeShockWave(id, p) {
  writeEmbed(id,
  '166B1BCA-3F9C-11CF-8075-444553540000',
  'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
  'application/x-director',
    p
  );
}

function writeQuickTime(id, p) {
  writeEmbed(id,
    '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
    'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
    'video/quicktime',
    p
  );
}

function writeRealMedia(id, p) {
  writeEmbed(id,
    'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
    'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
    'audio/x-pn-realaudio-plugin',
    p
  );
}

function writeWindowsMedia(id, p) {
  p.url = p.src;
  writeEmbed(id,
    '6BF52A52-394A-11D3-B153-00C04F79FAA6',
    'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
    'application/x-mplayer2',
    p
  );
}

function writeEmbed(id, cls, cb, mt, p) {
  var h = '', n;

if (!p) return;
  h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';
  h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';
  h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';
  h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';
  h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';
  h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';
  h += '>';

  for (n in p)
    h += '<param name="' + n + '" value="' + p[n] + '">';

  h += '<embed type="' + mt + '"';

  for (n in p)
    h += n + '="' + p[n] + '" ';

  h += '></embed></object>';

  if ($(id)) $(id).innerHTML = h;
}
