/******************************************************************************/
/* Copyright In Stereo Oy / antti@instereo.fi                                 */
/******************************************************************************/


/**
 * Namespace for common javascript functions.
 * Put all new functions under this namespace.
 */
CommonTools = {

  /**
   * Check if any of form's checkbox-fields is checked
   */
  hasSelectedCheckbox: function(form) {

    isChecked = false;

    if ( form!=null ) {
      var checkboxes = form.getInputs('checkbox');
      checkboxes.each( function(checkbox) {
        if ( checkbox.checked ) { isChecked = true; throw $break; }
      });
    }
    return isChecked;

  },

  /**
   * Get more content with Ajax request for scrolling element when scrollbar hits the bottom.
   *
   * @param force            Get content even if the scrollbar is not at the bottom (useful at first load)
   * @param scrollElement    Element that holds the scrollbar (for example scrolling div)
   * @param contentElement   Element where fethced content is put ( insertation: bottom )
   * @param loaderImage      Element that holds loading image
   * @param ajaxUrl          Url for Ajax-request
   * @param ajaxParams       Parameters for Ajax-request
   * @param pageIndex        paging parameter
   */

  // This global variable is used for making requests synchronous.
  // Setting Ajax option asynchronous: false should also have done the trick,
  // but then I didn't get the loaderImage to work as I wanted. Feel free to make it better.
  scrollLocked: false,

  getMoreContent: function(force, scrollElement, contentElement, loaderImage, ajaxUrl, ajaxParams, pageIndex) {

    var scroller = $(scrollElement);
    var content = $(contentElement);
    var loadImage = $(loaderImage);
    var nextPage = pageIndex;
    var nearBottom = Math.abs(scroller.scrollHeight-(scroller.scrollTop + scroller.getHeight())) < 5;

    if ( scrollElement==null || contentElement==null || loadImage==null || ajaxUrl==null || ajaxUrl.strip().empty() )
     nextPage = -1;


    if ( (this.scrollLocked==false && nextPage!=-1 && nearBottom)  || force ) {

       this.scrollLocked = true;
       nextPage = pageIndex + 1;
       loadImage.style.display="";

       var params = "";
       if ( ajaxParams!=null && ajaxParams.strip().empty()==false )
        params = ajaxParams.strip() + "&";
       params += "pageIndex=" + pageIndex;

       new Ajax.Updater( {
         success: content},
         ajaxUrl,
         {
           parameters: params,

           onSuccess: function(transport) {
             var responseText = transport.responseText;
             if ( responseText==null || responseText.strip().empty()==true )
               loadImage.remove(); // This implicates that there is no more content
             if ( force )
               loadImage.style.display = "none";
             CommonTools.scrollLocked = false;
           },

           insertion: Insertion.Bottom
         }
       );
    }
    return nextPage;
  },

  /**
   * Block for number of milliseconds.
   */
  pause: function (millis) {
    var date = new Date();
    var curDate = null;
    do { curDate = new Date(); } while(curDate-date < millis);
  },

  /**
   * Convert html into plain text
   */
  convertHTMLToPlainText: function(html, htmlBlockReplace) {

    var mgckStrng ="__M_g__Ck_S1t_rNg_"; //we never want to escape blockreplace
    var plainText = "";

    if ( html==null || html.strip().blank() )  return plainText;
    if (  htmlBlockReplace==null ) return html;

    plainText = html.strip();
    plainText = plainText.replace(new RegExp("&amp;","gi"), "&");

    // Only body is taken into plaintext
    var startBody = plainText.toLowerCase().indexOf("<body");
    if ( startBody!=-1 )
      plainText = plainText.substring(startBody);

    // Convert links
    plainText = CommonTools.convertHTMLLinksToPlainText(plainText);

    // Strip some block level tags and replace them with htmlBlockReplace-parameter
    if ( htmlBlockReplace!=null ) {
      plainText = plainText.replace(new RegExp("</div>","gi"), mgckStrng)
                           .replace(new RegExp("</h[1-6]{1}>","gi"), mgckStrng)
                           .replace(new RegExp("</p>","gi"), mgckStrng)
                           .replace(new RegExp("</blockquote>","gi"), mgckStrng)
                           .replace(new RegExp("</li>","gi"), mgckStrng)
                           .replace(new RegExp("</td>","gi"), mgckStrng)
                           .replace(new RegExp("</table>","gi"), mgckStrng)
                           .replace(new RegExp("<br>","gi"), mgckStrng)
                           .replace(new RegExp("<br/>","gi"), mgckStrng)
                           .replace(new RegExp("</br >","gi"), mgckStrng);
    }

    // Stript scripts and tags
    plainText = plainText.stripScripts().stripTags();

    // Unescape html entities
    plainText = this.unescapeHTML(plainText);

    // Stript scripts and tags again
    plainText = plainText.stripScripts().stripTags();

    // replace magicgstring with blockreplace
    plainText = plainText.replace(new RegExp(mgckStrng,"g"), htmlBlockReplace)

    // Trim all lines
    var lines = plainText.split('\n');
    plainText = "";
    for (var i=0; lines!=null && i<lines.length; i++ ) {
      var str = lines[i].strip();
      if ( str.blank()==false )
        plainText += str + "\n\n";
    }

    return plainText;
  },

  convertHTMLLinksToPlainText: function(html) {
    if ( html==null || html.strip().blank() ) return "";

    var linkStart = 0;
    while ( (linkStart = html.toLowerCase().indexOf("<a", linkStart)) != -1 ) {
      var linkEnd = html.toLowerCase().indexOf("</a>", linkStart) + 4;

      if ( linkEnd==-1 || linkEnd>html.length || linkEnd<=linkStart )
        break;

      var tag = html.substring(linkStart, linkEnd);
      var href = tag.replace(new RegExp(".*?href", ""), "" );
      var hrefStart = href.indexOf("\"") + 1;
      href = href.substring(hrefStart);
      href = href.replace(new RegExp(".*?mailto:", ""), "")
      var hrefEnd = href.indexOf("\"");
      href = href.substring(0, hrefEnd).strip();
      var linkText = tag.stripTags().strip();
      var replacement = linkText;
      if ( linkText!=href )
        replacement += " (" + href + ")";

      html = html.replace(tag, replacement);
    }

    return html;
  },

  convertLinesToHTMLParagraphs: function(text) {
    if ( text==null || text.strip().blank() )  return "";

    lines = text.split("\n");
    text = "";
    for(var i=0; i<lines.length; i++)
      text += "<p>" + lines[i] + "</p>";
    return text;
  },

  unescapeHTML: function(html) {
    var unescapedHTML = "";
    if ( html==null ) return unescapedHTML;

    var htmlNode = document.createElement("div");
    htmlNode.innerHTML = html;
    if(htmlNode.innerText)
      unescapedHTML = htmlNode.innerText; // IE
    else
      unescapedHTML = htmlNode.textContent; // FF

    if ( unescapedHTML==null ) unescapedHTML = "";
    return unescapedHTML;

  },

  unescapeHTMLPro: function(html) {
    if ( html==null ) return "";

    var div = new Element('div');
    div.innerHTML = html.stripTags();
    return div.childNodes[0] ? (div.childNodes.length > 1 ?
      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
      div.childNodes[0].nodeValue) : '';
  },

  clearForm: function(form) {
  var elements = form.elements;

    form.reset();

    for(var i=0; i<elements.length; i++) {

      if (elements[i].type != undefined) {
         field_type = elements[i].type.toLowerCase();

     switch(field_type) {
      case "text":
      case "password":
      case "textarea":

          elements[i].value = "";
        break;

      case "radio":
      case "checkbox":
          if (elements[i].checked) {
             elements[i].checked = false;
        }
        break;

      case "select-one":
      case "select-multi":
              elements[i].selectedIndex = "";
        break;

      default:
        break;
    }
      }
    }
  }

}


/**
 * Confirm a delete action
 */
function confirmDelete(msg, url) {
  if (confirm("Haluatko varmasti poistaa " + msg))
    window.location = url;
}
function go(url) { window.location = url; }
function redir(url) { window.location = url; }
function getObj(oid) { return document.getElementById(oid); }
function confirmedGo(msg, url) { if (confirm(msg)) window.location = url;}

function confirmedSubmit(msg, form) {
  if (confirm(msg))
    return true;
  return false;
}

function confirmedGoDisable(msg, url, objToDisable) {
  if (confirm(msg)) {
    objToDisable.disabled=true;
    window.location = url;
  }
}

function confirmedGo_disableBtn_showWaitDialog(msg, url, objToDisable) {
  if (confirm(msg)) {
    objToDisable.disabled=true;
    getObj("waitDialog").style.visibility = "visible";
    window.location = url;
  }
}

function confirmedPopUp(msg, url, width, height) {
  if (confirm(msg))
    popUp(url, width, height);
}

var submited = false;
function submitBtn() {
  if (submited == false) {
    submited = true;
    return true;
  }
  return false;
}

function URLDecode(s) {
  var lsRegExp = /\+/g;
  return unescape(String(s).replace(lsRegExp, " "));
}

function popUp(url, width, height) {
  return popUpName("popup", url, width, height);
}
function popUpName(name, url, width, height) {
  var win = window.open(url, name,"toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width=" + width + ", height=" + height);
  win.focus();
  return false;
}

var infoOn = false;

function info(msg, aEvent) {
  var eve = aEvent ? aEvent : window.event;

  if (infoOn == true) {
    infoOn = false;
    document.getElementById("info").style.visibility = 'hidden';
    document.getElementById("page").style.cursor = 'default';
  }
  else {
    infoOn = true;
    // Scroll offsets
    var xOffset = 0;
    var yOffset = 0;
    if (window.pageYOffset != null) yOffset = window.pageYOffset;
    else if (document.body.scrollWidth != null) yOffset = document.body.scrollTop;
    if (window.pageXOffset != null) xOffset = window.pageXOffset;
    else if (document.body.scrollHeight != null) xOffset = document.body.scrollLeft;

    var d = document.getElementById("info");
    d.style.left = xOffset + 30 + eve.clientX + "px";
    d.style.top = yOffset - 10 + eve.clientY + "px";
    d.style.visibility = "visible";
    document.getElementById('page').style.cursor = 'help';
    d.innerHTML = msg;
    d.focus;
  }
}

function showCursor(cur) {
  document.getElementById('page').style.cursor = cur;
}
function cancelCursor() {
  document.getElementById('page').style.cursor = 'default';
}

/**
* Show Hand cursor on onclick div etc
*/
function linkCursor(turnon) {
  linkCursor(turnon, "page");
}
function linkCursor(turnon, rootDiv) {
  if (document.getElementById && document.getElementById(rootDiv)) {
    if (turnon == true) {
      document.getElementById(rootDiv).style.cursor = 'pointer';
      document.getElementById(rootDiv).style.cursor = 'hand';
    }
    else {
      document.getElementById(rootDiv).style.cursor = 'default';
    }
  }
}


/**
* Hide the toggable fields onload
*/
function hideToggableFields(nameArray) {
  if (img_closed == null) alert("Define mandatory variables!");

  // Hide the areas by id
  if (document.getElementById) {
    var i;
    for (i=0; i<nameArray.length; i++) {
      if (document.getElementById(nameArray[i])) {
        document.getElementById(nameArray[i]).style.display = 'none';
        if (document.getElementById(nameArray[i] + "_img"))
          document.getElementById(nameArray[i] + "_img").src = img_closed;
      }
    }
  }
}
/**
* Show or hide element by id
* var img_closed and var img_open must be defined
*/
var img_closed = "";
var img_open = "";
function toggleHiddenField(name) {

  if (document.getElementById && document.getElementById(name)) {
    if (document.getElementById(name).style.display == 'none') {
      document.getElementById(name).style.display = "block";
      if (document.getElementById(name + "_img"))
        document.getElementById(name + "_img").src = img_open;
     // go('#' + name); @onko ok poistaa / Antti?
    }
    else{
      document.getElementById(name).style.display = 'none';
      if (document.getElementById(name + "_img"))
        document.getElementById(name + "_img").src = img_closed;
    }
  }
}

/**
* Toggle show/view property of elements
*/
function  toggleElements() {
  for (var i = 0; i < arguments.length; i++) {
    //alert(arguments[i]);
    Element.toggle($(arguments[i]));
  }
}

/**
* Show hidden field even if it is already visible
*/
function showHiddenField(name) {
  if (document.getElementById && document.getElementById(name)) {
    if (document.getElementById(name).style.display == 'none') {
      document.getElementById(name).style.display = 'block';
      if (document.getElementById(name + "_img"))
        document.getElementById(name + "_img").src = img_open;
    }
  }
}
/**
* Hide hidden field even if it is already hidden
*/
function hideHiddenField(name) {
  if (document.getElementById && document.getElementById(name)) {
    document.getElementById(name).style.display = 'none';
    if (document.getElementById(name + "_img"))
      document.getElementById(name + "_img").src = img_closed;
  }
}


/**
* Hover input fieldeille, muuttaa onfocusina classiksi input_active:n
*/
function initInputHover() {
  // Focus
  if (document.getElementsByTagName) {
    var inputs = document.getElementsByTagName("input");
    if (!inputs) return;
    for (var i = 0; i<inputs.length; i++) {
      if ((inputs[i].type == 'text' || inputs[i].type == 'password') && inputs[i].className == '') {
        inputs[i].onfocus = function(){this.className='input_active';return false};
        inputs[i].onblur = function(){this.className='';return false};
      }
    }
    var areas = document.getElementsByTagName("textarea");
    if (!areas) return;
    for (var i = 0; i<areas.length; i++) {
      if (areas[i].className == '') {
        areas[i].onfocus = function(){this.className='input_active';return false};
        areas[i].onblur = function(){this.className='';return false};
      }
    }
  }
}


/**
* Find elements position
*/
function findPosX(obj) {
  var curleft = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curleft += obj.offsetLeft
      obj = obj.offsetParent;
    }
  }
  else if (obj.x) curleft += obj.x;
  return curleft;
}

function findPosY(obj) {
  var curtop = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curtop += obj.offsetTop
      obj = obj.offsetParent;
    }
  }
  else if (obj.y) curtop += obj.y;
  return curtop;
}


function enableOrDisable(enable, id) {
  if (enable) {
    document.getElementById(id).className = "";
     document.getElementById(id).disabled = false;
  }
  else {
    document.getElementById(id).className = "disabled";
     document.getElementById(id).disabled = true;
  }
}

function addItem(formId, srcObjName, destObjName, hiddenDestObjName) {
  var srcObj = eval("document."+formId+"."+srcObjName);
  var destObj = eval("document."+formId+"."+destObjName);
  var hiddenDestObj = eval("document."+formId+"."+hiddenDestObjName);
  var counter = destObj.options.length;
  for (i = 0; i < srcObj.options.length; i++) {
    if (srcObj.options[i].selected && srcObj.options[i].value != "0") {
      var add = true;

      for (j = 0; j < destObj.options.length; j++) {
        if (srcObj.options[i].value == destObj.options[j].value) {
          add = false;
          break;
        }
      }
      if (add) {
        destObj.options[counter] = new Option(srcObj.options[i].text, srcObj.options[i].value);
        counter++;
      }
     }
  }

  var hidden = "";
  for (i = 0; i < destObj.options.length; i++) {
    if (i > 0) {
      hidden += ";";
    }

    hidden += destObj.options[i].value;
  }

  hiddenDestObj.value = hidden;
}

function deleteItem(formId, srcObjName, hiddenSrcObjName) {
  var srcObj = eval("document."+formId+"."+srcObjName);
  var hiddenSrcObj = eval("document."+formId+"."+hiddenSrcObjName);
  var hiddenValues = hiddenSrcObj.value.split(";");

  for (i = srcObj.options.length - 1; i > -1; i--) {
    if (srcObj.options[i].selected) {
      srcObj.remove(i);
      hiddenValues.pop(i);
    }
  }

  var hidden;
  for (i = 0; i < hiddenValues.length; i++) {
    if (i > 0) {
      hidden += ";";
    }
    hidden += hiddenValues[i];
  }

  hiddenSrcObj.value = hidden;
}


function getScrollY() {
  var scr = 0;
  // Netscape
  if(typeof( window.pageYOffset ) == 'number') scr = window.pageYOffset;
  // DOM
  else if(document.body && (document.body.scrollLeft || document.body.scrollTop))
    scr = document.body.scrollTop;
  // IE6
  else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
    scr = document.documentElement.scrollTop;
  return scr;
}


/* onsite block editing */
BlockOptions = {
  edit: function(id) {
    Element.hide($(id).getElementsByClassName("content")[0]);
    Element.show(id + "_options");
    editing = "true"; editOut();
  },
  cancel: function(id) {
    Element.hide(id + "_options");
    Element.show($(id).getElementsByClassName("content")[0]);
    editing = "";
  },

  save: function(id) {

  }
}

/* message */
OnSiteMessage = {
  showing: false,
  boxWidth: 237,

  // autohideDelay  how long to show. if < 1 the autohide is disabled
  display: function(id, autohideDelay) {
    OnSiteMessage.showing = true;

    // Get scroll
    var posy = 36 + getScrollY();
    $("onsite_message_" + id).style.top = posy + "px";
    $("onsite_message_" + id).style.zIndex = "10001";

    // Display the message
    $("onsite_message_" + id).style.left = (-1 * this.boxWidth) + "px";
    Element.show("onsite_message_" + id);
    new Effect.Move("onsite_message_" + id, { x: this.boxWidth, y: 0, duration: 0.3, fps: 30,
                    afterFinish: function() { if (autohideDelay > 0) setTimeout("OnSiteMessage.hide('" + id + "')", autohideDelay); } });
  },

  // Hide the message
  hide: function(id) {
    if (OnSiteMessage.showing == false) return;
    new Effect.Move("onsite_message_" + id, { x: (-1 * this.boxWidth), y: 0, duration: 0.3 });
    setTimeout("OnSiteMessage.showing = false;", 300);
    setTimeout("Element.hide('onsite_message_" + id + "');", 300);
  },

  // Hide the message with short delay
  delayedHide: function(id) {
    if (OnSiteMessage.showing == false) return;
    setTimeout("OnSiteMessage.hide('" + id + "');", 400);
  },

  // Show the message for a few seconds
  show: function(id) {
    if (OnSiteMessage.showing == true) return;

    // Auto hide if not error
    var autohide = -1;
    if (Element.hasClassName($("onsite_message_" + id), "onsite_message_error") == false)
      autohide = 2100;

    OnSiteMessage.showing = true;
    setTimeout("OnSiteMessage.display('" + id + "', '" + autohide + "')", 200);
  }
}

/**
 * Url generation tool. Similar has in pagewizard.java Registration
 */
UrlGenerator = {
  checkUrlChars: function(str) {
    var s = str.toLowerCase();

   s = s.replace(new RegExp(unescape("%E4"), "g"), "a");
   s = s.replace(new RegExp(unescape("%F6"), "g"), "o");
   s = s.replace(new RegExp(unescape("%E5"), "g"), "a");

   s = s.replace(/&amp;[^;\s]+;/g, '');
   s = s.replace(/[^\w\s]/g, '');
   s = s.replace(/\s+/g, '');
   s = s.replace(/[_]/g, '');
   return s;
  },
  setUrl: function(urlField, nameFieldValue) {
   if(!urlField)
      return;
   if(typeof nameFieldValue == "undefined" || nameFieldValue == null)
     nameFieldValue = "";
   urlField.value = UrlGenerator.checkUrlChars(nameFieldValue).substr(0, 60);
  }
}

/**
 * Allows to limit for example textarea's content
 */
TextLimiter = {

   limit: function(e, obj, maxLength) {
      if (window.event) {
         keycode = window.event.keyCode;
      } else if (e) {
         keycode = e.which;
      }

       if (obj.value.length >= maxLength && keycode == 8) { // backspace key
          return true;
       } else if (obj.value.length >= maxLength) {
          return false;
       }
    return true;
   },

   count: function(obj, cntObjName, maxLength) {
      cntObj = $(cntObjName);
      objVal = obj.value;
      if (objVal.length > maxLength) {
         objVal = objVal.substring(0, maxLength);
      }
      if (cntObj) {
         charsLeft = maxLength - objVal.length;
         if(navigator.appName == "Netscape") {
            cntObj.textContent = charsLeft;
         } else {
            cntObj.innerText = charsLeft;
         }
      }
      return true;
   }
}
function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null ){ node = document; }
    if ( tag == null ){ tag = '*'; }

    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
      if ( pattern.test(els[i].className) ) {
        classElements[j] = els[i];
        j++;
      }
    }
    return classElements;
  }

function handleInfoBalloonOnmouseout(elem, spanIds) {
  setTimeout("changeInfoBalloonsVisibility('"+elem.id+"', '"+spanIds+"');", 1500);
}

function changeInfoBalloonsVisibility(elemId, spanIds) {
  hideHiddenField(elemId);
  var spans = spanIds.split(',');
  for (var i = 0; i < spans.length; i++) {
    $(spans[i]).style.visibility = 'visible';
  }
  // Remove session parameter
  new Ajax.Request(ajaxUrl,
        { parameters: {  resource: 'infoballoons',
                         action: 'mark_as_checked',
                         balloonid: elemId },
            onSuccess: function () { /* do nothing */ }

        });

}