
  // -----------------------------------------------------------------------------------
  //  WIKITOOLBAR
  // -----------------------------------------------------------------------------------


  if (!window.WikiToolbar) {
    var WikiToolbar = new Object();
  }
  
  Object.extend(WikiToolbar,{
    
    // ----------------------------------------------------
    //  WIKI FUNCTION
    // ----------------------------------------------------
    
    runLineBreak: function(event){
      JcmsLogger.debug('WikiToolbar','runLineBreak');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceSelection(context.input,"#\n",true);
    },
    runPublink: function(event){
      JcmsLogger.debug('WikiToolbar','runPublink');
      var context   = WikiToolbar.getContext(event);
      this.currentSelection = InputUtil.getSelection(context.input,true);
      Popup.popupWindow(context.ctxPath+"/work/pubChooser.jsp?jsFunc=WikiToolbar.insertPubLinkCallback",'pubChooser',900,500,false,true,true,false);
    },
    runPubUrl: function(event){
      JcmsLogger.debug('WikiToolbar','runPubUrl');
      var context   = WikiToolbar.getContext(event);
      this.currentSelection = InputUtil.getSelection(context.input,true);
      var txt = this.currentSelection.value ? encodeURIComponent(this.currentSelection.value) : "";
      Popup.popupWindow(context.ctxPath+"/work/wikiLink.jsp?txt="+txt+"&jsFunc=WikiToolbar.insertWikiLinkCallback",'pubChooser',360,70,false,true,false,false);
    },
    runInsertImage: function(event){
      JcmsLogger.debug('WikiToolbar','runInsertImage');
      var context   = WikiToolbar.getContext(event);
      this.currentSelection = InputUtil.getSelection(context.input,true);
      Popup.popupWindow(context.ctxPath+"/work/mediaBrowser.jsp?media=images&jsFunc=WikiToolbar.insertImageUrlCallback",'mediaBrowser',930,570,false,true,false,false);
    },
    runBold: function(event){
      JcmsLogger.debug('WikiToolbar','runBold');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^\*(.+)\*$/gm,"$1","*$1*",true);
    },
    runItalic: function(event){
      JcmsLogger.debug('WikiToolbar','runItalic');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^_(.+)_$/gm,"$1","_$1_",true);
    },
    runBoldItalic: function(event){
      JcmsLogger.debug('WikiToolbar','runBoldItalic');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^__(.+)__$/gm,"$1","__$1__",true);
    },
    runFixed: function(event){
      JcmsLogger.debug('WikiToolbar','runFixed');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^=(.+)=$/gm,"$1","=$1=",true);
    },
    runBoldFixed: function(event){
      JcmsLogger.debug('WikiToolbar','runBoldFixed');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^==(.+)==$/gm,"$1","==$1==",true);
    },
    runOrderedList: function(event){
      JcmsLogger.debug('WikiToolbar','runOrderedList');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^(.+)$/gm,"   1 $1","   1 $1",false);
    },
    runUnorderedList: function(event){
      JcmsLogger.debug('WikiToolbar','runUnorderedList');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^(.+)$/gm,"   * $1","   * $1",false);
    },
    runOutdent: function(event){
      JcmsLogger.debug('WikiToolbar','runOutdent');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^[\n\r\t]*[ ]{3}([\d\*][ ])*(.+)$/gm,"$2","$1",false);
    },
    runIndent: function(event){
      JcmsLogger.debug('WikiToolbar','runIndent');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^(.+)$/gm,"   $1","   $1",false);
    },
    runHorizontalRule: function(event){
      JcmsLogger.debug('WikiToolbar','runHorizontalRule');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^\s*-{30}(.*)\n*$/g,"$1","\n------------------------------\n$1",false, true);
    },
    runHeading1: function(event){
      JcmsLogger.debug('WikiToolbar','runHeading1');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^\s*---\+\+\s(.+)$/gm,"$1","---++ $1",false);
    },
    runHeading2: function(event){
      JcmsLogger.debug('WikiToolbar','runHeading2');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^\s*---\+\+\+\s(.+)$/gm,"$1","---+++ $1",false);
    },
    runHeading3: function(event){
      JcmsLogger.debug('WikiToolbar','runHeading3');
      var context = WikiToolbar.getContext(event);
      InputUtil.replaceRegexp(context.input,/^\s*---\+\+\+\+\s(.+)$/gm,"$1","---++++ $1",false);
    },
    runSearch: function(event){
      JcmsLogger.debug('WikiToolbar','runSearch');
      // TODO: Rewrite wikiSearchReplace.jsp
      var context = WikiToolbar.getContext(event);
      var targetInput = "document."+context.formName+".elements["+context.getInputPos()+"]";
      if (isIE) {
        window.showModelessDialog(context.ctxPath+"/work/wikiSearchReplace.jsp", context.input, 'help:no;status:no;scroll:no;dialogWidth:300px;dialogHeight:250px;');
      } else { 
        Popup.popupWindow(context.ctxPath+"/work/wikiSearchReplace.jsp?targetInput="+targetInput,'Search',310,200,false,true,false,false);
      }
    },
    runSpell: function(event){
      JcmsLogger.debug('WikiToolbar','runSpell');
      // TODO: Rewrite wikiSpellChecker.jsp
      var context = WikiToolbar.getContext(event);
      var targetInput = "document."+context.formName+".elements["+context.getInputPos()+"]";
      if (isIE) {
        window.showModelessDialog(context.ctxPath+"/work/wikiSpellChecker.jsp?lang="+context.input.lang, context.input, 'help:no;status:no;scroll:no;dialogWidth:400px;dialogHeight:300px;');
      } else { 
        Popup.popupWindow(context.ctxPath+"/work/wikiSpellChecker.jsp?targetInput="+targetInput+"&lang="+context.input.lang,'SpellChecker',400,250,false,true,false,false);
      }
    },
    runPreview: function(event){
      JcmsLogger.debug('WikiToolbar','runPreview');
      // TODO: Should be upgrade in JCMS 5.7 remove the .value !!!
      var context = WikiToolbar.getContext(event);
      var targetInput = "document."+context.formName+".elements["+context.getInputPos()+"].value";
      Popup.popupWindow(context.ctxPath+"/work/wikiPopup.jsp?targetInput="+targetInput,'Preview',600,500,false,true,true,false);
    },
    runHelp: function(event){
      JcmsLogger.debug('WikiToolbar','runHelp');
      var context = WikiToolbar.getContext(event);
      Popup.popupWindow(context.ctxPath+"/work/howToTFR.jsp",'JaliosTFR',700,500,false,true,true,false);
    },
    
    // Function called by ImageMap Toolbar
    runPubLinkURL: function(event){
      JcmsLogger.debug('WikiToolbar','runPubLinkURL');
      var context   = WikiToolbar.getContext(event);
      this.currentSelection = InputUtil.getSelection(context.input,true);
      Popup.popupWindow(context.ctxPath+"/work/pubChooser.jsp?jsFunc=WikiToolbar.insertPubURLCallback",'pubChooser',900,500,false,true,false,false);
    },
    runLinkURL: function(event){
      JcmsLogger.debug('WikiToolbar','runLinkURL');
      var context   = WikiToolbar.getContext(event);
      this.currentSelection = InputUtil.getSelection(context.input,true);
      Popup.popupWindow(context.ctxPath+"/work/wikiLink.jsp?showText=false&jsFunc=WikiToolbar.insertWikiURLCallback",'pubChooser',360,70,false,true,false,false);      
    },
    runImageURL: function(event){
      JcmsLogger.debug('WikiToolbar','runImageURL');
      WikiToolbar.runInsertImage(event);
    },
    // TODO: Should be upgrade in JCMS 5.7
    runImageMap: function(event){
      JcmsLogger.debug('WikiToolbar','runImageMap');
      var context   = WikiToolbar.getContext(event);
      
      var imgName   = context.input.name.substring(0, context.input.name.length-3);
      var imgPos    = getFormElementPos(context.form,imgName) + context.getInputRel();
      var imgurl    = context.form.elements[imgPos].value; 
      
      var popupurl  = context.ctxPath+"/work/previewImageMap.jsp?formName="+context.formName+"&url="+imgurl+"&mapPos="+context.getInputPos();
      Popup.popupWindow(popupurl,'ImageMap',640,480,false,true,true,false);
    },
    
    // ----------------------------------------------------
    //  CALLBACK FUNCTION
    // ----------------------------------------------------
    
    insertPubLinkCallback: function(id,lbl){
      JcmsLogger.debug('WikiToolbar','insertPubLinkCallback');
      var selection = WikiToolbar.currentSelection;
      if ((!selection) || (!id)){
        return;
      }
      InputUtil.replaceRegexp(selection.input,/^(.+)$/g,"[["+id+"][$1]]","[["+id+"]["+lbl+"]]",true, true, selection);
    },
    
    // TODO: Fix in JCMS 5.7 for Intuitive URL
    insertPubURLCallback: function(id,lbl){
      JcmsLogger.debug('WikiToolbar','insertPubURLCallback');
      var selection = WikiToolbar.currentSelection;
      if ((!selection) || (!id)){
        return;
      }
      InputUtil.replaceRegexp(selection.input,/^(.+)$/g,"display.jsp?id="+id,"display.jsp?id="+id,true, true, selection);
    },
    
    insertWikiLinkCallback: function(url,txt){
      JcmsLogger.debug('WikiToolbar','insertWikiLinkCallback');
      var selection = WikiToolbar.currentSelection;
      if ((!selection) || (!url)){
        return;
      }
      InputUtil.replaceRegexp(selection.input,/^(.+)$/g,"[["+url+"]["+txt+"]]","[["+url+"]["+txt+"]]",true, true, selection);
    },
    
    // TODO: Fix in JCMS 5.7 for Intuitive URL
    insertWikiURLCallback: function(url,txt){
      JcmsLogger.debug('WikiToolbar','insertWikiURLCallback');
      var selection = WikiToolbar.currentSelection;
      if ((!selection) || (!url)){
        return;
      }
      InputUtil.replaceRegexp(selection.input,/^(.+)$/g,url,url,true, true, selection);
    },
    
    // TODO: FIX in JCMS 5.7 the function signature
    insertImageUrlCallback: function(id, title, mediatype, imageUrl, targetInput, targetLabel){
      JcmsLogger.debug('WikiToolbar','insertImageUrlCallback');
      var selection = WikiToolbar.currentSelection;
      if ((!selection) || (!imageUrl)){
        return;
      }
      InputUtil.replaceRegexp(selection.input,/^(.+)$/g,"$1 "+imageUrl+" ",imageUrl,true, true, selection);
    },
    
    
    // ----------------------------------------------------
    //  CONVENIENT FUNCTION
    // ----------------------------------------------------
   
   /**
    * Build a context object from the given event
    * - x:            Event click x coordinate
    * - y:            Event click y coordinate
    * - ctxPath:      Page context path
    * - input:        The working input
    * - form:         The working form
    * - getInputPos() Function checking the position of the input in the form.
    * - getInputRel() Function checking the relative position of the input.
    * 
    * @param event the raised event
    */
    getContext: function(event){
      var context = new Object();
      context.x = Event.pointerX(event);
      context.y = Event.pointerY(event);
      context.ctxPath = JcmsJsContext.getContextPath();
      
      // Retrieve text area from the clicked item (the area of the map)
      // <div>  ... <textarea></textarea> ... <map><area><area></map> ... </div>
      try {
        var clickedArea = Event.element(event);
        context.input    = clickedArea.parentNode.parentNode.getElementsByTagName("textarea")[0];
        context.form     = context.input.form;
        context.formName = context.form.attributes['name'].value;
      } catch(ex) { }
      
      if (!context.input) {
        alert(I18N.glp("error.unknown"));
      }
      
      // Bind a function to context to discover the input pos in form elements
      context.getInputPos = function() {
        
        if (this._inputPos || !this.form || !this.input)
          return this._inputPos;
        
        this._inputRel = -1;
        $A(this.form.elements).each(function(elm, idx){
          if (elm.name == this.input.name){
            this._inputRel += 1;
          }
          if (elm == this.input){
            this._inputPos = idx;
            throw $break;
          }
        }.bind(this));
        
        return this._inputPos;
      }.bind(context);
      
      context.getInputRel = function() {
        this.getInputPos();
        return this._inputRel;
      }
      
      return context;
    }
  });
