/* This file should always be included *first* in a web page,
   so we can use the same arrays (imgOff, imgOn, etc) elsewhere */


/***********************
 Function definitions...
 ***********************/

function pass(){
 // do nothing
}

function preload(imgs, rollover_ext) {
  n = 0 ;
  img = '' ;
  if ( document.images ) {
    for ( n = 0; n < imgs.length; n++ ) {
	    img = imgs[n] ;
      imgoffsrc = js_staticdir + img + ".gif";
	    imgonsrc = js_staticdir + img + rollover_ext + ".gif";
      imgOff[img] = new Image();
      imgOff[img].src = imgoffsrc;
      imgOn[img] = new Image();
      imgOn[img].src = imgonsrc;
      imgToggledOn[img] = false;
    }
  }
}

function tabOff(tab) {
  // we simply don't bother with netscape...
  if ( document.all ) {
    document.all[tab].background = js_staticdir + "dark_tab.gif";
  }
}

function tabOn(tab) {
  // we simply don't bother with netscape...
  if ( document.all ) {
    document.all[tab].background = js_staticdir + "light_tab.gif";
  }
}

function rollOn(img) {
  img_name = img;
  if (document.images && loaded && !imgToggledOn[img_name] && imgOn[img_name] ) {
    document.images[img].src = imgOn[img_name].src;
  }
}

function rollOff(img) {
  img_name = img
  if (document.images && loaded && !imgToggledOn[img_name] && imgOff[img_name] ) {
    document.images[img].src = imgOff[img_name].src;
  }
}

// needless repetition for backwards compatibility
function rollOnName(img, img_name) {
  if(imgOn[img_name]) 
    img.src = imgOn[img_name].src;
}

function rollOffName(img, img_name) {
  if(imgOff[img_name]) 
    img.src = imgOff[img_name].src;
}

function toggle(img) {
  if (document.images) {
    if (imgToggledOn[img]) {
      document.images[img].src = imgOff[img].src;
    } 
    else {
      document.images[img].src = imgOn[img].src;
    }
  }
  return true;
}

function wf_interface_init() {
//  preload(imgs, "_pink");
  preload(edit_imgs, "_on");
  loaded = true;
}

function modeSwitch() {
  // Used for switching between preview/edit modes;
  // css hides/adjusts components based on class name.
  // 1. editFrame - element should have red border.
  // 2. normalFrame - element has css based on main-stylesheet settings
  // 3. editMode - page level class to adjust css.
  // 4. normalMode - page level class to adjust css.
  // 5. cssShow - allows the element to be viewed in edit screen.
  // 6. cssHide - sets display:none so element is not visible (previewing).
  // NOTE: show-toolbar-button-holder cssHide/cssShow works in reverse of above.

  var button = document.getElementById("toolbar-button-preview");
  var page = document.getElementById("page");
  var showToolbarButtonHolder = document.getElementById("show-toolbar-button-holder");
  var divCollection = document.getElementsByTagName("div");
  var state = getCookie("preview_mode"); 

  if(state == "edit") {
    button.title = "Switch to edit mode"
    button.alt = "edit";
    page.className = "normalMode";
    showToolbarButtonHolder.className = "buttonShow";
    for(var i in divCollection) {
      currentClassName = divCollection[i].className;
      if(currentClassName) {
        divCollection[i].className = currentClassName.replace(/editFrame/, "normalFrame");
        currentClassName = divCollection[i].className;        
        divCollection[i].className = currentClassName.replace(/cssShow/, "cssHide");
      }
    }
    setCookie("preview_mode", "view", "", "/");
  }
  else {
    button.title = "Switch to preview mode"
    button.alt = "preview";
    page.className = "editMode";
    showToolbarButtonHolder.className = "buttonHide";
    for(var i in divCollection) {
      currentClassName = divCollection[i].className;
      if(currentClassName) {
        divCollection[i].className = currentClassName.replace(/normalFrame/i, "editFrame");
        currentClassName = divCollection[i].className;
        divCollection[i].className = currentClassName.replace(/cssHide/i, "cssShow");
      }
    }
    setCookie("preview_mode", "edit", "", "/");
  }

  resetSectionHeights(getSections());
  setLayout();
}

/*************************************
 Functions related to Document editing 
 *************************************/
function DocumentContentChecker () {
  // note: pass in the required document because tinyMCE
  // actually features in it's own (within iframe).
  this.action = action;
  var whitespaceOnly = /^\s+$/;
  var doc = null;
  var editorContent = null;
  var editorChildren = null;

  // Surrounds normal unformatted text and inline elements, in a paragraph element.
  function paragraphFormat() {
    var inlineElements = ["a", "b", "em", "i", "span", "strong", "u"];
    for(var i in editorChildren) {
      currentNode = editorChildren[i];
      if(currentNode.nodeType == 3){
        if(!(whitespaceOnly.test(currentNode.nodeValue))) {
          editorContent.replaceChild(encasedNode("p", currentNode), currentNode);
        }
      }
      if(currentNode.nodeType == 1) {
        for(var i in inlineElements) {
          if(currentNode.nodeName.toLowerCase() == inlineElements[i]) {
            if(currentNode.nodeName.toLowerCase() == "a" && currentNode.innerHTML == "") {
              // Test data contained in-page anchor, so this will skip.
              continue;
            }
            editorContent.replaceChild(encasedNode("p", currentNode), currentNode);
            break;
          }
        }
      }
    }
  }

  function encasedNode(el, node) {
    newParagraph = doc.createElement(el);
    newParagraph.appendChild(node.cloneNode(true));
    return newParagraph;
  }

  function removeEmptyParagraphs() {
    // Note: IE makes it really difficult when the &nbsp; character
    // is the content. To get round this, strip the character first.
    var items = new Array();
    var textContent = null;
    var re = new RegExp("&nbsp;","gi");
    for(var i in editorChildren) {
      currentNode = editorChildren[i];
      if(typeof(currentNode) == "object" && currentNode.nodeName.toLowerCase() == "p") {
        textContent = (currentNode.textContent || currentNode.innerHTML.replace(re,""));
        if(whitespaceOnly.test(textContent) || textContent == "") {
          items.push(i);
        }
      }
    }
    // Need to delete items from editorChildren working from back
    // to front so that the order of elements does not change.
    for(var i=(items.length - 1); i >=0 ; i--) {
      editorContent.removeChild(editorChildren[items[i]]);
    }
  }

  function trimLineBreaks() {
    // using innerHTML because it's easier...
    var inner = "";
    var len = 0;
    for(var i in editorChildren) {
      currentNode = editorChildren[i];
      if(typeof(currentNode) == "object" && currentNode.nodeName.toLowerCase() == "p") {
        inner = currentNode.innerHTML;
        inner = inner.replace("<br>", "<br />");
        end = 0;
        var i = 0;
        do {
          len = inner.length;
          if(inner.substr(len - 1, 1) == " " || inner.substr(len - 1, 1) == "\n") {
            inner = inner.substr(0, len - 1);
          }
          else {
            if(inner.substr(len - 6, 6).toLowerCase() == "<br />") {
              inner = inner.substr(0, len - 6);
            }
            else {
              if(inner.substr(0, 1) == " " || inner.substr(0, 1) == "\n") {
                inner = inner.substr(1);
              }
              else {
                if(inner.substr(0, 6).toLowerCase() == "<br />") {
                  inner = inner.substr(6);
                }
                else {
                  end = 1;
                }
              }
            }
          }
        }while(!end)
        currentNode.innerHTML = inner;
      }
    }
  }

  function beautifyCodeLayout() {
    re = /<\/p>/gi;
    var inner = editorContent.innerHTML.replace(re, "</p>\n");
    re = /<br[ ]*[\/]*>/gi;
    inner = inner.replace(re, "<br />\n");
    editorContent.innerHTML = inner;
  }

  function action(el) {
    // Function used for adjusting contents of user edited documents.
    editorContent = el;
    editorChildren = editorContent.childNodes;
    doc = editorContent.ownerDocument;

    if(editorContent) {
      //var html_was = editorContent.innerHTML;
      paragraphFormat();
      removeEmptyParagraphs();
      trimLineBreaks();
      beautifyCodeLayout();
      //var html_now = editorContent.innerHTML;
      //alert("was:\n" +html_was + 
      //      "\n----------------------------------\n" +
      //      "now:\n" + html_now);
    }
    else {
      alert("Error: Document editor not captured for content checking.");
    }
  }
}


/************************
 Variable declarations...
 ************************/
var js_staticdir = "/images/";
var loaded = false;
var imgOff = new Array();
var imgOn = new Array();
var imgNull = new Array();
var imgToggledOn = new Array();
var imgs = new Array('coievent_element_add', 'event_element_add','form_add','add_image','news_add','add_page','copy_page','cut_page','delete_page','page_down','page_properties','page_up','paste_page','preview_page','workflow_publish','workflow_reject','workflow_retract','workflow_submit','page_type','workflow_resubmit','add_text','add_file', 'add_link', 'add_right_content', 'remove_right_content', 'add_feature');
var edit_imgs = new Array('edit_icon','move_up','move_down','move_left','move_no_align','move_right','size_smaller','size_larger','delete_component');
var loaded;

/*****************
 Running script...
******************/
wf_interface_init();
