/**
 *  The first DN-JavaScript file to be loaded by the client,
 *  however, jquery.js must be called first.
 *
 *  Contains:
 *    - name space definitions
 *    - functions for dnJobb
 *    - common functions for sections (header / footer)
 *    - common functions for article template
 *
 */

//// top namespaces
var NHST = {};
NHST.DN = {};

//// 'forum' is defined here because it is used by both dn and dnforum-webapp.
NHST.DN.forum = {};

//// The most basic functionality
NHST.DN.lang = {};

NHST.DN.lang.compareIgnoreCase = function(oneString, otherString){
    if (!(oneString && otherString)){
        return false;
    }
    return  oneString.toUpperCase() ==
        otherString.toUpperCase();
}

//// Navigate, manipulate and more with DOM (html documents)

NHST.DN.dom = {};

NHST.DN.dom.isHtmlElement = function(candidate){
  return candidate && candidate.tagName;
}

NHST.DN.dom.elementIsType = function(candidate, type){
  return NHST.DN.dom.isHtmlElement(candidate) &&
    NHST.DN.lang.compareIgnoreCase(candidate.tagName, type);
}

//childNodes[] often contains 'garbage'
NHST.DN.dom.findChildNodesOfType = function(container, reqestedType){
  var validElements = new Array(0)
  for (var i=0; i <  container.childNodes.length; i++){
      var elementOfUnknownType = container.childNodes[i];
  if (NHST.DN.dom.elementIsType(elementOfUnknownType, reqestedType)) {
      validElements.push(elementOfUnknownType);
  }
  }
  return validElements;
}

NHST.DN.dom.findChildNodesOfTypeLi = function(containingUl){
  return NHST.DN.dom.findChildNodesOfType(containingUl, 'LI');
}

NHST.DN.dom.findChildNodesOfTypeDiv = function(container){
  return NHST.DN.dom.findChildNodesOfType(container, 'DIV');
}

//// Toggeling value of input field or similar
NHST.DN.form = {};

NHST.DN.form.isEmpty = function(value) {
    return value == '';
}
NHST.DN.form.empty = function() {
    return '';
}

//valueContainer is typically a form input-element, but can be
//anything with a 'value' attribute
NHST.DN.form.updateValue = function(valueContainer, value) {
 if (NHST.DN.form.isEmpty(valueContainer.value)) {
  valueContainer.value = value;
 }
};

NHST.DN.form.clearIfDefaultValue = function(valueContainer, defaultValue) {
 if (valueContainer.value == defaultValue) {
  valueContainer.value = NHST.DN.form.empty();
 }
};

/**
 * Functions for dnJobb section
 *
 */

NHST.DN.dnjobb = {};

NHST.DN.dnjobb.changeAlle = function (inputElement, formId, inputGroupName) {
  if (inputElement.checked == true) {
    var form = document.getElementById(formId);
    form.elements[inputGroupName].item(1).checked = false;
    form.elements[inputGroupName].item(2).checked = false;
    form.elements[inputGroupName].item(3).checked = false;
    form.elements[inputGroupName].item(4).checked = false;
  }
}

NHST.DN.dnjobb.changeRest = function (inputElement, formId, inputGroupName) {
  var form = document.getElementById(formId);
  if (inputElement.checked == true
      && form.elements[inputGroupName].item(0).checked == true) {
    form.elements[inputGroupName].item(0).checked = false;
  } else if (form.elements[inputGroupName].item(1).checked == true
      && form.elements[inputGroupName].item(2).checked == true
      && form.elements[inputGroupName].item(3).checked == true
      && form.elements[inputGroupName].item(4).checked == true) {
    form.elements[inputGroupName].item(1).checked = false;
    form.elements[inputGroupName].item(2).checked = false;
    form.elements[inputGroupName].item(3).checked = false;
    form.elements[inputGroupName].item(4).checked = false;
    form.elements[inputGroupName].item(0).checked = true;
  }
}

/**
 * Functions for toggeling tabbed content
 *
 * Tests are found in src/test/javascript/
 *
 * The HTML must look as follows, with an equal number of li elements and divs with content.
 * CSS classes visible and hidden hides/shows content with display: block|none, while
 * while active and hidden are indended for visual effects, e.g. high lighting active li element.
 *
 * <div>
 *  <ul>
 *    <li class="active">  <a href="#" onclick="return NHST.DN.toggle.toggle(this);">...</a>
 *    <li class="inactive"><a href="#" onclick="return NHST.DN.toggle.toggle(this);">...</a>
 *  </ul>
 *  <div class="visible">...</div>
 *  <div class="hidden">...</div>
 * </div>
 *
 */

NHST.DN.toggle = {};

//CSS naming conventions for toggeling content
//active/inactive tabs/links vs visible/hidden content
NHST.DN.toggle.visibleContentCss = 'visible';
NHST.DN.toggle.hiddenContentCss = 'hidden';
NHST.DN.toggle.activeLinkCss = 'active';
NHST.DN.toggle.inactiveLinkCss = 'inactive';

NHST.DN.toggle.getActiveOrInactiveClass = function(isActive) {
    return isActive ? NHST.DN.toggle.activeLinkCss : NHST.DN.toggle.inactiveLinkCss;
}

NHST.DN.toggle.getVisibleOrHiddenClass = function(isVisible) {
    return isVisible ? NHST.DN.toggle.visibleContentCss : NHST.DN.toggle.hiddenContentCss;
}

NHST.DN.toggle.findSuperContainer = function(containedUl){
    //not fail safe...
    return containedUl.parentNode;
}

//constructor
NHST.DN.toggle.ToggleBox = function(clickedLink){
    var activatedLi = clickedLink.parentNode;
    var ul = activatedLi.parentNode;
    this.liArray = NHST.DN.dom.findChildNodesOfTypeLi(ul);
    this.superContainer = NHST.DN.toggle.findSuperContainer(ul);
    this.contentArray = NHST.DN.dom.findChildNodesOfTypeDiv(this.superContainer);
}

NHST.DN.toggle.ToggleBox.prototype.toggleLinks = function(clickedLink){
    var clickedLi = clickedLink.parentNode;
    var indexOfClicked = 0;//fallback value
    for (var i = 0; i < this.liArray.length; i++){
        var currentLi = this.liArray[i];
        if (clickedLi == currentLi){
            currentLi.className = NHST.DN.toggle.getActiveOrInactiveClass(true);
            indexOfClicked = i;
        } else {
            currentLi.className = NHST.DN.toggle.getActiveOrInactiveClass(false);
        }
    }
    return indexOfClicked;
}


NHST.DN.toggle.ToggleBox.prototype.toggleContent = function(divIndex){
    for (var i = 0; i < this.contentArray.length; i++) {
        this.contentArray[i].className = NHST.DN.toggle.getVisibleOrHiddenClass(i == divIndex);
    }
}

NHST.DN.toggle.ToggleBox.prototype.toggle = function(clickedLink){
    var indexOfClicked = this.toggleLinks(clickedLink);
    this.toggleContent(indexOfClicked);
}

//To be called from an a-element
NHST.DN.toggle.toggle = function(clickedLink){
    var box = new NHST.DN.toggle.ToggleBox(clickedLink);
    box.toggle(clickedLink);
    return false;
}

/**
 *  Function for toggeling the menu
 *
 */
function toggleContentList() {
  $("#content_list").toggle();
  $("#sub_menu").toggle();

  if($("#browse_content").hasClass("browse_content")) {
    $("#browse_content").removeClass("browse_content")
    $("#browse_content").addClass("browse_content_active")
  }
  else {
    $("#browse_content").removeClass("browse_content_active")
    $("#browse_content").addClass("browse_content")
  }
}

$(document).ready(function() {
  $("#browse_content").click(function() {
    toggleContentList();
  });
});

$(document).ready(function() {
  $("#content_list").click(function() {
    toggleContentList();
  });
});


/**
 * Function for moving ads
 *
 */
function moveAd(cuid) {
  var adPlacementEl = document.getElementById("adPlacement"+cuid);
  var adFactoryEl = document.getElementById("adFactory"+cuid);
  if (adPlacementEl && adFactoryEl) {
    // size is set to "auto" to enable expanding ads and ads without correct configuration
    adPlacementEl.style.height="auto";
    adPlacementEl.style.width="auto";

    // IE will reload scripts after moving unless we set src to null
    var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
    var x=adFactoryEl.getElementsByTagName('script');
    if (x != null) {
      for (i=0;i<x.length;i++) {
        var t=x[i];
        if (isIE) {
          t.src="http://www.dn.no/include/js/empty.js";
        } else {
          t.src.replace="http://www.dn.no/include/js/empty.js";
        }
      }
    }

    var adFactoryParentEl = adFactoryEl.parentNode;
    adFactoryParentEl.removeChild(adFactoryEl);
    adPlacementEl.innerHTML='';
    adPlacementEl.appendChild(adFactoryEl);
  }
}

/**
 * Script for showing the popup panels for the job carousel flash
 * The flash calls: ExternalInterface.call("nhst.dnJobbCarousel.showPanel"...)
 */
var nhst = {};
nhst.dnJobbCarousel = {};
nhst.dnJobbCarousel.showPanel = function(containerId,top,jobTitle,jobDescription,companyName,companyDescription,link) {
  var container= $("#" + containerId);

  // init container events
  if(!container.data("init")) {
    var waitBeforeClose = 100; // ms
    var out = function() {
      container.data("mouseover",false)
      window.setTimeout(function() {
          // wait waitBeforeClose ms before closing to be sure that
          // the pointer is really outside the container and not just
          // moved between the flash element and the popup div
          if(!container.data("mouseover")) {
            container.children(".carousel_popup").remove();
            container.data("alreadyWaited",false); // leaving the container so wait before opening next popup
          }
        }, waitBeforeClose);
      }

    var over = function() {container.data("mouseover",true)};
    container.hover(over, out);

    container.data("init", true)
    container.trigger('mouseover');
  }

  // delete previous popup in this container, if any
  container.find(".carousel_popup").remove();

  // open popup if this ad has data for it (!= 'null' for comparing with null and 'null' from flash)
  if(jobTitle != 'null' && jobDescription != 'null' && companyName != 'null' && companyDescription != 'null') {

    // create new popup from template
    var template = container.find(".dnjobbcarousel_popup_template");
    var popup = template.clone();
    popup.attr("id","");
    popup.addClass("carousel_popup");

    // add content
    popup.find(".header h1").html(companyName);
    popup.find(".ingress").html(companyDescription);
    popup.find("h2").html(jobTitle);
    popup.find(".description").html(jobDescription);
    popup.find("a.jobLink").attr("href", link);

    // set style
    if(top < 0) {
      top = 0;
    }
    var offset = container.find("object").position().top;
    var border = 9;
    popup.css("top", offset + top + border);

    // add close button event
    popup.find(".closelink").click(function(event) {
      event.preventDefault();
      $(this).parents(".carousel_popup").remove();
    });

    // add popup to DOM
    template.after(popup);

    var waitBeforeOpening = 1500; // ms
    if(container.data("alreadyWaited")) {
      if(container.data("mouseover")) popup.fadeIn("fast");
    } else {
      // open after timeout
      window.setTimeout(function() {
          container.data("alreadyWaited",true); // no delay until we leave container again
          if(container.data("mouseover")) popup.fadeIn("fast");
        }, waitBeforeOpening);
    }
  }
}

/**
 *  Scripts used by the article template
 *
 *  - Toggle tip a friend box in toolbar
 *  - Validate netmeeting form
 *  - Article discussion (reply and alert actions)
 *
 */

/**
 * Store initial value as default value,
 * clear value whenever input gets focus and
 * value is equal to the default value
 */
NHST.DN.focusInput = function(event) {
  var input = event.target;

  if(!$(input).data("default_value")) {
    var defaultValue = $(input).val();
    if(!defaultValue) defaultValue = " "; // or inputUpdated() won't work on inputs with no initial value
    $(input).data("default_value", defaultValue)
  }

  if($(input).attr("value") == $(input).data("default_value")) {
    $(input).attr("value",'');
  }
}

/**
 * Restore default value on blur if input is empty
 */
NHST.DN.blurInput = function(event) {
  var input = event.target;

  if($(input).val().length == 0) {
    $(input).val($(input).data("default_value"));
  }
}

/**
 * Check if input has been updated
 */
NHST.DN.inputUpdated = function(input) {
  // only for inputs with class "restore_default_value"
  if($(input).hasClass("restore_default_value")) {
    var defaultValue = $(input).data("default_value");
    if(!defaultValue || defaultValue == $(input).val()) {
      return false;
    }
  }
  return true;
}

/**
 *  Article discussion
 */
NHST.DN.toggleReplyBox = function(event) {
  var replyTitlePrefix = "Re: ";  // prefix used for suggesting reply title
  var replyButton = event.target;

  if(!$(replyButton).hasClass("replybox_added")) {
    var comment = $(replyButton).parents(".comment");
    var commentId = NHST.DN.getCommentId(comment);
    // clone template box with events
    var replyBoxTemplate = $("#replyto_template").clone(true);
    replyBoxTemplate.attr("id", "replyto_" + commentId);
    replyBoxTemplate.find("input[name='entry_id']").val(commentId);
    // Adding ids to input fields makes it easier for testing.
    replyBoxTemplate.find("input[name='entry_title']").attr("id", "entry_title_" + commentId);
    replyBoxTemplate.find("input[name='entry_username']").attr("id", "entry_username_" + commentId);
    replyBoxTemplate.find("textarea[name='entry_comment']").attr("id", "entry_comment_" + commentId);
    replyBoxTemplate.find("input[value='Publiser']").attr("id", "entry_submit_" + commentId);
    // set title to "Re: XXX" where XXX is title of parent
    var parentTitle = $(comment).find("h5").attr("title");
    replyBoxTemplate.find("input[name='entry_title']").val(replyTitlePrefix + parentTitle);
    comment.after(replyBoxTemplate);
    $(replyButton).addClass("replybox_added");
  }

  var comment = $(replyButton).parents(".comment");
  var commentId = NHST.DN.getCommentId(comment);

  $("#alert_" + commentId + ":visible").slideToggle("fast");
  $("#replyto_" + commentId).slideToggle("fast");

  event.preventDefault();
}

NHST.DN.toggleAlertBox = function(event) {
  var alertButton = event.target;

  if(!$(alertButton).hasClass("alertbox_added")) {
    var comment = $(alertButton).parents(".comment");
    var commentId = NHST.DN.getCommentId(comment);
    // clone template box with events
    var alertBoxTemplate = $("#alert_template").clone(true);
    alertBoxTemplate.attr("id", "alert_" + commentId);
    alertBoxTemplate.find("input[name='entry_id']").val(commentId);
    // Adding ids to input fields makes it easier for testing.
    alertBoxTemplate.find("input[name='alert_email']").attr("id", "alert_email_" + commentId);
    alertBoxTemplate.find("input[name='alert_username']").attr("id", "alert_username_" + commentId);
    alertBoxTemplate.find("textarea[name='alert_comment']").attr("id", "alert_comment_" + commentId);
    alertBoxTemplate.find("input[value='Send']").attr("id", "alert_submit_" + commentId);
    comment.after(alertBoxTemplate);
    $(alertButton).addClass("alertbox_added");
  }

  var comment = $(alertButton).parents(".comment");
  var commentId = NHST.DN.getCommentId(comment);

  $("#replyto_" + commentId + ":visible").slideToggle("fast");
  $("#alert_" + commentId).slideToggle("fast");

  event.preventDefault();
}

NHST.DN.submitReply = function(event) {
  event.preventDefault();
  var replyBox = $(event.target).parents(".comments_form");
  var form = $(event.target).parents("form");

  var titleInput = form.find("input[name='entry_title']");
  var usernameInput = form.find("input[name='entry_username']");
  var commentInput = form.find("textarea[name='entry_comment']");

  var formValid = true;

  replyBox.find(".missing_title").hide();
  replyBox.find(".missing_name").hide();
  replyBox.find(".missing_comment").hide();

  if(!(NHST.DN.inputUpdated(titleInput) && titleInput.val().length > 0)) {
    replyBox.find(".missing_title").fadeIn("slow");
    formValid = false;
  }
  if(!(NHST.DN.inputUpdated(usernameInput) && usernameInput.val().length > 0)) {
    replyBox.find(".missing_name").fadeIn("slow");
    formValid = false;
  }

  if(!(NHST.DN.inputUpdated(commentInput) && commentInput.val().length > 0)) {
    replyBox.find(".missing_comment").fadeIn("slow");
    formValid = false;
  }

  if(formValid) {
    // disable reply button to avoid multiple submits
    replyBox.find(".entry_submit").attr("disabled","disabled");

    var parentEntryId = form.find("input[name='entry_id']").val();

    var data = {
        action: form.find("input[name='action']").val(),
        advice: '',
        article_id: form.find("input[name='article_id']").val(),
        article_url: '',
        entry_id: parentEntryId ? parentEntryId : '',
        forum_id: form.find("input[name='forum_id']").val(),
        generic: form.find("input[name='entry_title']").val(),
        text: form.find("textarea[name='entry_comment']").val(),
        topic_id: form.find("input[name='topic_id']").val(),
        url: artdiscPostURL, // set in javascriptBottom.tag
        username: form.find("input[name='entry_username']").val()
    };

    $.ajax({
      type: "POST",
      url: "/www.dn.no/servlet/articlediscussion/post/",
      data: data,
      success: function(msg){
        var successBox = $("#replyto_success_template").clone();
        successBox.attr("id","");
        replyBox.empty();
        replyBox.append(successBox);
        successBox.fadeIn("slow");
      },
      error: function(request, type){
        replyBox.find(".post_error").hide();
        replyBox.find(".post_error").fadeIn("slow");
        replyBox.find(".entry_submit").removeAttr("disabled"); // allow retry
      }
    });
  }
}

NHST.DN.submitAlert = function(event) {
  event.preventDefault();
  var alertBox = $(event.target).parents(".comments_form");
  var form = $(event.target).parents("form");

  var emailInput = form.find("input[name='alert_email']");
  var usernameInput = form.find("input[name='alert_username']");
  var commentInput = form.find("textarea[name='alert_comment']");

  var formValid = true;

  alertBox.find(".missing_name").hide();
  alertBox.find(".missing_comment").hide();

  if(!(NHST.DN.inputUpdated(usernameInput) && usernameInput.val().length > 0)) {
    alertBox.find(".missing_name").fadeIn("slow");
    formValid = false;
  }

  if(!(NHST.DN.inputUpdated(commentInput) && commentInput.val().length > 0)) {
    alertBox.find(".missing_comment").fadeIn("slow");
    formValid = false;
  }

  if(formValid) {
    // disable send button to avoid multiple submits
    alertBox.find(".alert_submit").attr("disabled","disabled");

    var parentEntryId = form.find("input[name='entry_id']").val();

    var data = {
        action: form.find("input[name='action']").val(),
        advice: '',
        article_id: '',
        //article_id: form.find("input[name='article_id']").val(),
        article_url: '',
        entry_id: parentEntryId ? parentEntryId : '',
        forum_id: form.find("input[name='forum_id']").val(),
        generic: form.find("input[name='alert_email']").val(),
        text: form.find("textarea[name='alert_comment']").val(),
        topic_id: form.find("input[name='topic_id']").val(),
        url: artdiscPostURL, // set in javascriptBottom.tag
        username: form.find("input[name='alert_username']").val()
    };

    $.ajax({
      type: "POST",
      url: "/www.dn.no/servlet/articlediscussion/post/",
      data: data,
      success: function(msg){
        var successBox = $("#alert_success_template").clone();
        successBox.attr("id","");
        alertBox.empty();
        alertBox.append(successBox);
        successBox.fadeIn("slow");
      },
      error: function(request, type){
        alertBox.find(".post_error").hide();
        alertBox.find(".post_error").fadeIn("slow");
        alertBox.find(".alert_submit").removeAttr("disabled"); // allow retry
      }
    });
  }
}

NHST.DN.getCommentId = function(comment) {
  return comment.attr("id").split("_")[1];
}

NHST.DN.initArticleDiscussion = function() {
  if ($("#art_comments").length > 0) {
    $(".entry_reply").click(NHST.DN.toggleReplyBox);
    $(".entry_alert").click(NHST.DN.toggleAlertBox);

    $(".entry_submit").click(NHST.DN.submitReply);
    $(".alert_submit").click(NHST.DN.submitAlert);
  }
}

/**
 * Move the article_body_ad div into the article body if
 * present, and float the ad container to the right
 *
 * Will be added directly after the first "P" in the
 * article body, but if the ad div isn't aligned to the
 * right border of the article body (-10px "safety margin")
 * it will be moved to after the next "P" (lather, rinse,
 * repeat, max five times). This can happen when there is
 * right floated content at the top of the article body.
 */
NHST.DN.moveArticleBodyAd = function() {
  var artElement = $("#body_text");
  var adElement = $("#article_body_ad");
  var safetyMargin = 10;
  var maxTries = 5;
  if(artElement.length > 0 && adElement.length > 0) {

    adElement.find("script").attr("src","/www.dn.no/include/js/empty.js");
    var paragraphs = artElement.find("> p");
    adElement.css("float","right");
    paragraphs.eq(0).after(adElement);

    var i = 1;
    var lim = (artElement.position().left + artElement.width()) - (adElement.width() + safetyMargin);
    while((adElement.position().left < lim) && (i < maxTries)) {
      paragraphs.eq(i).after(adElement);
      i++;
    }
  }
}
// Move article_body_ad immediatly if it is present and this isn't IE
// (see DNNO-1404 and 1436), otherwise defer to dom ready
if(!$.browser.msie && $("#article_body_ad").length) {
  NHST.DN.moveArticleBodyAd();
} else {
  $(NHST.DN.moveArticleBodyAd);
}

/**
 * If related articles are present at the end of an article, this
 * will move the first article to the body of the article (at the 
 * last paragraph of the article). This also add css class called
 * 'sticky', which brings it a bit out of the body.
 */
NHST.DN.moveFirstRelatedArticleWithinBody = function() {
  var artElement = $("#body_text");
  var relatedArticle = $("#relatedArticlesInlined div:first");
  var safetyMargin = 10;
  var maxTries = 5;
  
  if(artElement.length > 0 && relatedArticle.length > 0) {
    var paragraphs = artElement.find("> p");
    var articleBox = $(document.createElement('div'));
    var paragraphPosition = (paragraphs.length > 3) ? ((paragraphs.length-1)/3)*2 : 2;
    articleBox.append('<h3>Les også</h3>');
    articleBox.addClass("box_pullout");
    relatedArticle.addClass("art_pullout");
    articleBox.append(relatedArticle);
    paragraphs.eq(paragraphPosition).after(articleBox);
    
    // Clean up on the right hand side; remove the heading if no related are present.
    var relatedArtSection =  $("#relatedNewsArticles");
    if(relatedArtSection.children().length == 1) {
    	relatedArtSection.remove();
    }
  }
}
// Moves the first related article to the end of the article. If IE, waits until dom is ready.
if((!$.browser.msie) && $("#relatedArticlesInlined").length) {
	NHST.DN.moveFirstRelatedArticleWithinBody();
} else {
	$(NHST.DN.moveFirstRelatedArticleWithinBody);
}

// Setter inn innhold av en annonse etter tabeller (impl. oppskrifter). Typisk vil annonse inneholde en print-knapp
// og kall til en utskriftsfunksjon
NHST.DN.replaceTableInRecipeWithAd = function() {
	  var articleElement = $("#content.articleType-recipe").get(0);
	  var tableElement = $("#body_text table");//.get(0);
	  if (articleElement != undefined && tableElement != undefined) {
  	     var adElement = $(".ad_outer.Bottom-1 > div.ad > div"); //  ad is in nested divs. This gets div with richmedia class (which contain the ad content)
  	     // legg annonseinnhold i en wrapper-div som settes inn etter oppskrift(er)
         adElement.wrapInner('<div class="print_oppskrift_trigger"></div>');
         $(tableElement).after($(".print_oppskrift_trigger"));
	  }
}

NHST.DN.styleTaxTable = function() {
	$('table.tax tr:even').addClass('even');
	$('table.tax td:first-child').addClass('tax_first_col');
	$('table.tax td:last-child').addClass('tax_last_col');
}

// tildeler artikkelelementet en CSS-klasse for å muliggjøre elementskjuling i print
NHST.DN.printOppskrift = function() {
	var articleElement = $("#content.articleType-recipe");
	// NB! Setter siden i oppskrifts/utskriftskontekst. Beholdes inntil siden lastes på ny. Så flere window.print
	// vil gi oppskriften og ikke hele artikkelen
	articleElement.addClass("oppskrift");
    var adElement = $(".ad_outer.Bottom-2 > div.ad > div"); // the actual ad content is nested div's generated by templates and tag files
    adElement.wrapInner('<div id="utskrift_header_logo" class="show_in_print" />');
    $(articleElement).before($("#utskrift_header_logo"));
	window.print();
}


NHST.DN.videoInArticle = function() {
  if(paragraph) {

    paragraph--;

    var numParagraphs = $("#body_text").children("p").length;

//    document.write("Video_var: " + video)
    if(paragraph > numParagraphs) {
      paragraph = numParagraphs - 1;
    }

    if(paragraph < 0) {
      paragraph = 0;
    }

    for (var test = 0; test < vidArray.length; test=test+5) {

    	$($("#body_text").children("p")[paragraph]).after("<div id='body_video"+vidArray[test+4]+"' class='videoThumbnail'><img src='"+vidArray[test]+"' alt='' /><div class='videoThumbnailOverlay2' style='width: "+vidArray[test+2]+"px; height:"+vidArray[test+3]+"px;'><a href='javascript: insertVideoInArticle( \"body_video"+vidArray[test+4]+"\",\""+embedURL+"\","+vidArray[test+1]+","+vidArray[test+2]+","+vidArray[test+3]+");' class='videoThumbnailOverlay' style='width: "+vidArray[test+2]+"px; height:"+vidArray[test+3]+"px;'></a></div></div>");
    }
  }
}

NHST.DN.twitterFeed = function() {

  $(document).ready(function(){

    var $tweet_queries = $('.tweet-container form');

    $tweet_queries.each(function(i, form){
      var queryString = encodeURIComponent($(form).find("input[name='twitter_query']").val());
      var count = $(form).find("input[name='twitter_rpp']").val();

      var fileref = document.createElement('script');
      fileref.setAttribute("type","text/javascript");
      fileref.setAttribute("src", "http://search.twitter.com/search.json?q="+queryString+"&callback=NHST.DN.twitterCallback&rpp="+count+"");
      var $link = $(form).parents('.box_content').siblings('.box_menu').find('a');
      $link.attr('href', 'http://search.twitter.com/search?q=' + queryString);
      document.getElementsByTagName("head")[0].appendChild(fileref);
    });
  });
}

NHST.DN.twitterCallback = function(ob) {
  var original_query = ob.query;

  var $tweet_queries=$('.tweet-container form');

  var container;
  $tweet_queries.each(function(i, form){
    var query = $(form).find("input[name='twitter_query']").val();
    // Twitter replaces spaces with '+' in returned json
    query = encodeURIComponent(query).replace(/%20/g, '+');

    if(query === original_query) {
      container = $(form).parent();
      return false;
    }
  });

  if(typeof(container) != 'undefined') {
    container.html('');

    $(ob.results).each(function(i){
        var str = '<div class="twitter_message">\
        <div class="txt">'+NHST.DN.formatTweetString(this.text)+'</div>\
        <span class="byline">'+NHST.DN.relativeTime(this.created_at)+"  fra  "+this.from_user+'</span>\
        </div>';

        container.append(str);
    });
  }
}

NHST.DN.formatTweetString = function(str){
    str=' '+str;
    str = str.replace(/((ftp|https?):\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?)/gm,'<a href="$1" target="_blank">$1</a>');
    // The tweets arrive as plain text, so we replace all the textual URLs with hyperlinks
    str = str.replace(/([^\w])\@([\w\-]+)/gm,'$1@<a href="http://twitter.com/$2" target="_blank">$2</a>');
    // Replace the mentions
    str = str.replace(/([^\w])\#([\w\-]+)/gm,'$1<a href="http://twitter.com/search?q=%23$2" target="_blank">#$2</a>');
    // Replace the hashtags
    return str;
}


NHST.DN.relativeTime = function(pastTime){
    var origStamp = Date.parse(pastTime);
    var curDate = new Date();
    var currentStamp = curDate.getTime();
    var difference = parseInt((currentStamp - origStamp)/1000);

    if(difference < 0) return false;

    if(difference <= 5)         return "Nå nettopp";
    if(difference <= 20)        return "Sekunder siden";
    if(difference <= 60)        return "Et minutt siden";
    if(difference < 3600)       return parseInt(difference/60)+" minutter siden";
    if(difference <= 1.5*3600)  return "En time siden";
    if(difference < 23.5*3600)  return Math.round(difference/3600)+" timer siden";
    if(difference < 1.5*24*3600)    return "En dag siden";

    var dateArr = pastTime.split(' ');

    return dateArr[4].replace(/\:\d+$/,'')+' '+dateArr[2]+' '+dateArr[1]+
    (dateArr[3]!=curDate.getFullYear()?' '+dateArr[3]:'');
}


NHST.DN.initArticleTemplate = function() {
  // Init toolbar
  $("#toolbar_tipafriend_btn").click(function () {
    $("#toolbar_tipafriend_btn").toggleClass("toolbar_tipfriend_selected");
    $("#toolbar_tipafriend_container").slideToggle("fast");
    return false;
  });

  // Toggle tabbed panel (Most read today/week), works for all panels with HTML like:
  // <ul><li class="tab"><li class"tab></ul><ul class="panel"><ul class="panel">
  $(".tab").click(function(event) {
    event.preventDefault();
    var clickedTab = $(this);
    var allTabs = clickedTab.parent().find("li");
    allTabs.removeClass("active");
    clickedTab.addClass("active");
    var selectedIndex = allTabs.index(clickedTab);
    var panels = clickedTab.parent().nextAll();
    panels.hide();
    $(panels.get(selectedIndex)).show();
  });

  // Init article discussion
  NHST.DN.initArticleDiscussion();

  // Handle related videos if any.
  NHST.DN.videoInArticle();

  // Validate and submit netmeeting form
  var form = $("#art_netmeeting_question_form");
  form.submit(function() {
    if(this.title.value == "" || this.name.value == "" || this.body.value == "") {
      $("#art_netmeeting_input_error").hide().fadeIn("slow");
      return false;
    }

    $.ajax({
      type: 'POST',
      url: form.attr('action'),
      data: form.serialize(),
      success: function() {
        var container = $('#art_netmeeting_container');
        container.empty();
        $('<h2>Takk for ditt spørsmål.</h2>').hide().appendTo(container).fadeIn();
      },
      contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
    });

    return false;
  });

 NHST.DN.replaceTableInRecipeWithAd();

 NHST.DN.styleTaxTable();

}



NHST.DN.sendTip = function(event) {
  event.preventDefault();
  var tipBox = $(event.target).parents(".dn_tip_form");
  var form = $(event.target).parents("form");
  var successBox = $("#dn_footer_sendtip #tip_success");
  var failBox = $("#dn_footer_sendtip #tip_error");

  var mailFrom = form.find("input[name='mailfrom']").val();
  var forslag = form.find("textarea[name='forslag']").val();
  var msg = validateTip(forslag,mailFrom);

  failBox.hide(); // hide old error messages

  if ("" != msg) {
	failBox.html(msg).addClass("error").show();
    return false;
  }

  var data = {
    mailfrom: mailFrom,
    forslag: forslag,
    user_agent: navigator.userAgent,
    side: window.location.href,
    subject: form.find("input[name='subject']").val(),
    fields: form.find("input[name='fields']").val() + ",user_agent,side",
    fieldnames: form.find("input[name='fieldnames']").val() + ",browser,sendt fra",
    mailto: form.find("input[name='mailto']").val(),
    redirect: form.find("input[name='redirect']").val()
    };



  $.ajax({
    type: "POST",
    url: "/www.dn.no/simpleformmailer/",
    data: data,
    success: function(msg){
	  successBox.show();
	  tipBox.hide();
    },
      error: function(request, type){
    	failBox.show();
    }
  });
}

NHST.DN.initIdnContactPage = function() {
  $('#contactSelector').change(function(e){

    var sel = $('#contactSelector :selected').attr('value');
    $('.contact_information').show();
    $('.contact_information').children('.employee').show();

    var emp = $('.contact_information').find('.employee');

    if(sel != ('all')) {

      for (var a=0; a<emp.length; a++) {
        if ($(emp[a]).children('.contactbox').length == 0) {
          $(emp[a]).hide();
        }
      }
      if ($('.employee').children('.contactbox').length == 0) {
        $('.employee').hide();
      }

      var elements = $('#idn_contact_article').find('.contactbox');
      for (var i = 0; i < elements.length; i++) {
        var test = $(elements[i]).hasClass('.' + sel);
        if (test == false) {
          $(elements[i]).parent().hide();
        }
      }
      var contactInfoBoxes = $('.contact_information');
      $.each(contactInfoBoxes, function(i, box) {

        var contactBox = $(box);

        if (contactBox.children('.employee:visible').length == 0) {
          contactBox.hide();
        }
      });
    }
    else {
      $('.employee').show();

      for (var a=0; a<emp.length; a++) {
        if ($(emp[a]).children('.contactbox').length == 0) {
          $(emp[a]).hide();
        }
      }
      if ($('.employee').children('.contactbox').length == 0) {
        $('.employee').hide();
      }
    }
  });
}

NHST.DN.openEreaderWindow = function(url) {
	window.open(url, 'eavisvindu', 'toolbar=no,location=no,resizable=no,menubar=no,directories=no,fullscreen=yes,dependent=no');
}

function insertVideoInArticle(divID, baseURL, videoID, width, height) {
  var params = {
      allowfullscreen: "true"
    };
// baseURL is most likely given by a value in an XPR-file loaded and set as a script variable in the template/jsp using this script
  swfobject.embedSWF(baseURL + "&watch=" + videoID + "&width=" + width, divID, width, height, "9.0.28", false, false, params, false);
}

function insertTVplayer(url, width, height) {
  // For integration with VideoPlaza library:
  // allowScriptAccess must be always
  var params = {
    allowfullscreen: "true",
    allowScriptAccess: "always"
  };
  swfobject.embedSWF(url, "dntv_player", width, height, "9.0.28", false, false, params, false);
}

function validateEmail(elementValue) {
  var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
  return emailPattern.test(elementValue);
}

/**
 *
 * @param targetSelector jQuery selector of where to put messages
 * @return Inserts messages wrapped in <li> into the element given by the selector
 */
function validateTip(tip, email) {
  var error = false;
  var msg="";
  if(tip.length < 5 ) {
    error = true;
    msg+=  "<li>Forslaget må ha flere enn 4 tegn</li>";
  }
  if(tip == "Ditt forslag") {
    error = true;
    msg+=  "<li>Vennligst oppgi en melding</li>";
  }
  if (!validateEmail(email)) {
    error = true;
    msg+=  "<li>Vennligst oppgi en gyldig epostadresse</li>";
  }
  if (error) {
    return "<ul>" + msg + "</ul>";
  }
  return "";
}

/* overwrite the popup function from the serviceweb web client to increase size of window */
var popUp;
function OpenPopupPage (pageUrl, controlID, isPostBack, initDate) {
 popUp=window.open(pageUrl+'?controlID='+controlID+'&isPostBack='+ isPostBack+'&initDate='+ initDate,'popupcal', 'width=260,height=330,left=200,top=250');
}



NHST.DN.addUrlParam = function(selector, nameAndValue) {
	   $(selector).attr('href', function(i, h) {
  	     return h + (h.indexOf('?') != -1 ? "&" + nameAndValue : "?" + nameAndValue);
  	   });
}


// Place all general on dom ready init in this function
NHST.DN.initAllPages = function() {
  // All inputs with class .restore_default_value will revert to
  // init value when blurred after no change to value
  // used by: "tip us", articlediscussion
  $(".restore_default_value").focus(NHST.DN.focusInput);
  $(".restore_default_value").blur(NHST.DN.blurInput);

  // tip us(on all pages with default footer)
  $("#dn_footer_sendtip .tip_form_submit").click(NHST.DN.sendTip);

  $("#avis-content .openEreaderForsideLink").click(function() {NHST.DN.openEreaderWindow('./leser');return false;});
  $("#avis-content .openEreaderUtgaverLink").click(function() {NHST.DN.openEreaderWindow('./leser');return false;});

  NHST.DN.twitterFeed();

  NHST.DN.initIdnContactPage();

  // Enable service menu in finance element on frontpage
  $("#service_menu_toggle").click(function(){ $("#service_menu ul").toggle(); });

  $("#content_list_toggle").click(function(){
    $("#content_list").toggle();
    $("#content_list_toggle").toggleClass("active", "");
    return false;
  });

  $("#latest_news_list_toggle").click(function(){
    $("#latest_news_list").toggle();
    $("#latest_news_list_toggle").toggleClass("active", "");
    return false;
  });


  //Only run this when in article context
  if ($("#art_column_main").length > 0) {
    NHST.DN.initArticleTemplate();
  }

  //Only run on price calc page:
  if ($("#priceCalculator").length > 0) {
      var kalkis = new PriceCalculator();
      kalkis.init();
  }

  // dn.no/avis/skrapelodd/
  if($('#voucher_form').length > 0) {
    $('#voucher_form').submit(function(e) {
      var code = $(this.voucher_code).val();
      if(code.length < 5) {
    	$("#invalid_code").hide();
    	$('#voucher_code').addClass('error_outline');
        $('#voucher_error').hide().fadeIn();
        return false;
      } else {
        return true;
      }
    });
  }
}

$(NHST.DN.initAllPages);

