// IE misses trim functionality
if(typeof String.prototype.trim !== 'function') {
  String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
  }
}
    
// WEBKIT is not a decent browser
jQuery.extend({
    __stringPrototype: {
      decodeASCII: function(s){
        s = this.s(s);
        var output = "";
        
        if(s != null && s.length > 0){
          for (i=0; i < s.length;)
          {
            // holds each letter (2 digits)
            var letter = "";
            letter = s.charAt(i) + s.charAt(i+1)
        
            // build the real email address
        
            output += String.fromCharCode(parseInt(letter,16));
            i += 2;
          }
        } 
        
        return output;
      },
      
      s: function(s) {
        if (s === '' || s) { return s; }
        if (this.str === '' || this.str) { return this.str; }
        return this;
      }
    },
    string: function(str) {
      if (str === String.prototype) {
        jQuery.extend(String.prototype, jQuery.__stringPrototype);
      } else {
        return jQuery.extend({ str: str }, jQuery.__stringPrototype);
      }
    }
  });

$(function(){  
  var deobfuscateEmails = function(context){
    var nodes = context == null? $("a.js_emailLink"): $("a.js_emailLink", context);
    nodes.each(function(e){
      var email = $(this).attr('href').match(/mailto:(.*)/i);
      if(email.length > 0) email = email[1];
      else email = "";
      var fragments = email.split("%at%");
      
      if(fragments != null && fragments[0] != null && fragments[1] != null){
        var decEmail = fragments[0] + "@" + fragments[1].replace("|", ".");
        var href = "mailto:" + decEmail + "?subject=ICTP website enquiry";
    
        // here it does not work: on IE $(this).text(decEmail);  
        $(this).attr('href', href);
        $(this).attr('title', "send an e-mail to "+ decEmail);
        $(this).text(decEmail);     // abracadabra!
      }
    });  
  };
  
  /* deobfuscate Emails */
  deobfuscateEmails();  

  /* homepage functionalities */
  if(typeof isHomepage == 'boolean' && isHomepage == true){  
    
    // events scrollpane
    $('.events_home').jScrollPane();  
  }
  
  /* column exception fix */
  if(!$("#content").hasClass("js_dontfix")){
    $("#content").removeClass("three_columns");

    var columnsNumber = 1;
    var leftColExists = false;
    var rightColExists = false;
    if($("#left_column").length > 0){
      columnsNumber ++;
      leftColExists = true;
    }
    if($("#right_column").length > 0){
      columnsNumber ++;
      rightColExists = true;
    }

    switch(columnsNumber){
      case 1: $("#content").addClass("one_column"); break;
      case 2: 
        var cssclass;
        if(leftColExists)       cssclass = "two_columns_with_left";
        else if(rightColExists) cssclass = "two_columns_with_right";
        else                    cssclass = "two_columns";

        $("#content").addClass(cssclass);
      break;
      case 3: $("#content").addClass("three_columns"); break;
    }  
  }
  
  /* toggler definition */ 
  if(typeof $.toggler != 'undefined'){
    $.toggler({
      selector: ".toggler_filters_category",
      showText: "Show filter",
      hideText: "Close filter",
      effectTime: 500,
      hideByDefault: false
    });
    
    $.toggler({
      selector: ".toggler_quick_links",
      showText: "Show links",
      hideText: "Close links",
      useImage: true,
      imagePosition: "right",
      imageShown: "/images/arrow_up.png",
      imageHidden: "/images/arrow_bottom.png",    
      effectTime: 500
    }); 
    
    $.toggler({
      selector: ".toggler_programmes",
      useImage: true,
      imagePosition: "right",
      imageShown: "/images/arrow_red_up.gif",
      imageHidden: "/images/arrow_red_down.gif",
      updateTriggerNodeValue: true,
      showText: "Show details",
      hideText: "Close details",
      effectTime: 200,
      scrollToDestination: true
    });      
  }
  
  $(".toggler_programmes_box").each(function(){
    $(this).css({ cursor: 'pointer' });
  });

  /* scrollers definition */
  if(typeof $.scroller != 'undefined'){
    $.scroller({
      selectorId: "scrollerPictures-",
      disabledNavClass: "last",
      fixBoxesHeight: true
    });    
  
    $.scroller({
      selectorId: "scrollerFigures-",
      disabledNavClass: "last",
      fixBoxesHeight: true
    });
  
    $.scroller({
      selectorId: "scrollerQuotes-",
      disabledNavClass: "last",
      fixBoxesHeight: true
    });
    
    $.scroller({
      selectorId: "scrollerNews-",
      disabledNavClass: "last",
      fixBoxesHeight: true
    });  
    
    $.scroller({
      selectorId: "scrollerVideos-",
      disabledNavClass: "last",
      fixBoxesHeight: true
    });
  }
  
  /* pictures lightbox */  
  if(typeof $.fn.lightBox != 'undefined'){
    $("a.js_lightbox").lightBox({
      fixedNavigation: true,
      imageLoading:   '/images/jquery.lightbox/lightbox-ico-loading.gif',
      imageBtnPrev:   '/images/jquery.lightbox/lightbox-btn-prev.gif',      
      imageBtnNext:   '/images/jquery.lightbox/lightbox-btn-next.gif',      
      imageBtnClose:   '/images/jquery.lightbox/lightbox-btn-close.gif',       
      imageBlank:     '/images/jquery.lightbox/lightbox-blank.gif'              
    });
  }
  
  /* videos dialog */
  $("a.js_videoDialog").click(function(e){
    var vobj = $("#widget_video_object_" + $(this).attr('rel'));
    vobj.css({ textAlign: 'center' });
    vobj.dialog({
      minWidth: 550,
      minHeight: 440,
      modal: true
    });
  });

  
  /* widget navigation positioning */
  $(window).load(function(){
    $("div.widget a.btn").each(function(i, el){
      $(el).css({ "marginTop": ($(el).parent().outerHeight() / 2) -28 });
    }); 
    
    $(".widget_content_wrapper").css({
      'height': "100%"
    }); 
    
    /* image in content width fix */
    $(".img_in_content").each(function(){
      var img = $(".img_div img", $(this));
  
      if(img.length > 0){
  
        var imgW = img.outerWidth();
        $(this).width(imgW + 12);
      }
    });    
  });     
  
  /* clickable boxes */  
  $(".clickable_box").each(function(){
    var linkEl = $(".clickable_box_link", $(this));
    
    if(linkEl.length > 0){
      var link = linkEl.attr("href");
      
      if(linkEl != null && linkEl.length > 0){
        $(this).css({ "cursor": "pointer" });
        $(this).click(function(){
          window.location.href = link;
        })
      }
    }
  });
          
  /* search form methods */
  if(typeof searchEngineUrl == 'string'){
    var searchSuccess = function(data, textStatus, XMLHttpRequest){
      $("#js_searchResult").html(data);
      $("#js_searchResult").slideDown(500);
      
      // add events for paginator
      $(".js_searchPageLink").each(function(){        
        $(this).click(function(){
          var page = parseInt($(this).attr('rel'));          
          if(page == 'NaN') page = 0;    
  
          var searchData = composeSearchData(page);
          
          if(searchData){
            $.ajax({
              async: true,
              cache: false,
              data: searchData,
              dataType: "html",
              context: document.body,
              type: "post",
              url: searchEngineUrl,
              success: searchSuccess,
              error: function(XMLHttpRequest, textStatus, errorThrown){
                $("#js_searchResult").html(searchErrorText);  
                $("#js_searchResult").slideDown(500);
              }
            });              
          }
        });
      });  
    };
          
    var composeSearchData = function(page){
      var searchString = $("#js_searchString").val().trim();
      var searchQuery = {};
      if(searchString.length > 0) searchQuery["search"] = searchString;
      if(parseInt(page) != 'NaN') searchQuery["page"] = page;
      var resultsAsLinks = $("#js_searchResultsAsLinks").val();
      if(resultsAsLinks != null && parseInt(resultsAsLinks) == 1) searchQuery["resultsAsLinks"] = true;
  
      return searchQuery;  
    }
        
  
  
    /* search form  */
    $("#js_searchString").keydown(function(e){
      if(e.keyCode == 13) $("#js_searchButton").click();
    });
        
    $("#js_searchButton").click(function(){
        if($("#js_searchString").val() == null || $("#js_searchString").val().length < 3){
          alert("Search string must contain at least 3 characters.");
          return false;
        }
        
        if($(this).hasClass('js_redir')){
          window.location.href = searchPageUrl + "?search=" + $("#js_searchString").val();
          return false;
        }else{
          $("#js_searchResult").html("<img src='/images/ajaxloading.gif' alt='Loading...' title='Loading' border='0'/>");
          
          var searchData = composeSearchData(0);
          
          if(searchData){    
            $.ajax({
              async: true,
              cache: false,
              data: searchData,
              dataType: "html",
              context: document.body,
              type: "post",
              url: searchEngineUrl,
              success: searchSuccess,
              error: function(XMLHttpRequest, textStatus, errorThrown){
                $("#js_searchResult").html("An error occurred during search request.");  
                $("#js_searchResult").slideDown(500);
              }
            });
          }      
        }
    });
      
    $("#js_searchString").focusin(function(){
       if($(this).val().toLowerCase() == 'search...') $(this).val("");
    });  
      
    $("#js_searchString").focusout(function(){
       if($(this).val().length == 0) $(this).val("search...");
    });      
      
    // auto submit if search query has been passed by global search form
    if($("#js_searchString").val() != null && $("#js_searchString").val().length > 0 && !$("#js_searchButton").hasClass("js_redir")){
      $("#js_searchButton").click();
    }
  }
});
    
// fixes webkit dialog positioning    
$(window).load(function(){
  if($.browser.webkit == true){

    $(".js_videoDialog").click(function(){
      $(".ui-dialog").each(function(){
        $(this).css({left: ($("body").outerWidth() - $(this).outerWidth()) / 2 });
      });
      return true;
    });
  }   
});       

