// MASTER JS

// SWFobject for IPS by sveinung@idium.no Feb 2010

(function f(b){var d=window.ips=window.ips||{},c=b||{loading:false},e;if(d.queue===undefined)d.queue=[];if(typeof window.swfobject!=="undefined"&&typeof window.swfobject.embedSWF!=="undefined")c.loading=false;else if(d.queue.length>0){if(c.loading===false){b=document.createElement("script");b.type="text/javascript";b.async=true;b.src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js";(document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]).appendChild(b); c.loading=true}e=setTimeout(function(){f(c)},50)}if(c.loading===false&&d.queue.length>0)for(b=0;b<d.queue.length;b++){var a=d.queue[b];if(!a.loaded){a.loaded="true";swfobject.embedSWF(a.url,a.element,a.width,a.height,a.version,a.expressInstall,a.flashvars,a.params,a.attributes)}}if(c.loading===false&&typeof window.jQuery!=="undefined")e=setTimeout(function(){jQuery(document).one("ajaxStart",function(){e=setTimeout(function(){f(c)},100)})},2E3)})();





//master.js

jQuery(document).ready(function($) {

  

  jQuery(".small_calendar .months.nav").find(".next a,.prev a").live("click",function(e) {

    e.preventDefault();

    var calTypeVal = escape($(this).closest(".small_calendar").find(".cal_type").val());

    jQuery('.small_calendar').load(jQuery(this).attr("href").replace("master_intranett","ajaxnavigatedmonth&caltypeval="+calTypeVal),function() {

  addPrevDayClass();

  var classToWrite = $(".cal_type").val().toLowerCase().replace(" ","").substring(8,35);

  var existingClass = $(".cal_type").closest(".small_calendar").find(".calendar").attr("class");

  $(".cal_type").closest(".small_calendar").find(".calendar").attr("class",existingClass+" "+classToWrite+"");

  });

});

  

  // writes class to table

  

  jQuery(".cal_type").live("change",function() {

    var classToWrite = $(this).val().toLowerCase().replace(" ","").substring(8,35);

    var $calendar = $(this).closest(".small_calendar").find(".calendar");

    if($calendar.attr("class").indexOf("inThePast") != -1)

      classToWrite += " inThePast";

    $calendar.attr("class","calendar "+classToWrite+"");

  });



   // UTILITY

   var base = ips.system.base; //cache as local variable





  //-----------------------

  //  Article carusel, using nivoslider

  //---------------------

  var $carusel = $('ul.article-carusel');

  if ($carusel.size()) {

    $carusel.after('<ol class="nav_carusel"></ol>').cycle({ 

        speed:  'slow', 

        timeout: 6000, 

        pager:  '.nav_carusel',

        pause:   1

    });

    //$carusel.parent().delegate(".closer", "click", function(){

    //  $carusel.parent().toggleClass("expanded");

    //});

  }



   // Searchform interaction

   var $searchForm = $("#searchForm"), //CACHE

       $query = $searchForm.find(".query"),

       $label = $searchForm.find("label");

   if ($query.val() !== "") {$label.hide();}

   $searchForm.submit(function(){

   if ($query.val() === "") {return false;}

   });

   $query.focus(function(){$label.hide();}).blur(function(){

     if ($(this).val() === "") {$label.show();}

   });

   $searchForm.find("label").click(function(){

    $query.focus();

   }); 

  // EVENT DELEGATION - Not touching dom until click

  $(".externalLink").live("click", function(){

    $(this).attr("target", "_blank");

  });





  // IPS FORM validation by sveinung@idium.no March 2010

  $("body").delegate("form", "submit", function(e){

    var $this = $(this), formid = $this.attr("id")+"", errors = [];

    // Start validation object

    //fix broken objects

    var ips = window.ips = window.ips ||{};

    ips.validate = ips.validate ||{};

    ips.validate[formid] = ips.validate[formid] ||{};

    //end fix broken objects



  // Reset, and FIND/QUERY viable <li> tags. Must be typical <li> with input. If different, change next find().

    $this.find("span.error").remove().end().find("li:not(.submit,.form_labelfield)").removeClass("error")

    // START each - > iterate li`s

    .each(function(i){

    // Needed vars and Cache selectors for convenience and "speed"

      var $li = $(this), $nextLi = $li.next(), $prevLi = $li.prev(), $field = $li.find("input,textarea,select").eq(0), fid = $field.attr("id"), fieldval = $field.val(), errorObj = {"id":fid,"$elem":$li,"message":""};

      // Utilty function for checking regex values

      var checkFunc = function(regexObj, thisval, message, errorObj){

      if (!regexObj.test(thisval)) {

       errorObj.message = message;

      } else {

       errorObj.valid = true; // used to make this rule more important than classes

      }

      return errorObj;  

      };

      // Iterating and validation all regexes in the general object

      $.each(ips.validate.general, function(property){

      if ($li.hasClass(property) && this.regex !== undefined ) {

        errorObj = checkFunc(this.regex, fieldval, this.message, errorObj);

      }

      });

      // Check for validation object

    if ( ips.validate[formid][fid] !== undefined && ips.validate[formid][fid].regex !== undefined ) {

     var fieldvalObj = ips.validate[formid][fid],

           errorMgs = fieldvalObj.message !== undefined ?  fieldvalObj.message : ips.strings.notvalid;

       errorObj = checkFunc(new RegExp(fieldvalObj.regex), fieldval, errorMgs, errorObj);

      } else {

      //fix missing objects

      ips.validate[formid][fid] = {};

      }

      if ( $li.hasClass("form_password") && errorObj.message === ''){

        errorObj = checkFunc(ips.validate.general.password.regex, fieldval, ips.validate.general.password.message, errorObj);

        if (errorObj.message === "" && fieldval !== $li.find(".confirm").val()) {

        errorObj.id = $li.find(".confirm").attr("id");

        errorObj.message = ips.validate.general.password.message;

        }

      }

      // Check username if form has class .loggedout -> Forms get resubmitted if error from server

      if ( $this.hasClass("loggedout") && $li.hasClass("username") && !(errorObj.valid)){

        var searchedUsername = $.data($field[0],"username"), // get "cacge"

            availFromPrevSubmit = $.data($field[0],"avail"); // get "cache"

        $.data($field[0],"username",fieldval); // write "cache"

        // Check if new desired username isnt equal to previous ones or if no username has been checked

        if ((fieldval !== searchedUsername) || (availFromPrevSubmit === null) ) { 

        // Async - check param, then set value on elem and resubmit form

        $.get(ips.system.base + "?module=Users&amp;action=Ajax.isUsernameAvailable&amp;username="+fieldval, function(data){

         $.data($field[0],"avail",data);

         // 'false' is serverresponse in plain text

         if (data == 'false') {

           setTimeout(function(){$this.submit();},100);

         }

        });

        } else {

        // check if this is checked and username is not avail === false

        if (availFromPrevSubmit == "false") {

          errorObj.message = ips.strings.usernamenotavail;  

        }  

        }

      }

      // check if .required and 

      if (fieldval === '' &&  $li.hasClass("required")) {

        // If not already a error - add a error message

      if (errorObj.message === '') {

          errorObj.message = ips.strings.cannotbeempty;

     }

      } else if ($li.hasClass("required") && errorObj.message === '') {

        // if checkbox is required

        if ($field.is("input[type=checkbox]") && $field.attr("checked") === false) {

          errorObj.message = ips.validate[formid][fid].message ||ips.strings.mustbechecked;

        }

      }

      // Todo, ADD : requiredIf - (e.g. email, checkbox )

      // Check for customclasses 'isequaltonext' and 'isequaltoprev' - > is in lowercase bacause of ips:classify

    if ($li.hasClass('isequaltonext')||$nextLi.hasClass('isequaltoprev')) {

        if (fieldval !== $nextLi.find("input").val()) {

        errorObj.message = $li.find("label").text() + ips.strings.mustbeequalto + $nextLi.find("label").text();

        }

      }  else if ($li.hasClass('isequaltoprev')||$prevLi.hasClass('isequaltonext')) {

        if (fieldval !== $prevLi.find("input").val()) {

        errorObj.message = $li.find("label").text() +  ips.strings.mustbeequalto + $prevLi.find("label").text();

        }

      }

      // Field is not required, NO error-msg should be generated

      if (fieldval === '' && !($li.hasClass("required"))) {

      errorObj.message = ''; 

      }

      // Push this errorObj if there is a message defined

      if ( errorObj.message !== undefined && errorObj.message !== '' ) {

      errors.push(errorObj);

      }

    }); //END each li`s



    if ( ips.system.parameters.debug ) {

      console.log(errors);

    }  // Process errors if there is any

    if ( errors.length > 0 ) {

      $( errors ).each(function(i){

        var $errorField = this.$elem.addClass("error").find("input,textarea,select").eq(0);

        if (i === 0) {;$errorField.focus();}

        $("<span class='error'>" + this.message + "</span>").insertAfter( $errorField );  

      });

      return false;

    // default action of the event will not be triggered.

    //e.preventDefault();

    // Keeps the rest of the handlers from being executed.

      //e.stopImmediatePropagation();

    }

  });

  // Possible to click the errors away

  $("span.error").live("click", function(){$(this).fadeOut();}); 

//FORM END

// this is a small helper extension i stole from

// http://www.texotela.co.uk/code/jquery/reverse/

// it merely reverses the order of a jQuery set.

$.fn.reverse = function() {

    return this.pushStack(this.get().reverse(), arguments);

};


}); // eof document ready ?

$(window).load(function() {
  addPrevDayClass();
});

jQuery(document).ready(function() {

  //Tacky custom form handling
  if($("form li.e81 select").size() > 0 && $("form li.e86 input").size() > 0) {
    $("form li.e86 input").val($("form li.e81 select").find("option:selected").text());

    $("form li.e81 select").unbind().bind("change", function() {
      $("form li.e86 input").val($(this).find("option:selected").text());
    });
  }

  if($("form li.e56 select").size() > 0 && $("form li.e74 input").size() > 0) {
    $("form li.e74 input").val($("form li.e56 select").find("option:selected").text());

    $("form li.e56 select").unbind().bind("change", function() {
      $("form li.e74 input").val($(this).find("option:selected").text());
    });
  }

  //Generate id before posting form
  $("form.groovy").unbind().bind("submit", function(e) {
    $.ajax({
      url: ips.system.base + "scripts/nextPubFormId.groovy",
      cache: false,
      async: false,
      success: function(data) {
        ($("form li.e87 input").size() > 0) ? $("form li.e87 input").val(data): "";
        ($("form li.e88 input").size() > 0) ? $("form li.e88 input").val(data): "";
      }
    });
  });

  var $chartTable = jQuery(".gChartsContainer").find("table");
  if($chartTable.length) {
    numberOfColumnsToShow = ips.currentFolderAttributes.numberOfColumnsToShow;
    navigateLength = ips.currentFolderAttributes.navigateLength; // number of columns to move each time prev/next is clicked
    var numberOfGraphs = 0;
    jQuery(".gChartsContainer table").each(function() {
      $(this).attr("currentpage","0");
      $(this).after("<ul><li><a class='prev' onClick='renderPrevGraphPage("+numberOfGraphs+");return false' href='#'>&gt;</a><li><a href='#' onClick='renderNextGraphPage("+numberOfGraphs+");return false' class='next'>&lt;</a></li></li>");
      numberOfGraphs++;
    });
    for(var x=0;x<numberOfGraphs;x++) {
      renderGraphPage(0,x);
    }
   var colors = ['#0085C0','#FFFFFF','#1A8C20','#F51D1F','#EE8B3F','#0303FF','#615D52'];
   var legendHTML = "";
   jQuery(".gChartsContainer tbody:first tr th").each(function(index) {
     legendHTML += "<li><div style='background-color:"+colors[index]+"' class='rectangle'></div><span>"+jQuery(this).text()+"</span></li>";
   });
   jQuery(".gChartsContainer .legend").append(legendHTML);

  }
});

var numberOfColumnsToShow;
var navigateLength;
var renderGraphPage = function(page,graphIndex) {
  var $chartTable = jQuery(".gChartsContainer").find("table:eq("+graphIndex+")");
  var numberOfPages = (($chartTable.find("thead th").length)-1) / navigateLength;
  var lastColumnToShowIndex = ($chartTable.find("th:last-child").index())-(page*navigateLength);
  var firstColumnToShowIndex = lastColumnToShowIndex-(numberOfColumnsToShow-1);
  $chartTable.find("th:not(:first-child),td").each(function() {
    var currentColumnIndex = jQuery(this).index();
      jQuery(this).attr("datahidden","true");
    if 
      (currentColumnIndex >= firstColumnToShowIndex &&
       currentColumnIndex <= lastColumnToShowIndex
      ) {
      jQuery(this).attr("datahidden","false");
    }
  });
  /*
  $chartTable.gvChart({
    chartType: 'LineChart',
    title: $(this).find('caption').text()
  });*/
  var imageSrc= "http://chart.googleapis.com/chart?cht=lc&chs=" + 
    "270x185" +
    "&chd=t:";
  $chartTable.find("tr").each(function() { // for each Mesta division 
    $(this).find("td[datahidden='false']").each(function() {
      // for each date
      imageSrc += parseInt($(this).text()).toString();
      imageSrc += ",";
    });
  if($(this).find("td[datahidden='false']").length && !$(this).is(":last-child")) {
    imageSrc = imageSrc.slice(0,-1);
    imageSrc += "|";
  }
  if($(this).is(":last-child")) {
    imageSrc = imageSrc.slice(0,-1);
  }
  }); // ##0085C0','#FFFFFF','#1A8C20','#F51D1F','#EE8B3F','#0303FF','#615D52
  imageSrc += '&chco=0085C0,FFFFFF,1A8C20,F51D1F,EE8B3F,0303FF,615D52&chts=000000,20&chxt=x,y,r&chxl=0:'
  $chartTable.find("thead th[datahidden='false']").each(function() {
    imageSrc  += "|" + $(this).text().replace(" ","");
  });
  imageSrc += '&chxs=0,000000,10,0|1,000000,10,0|2,000000,10,0&chf=bg,s,ffffff|c,s,b5d6e4&chds=a';
  imageSrc = imageSrc.replace("&chd=t","&chd=t:");
  var imageHTML = '<img src="'+imageSrc+'" class="chartIMG" alt="" />'
  $chartTable.hide();
  $("img.graph"+graphIndex).remove();
  $chartTable.before(imageHTML);
  $("p.loading").hide();
  $chartTable.prev().addClass("graph"+graphIndex);
  $chartTable.next().addClass("graphul"+graphIndex);
}
renderNextGraphPage = function(graphIndex) {
  var $chartTable = jQuery(".gChartsContainer").find("table:eq("+graphIndex+")");
  var currentPage = parseInt($chartTable.attr("currentpage"));
  var numberOfPages = (($chartTable.find("thead th").length)-1) / navigateLength;
  if(numberOfPages > currentPage+(numberOfColumnsToShow/navigateLength)) {
    renderGraphPage(currentPage+1,graphIndex);
    currentPage += 1;
    $chartTable.attr("currentpage",currentPage);
  }
};
renderPrevGraphPage = function(graphIndex) {
  var $chartTable = jQuery(".gChartsContainer").find("table:eq("+graphIndex+")");
  var currentPage = parseInt($chartTable.attr("currentpage"));
  var numberOfPages = (($chartTable.find("thead th").length)-1) / navigateLength;
  if(currentPage-1 > -1) {
    renderGraphPage(currentPage-1,graphIndex);
    currentPage -= 1;
    $chartTable.attr("currentpage",currentPage);
  }
};
/* eof charts */
var addPrevDayClass = function() {
  if($(".today").length) { // for calendar
    $("li.today").prevAll("li.day").addClass("inthepast");
  }
}
