function startsWith(str, sub) {
  return str.substr(0, sub.length) == sub;
}

// Takes a comma-separated list of values and returns true if one of the values is equal to text.
function csvSearch(csv, text) {
  // Hacky, but avoids the call to split()
  var extCsv = ',' + csv + ',';
  var extText = ',' + text + ',';
  return extCsv.indexOf(extText) != -1;
}

function debug(obj) {
  var s = '';
  for (prop in obj) {
    if (obj[prop] && !startsWith(obj[prop].toString(), 'function ')) {
      s += prop + ':' + obj[prop] + '\n';
    }
  }
  alert(s);
}

function logConsole(s) {
  if (typeof console != "undefined" && typeof console.debug != "undefined") {
    console.log(s);
  }
}

function sprintf() {
  var s = arguments[0];
  for (var i = 1; i < arguments.length; i++) {
    s = s.replace(/%s/, arguments[i]);
  }
  return s;
}

function confirmDeleteAttributeValue(value) {
  return confirm(sprintf(LL.deleteAttributeValue, value));
}

function confirmDeleteAttribute(value) {
  return confirm(sprintf(LL.deleteAttribute, value));
}

function confirmArchiveEstablishment(value) {
  return confirm(sprintf(LL.archiveEstablishment, value));
}

function confirmApproveEstablishment(value) {
  return confirm(sprintf(LL.approveEstablishment, value));
}

function confirmDeleteZone(value) {
  return confirm(sprintf(LL.deleteZone, value));
}

function confirmArchiveImage() {
  return confirm(LL.archiveImage);
}

function confirmApproveImage() {
  return confirm(LL.approveImage);
}

function confirmArchiveComment() {
  return confirm(LL.archiveComment);
}

function confirmApproveComment() {
  return confirm(LL.approveComment);
}

function confirmApproveEditorial() {
  return confirm(LL.approveEditorial);
}

function confirmArchiveUser(userName) {
  return confirm(sprintf(LL.archiveUser, userName));
}

function warnCommentNotEditable() {
  alert(LL.warnCommentNotEditable);
  return false;
}

function adminHelpWindow(anchorName) {
  var url = 'html/admin_help.html';
  if (anchorName) {
    url += '#' + anchorName;
  }
  window.open(url, 'adminHelpWindow',
              'menubar=no,scrollbars=yes,toolbar=no,width=600,height=400');
  return false;
}

function imageTermsWindow() {
  window.open('html/imageTerms.html', 'imageTermsWindow', 'menubar=no,scrollbars=yes,toolbar=no,width=600,height=400');
  return false;
}

function toggleChronicleVisibility() {
  toggleElementVisibility('chronicle');
  return false;
}

function toggleStaticPageEdit() {
  toggleElementVisibility('staticPageEditor');
  return false;
}

function toggleAddImageVisibility() {
  toggleElementVisibility('addImageContainer');
  return false;
}

function toggleElementVisibility(elemId) {
  var elem = document.getElementById(elemId);
  if (elem.style.display == 'block') {
    elem.style.display = 'none';
  } else {
    elem.style.display = 'block';
  }
}

function editNameChanged(input) {
  $.get("ajax/estSearch.php",
    { name: input.value },

    function(data){
      var div = document.getElementById('nameConflicts');
      div.innerHTML = data;
      div.style.display = data ? 'block' : 'none';
    }
  );
}

function resendEmailClicked(link) {
  $.get("ajax/resendEmailToken.php",
    { /* no GET arguments */ },

    function(data){
      var divBefore = document.getElementById('resendBefore');
      var divAfter = document.getElementById('resendAfter');
      divBefore.style.display = 'none';
      divAfter.style.display = 'block';
      if (data == '1') {
        divAfter.innerHTML = LL.resendEmailOk;
      } else {
        divAfter.innerHTML = LL.resendEmailError;
        divAfter.style.borderColor = 'red';
      }
    }
  );
  return false;
}

/**
 * Assumes that the form contains a file input names "contents" and a hidden limit field named maxSize.
 * If mandatory is set and no file was chosen, the function will return false.
 * Note that this is just a convenience method for the user.
 * Ill-intended users can bypass this and upload huge files.
 **/
function checkFileSanity(form, mandatory) {
  var node = form.contents;
  var limit = form.maxSize ? form.maxSize.value : null;

  // This can only happen if the form is missing the required fields.
  if (!node || !limit) {
    alert(LL.uploadFormCorrupted);
    return false;
  }

  // Check that a file exists if it is mandatory.
  if (!node.files || node.files.length != 1) {
    if (mandatory) {
      alert(LL.uploadMustSelectFile);
      return false;
    } else {
      // No file was submitted, but that's ok
      return true;
    }
  }

  // Check file extension
  var name = node.files[0].fileName;
  var ext = name.substr(name.lastIndexOf('.')).toLowerCase();
  if (ext != '.jpeg' && ext != '.jpg' && ext != '.gif' && ext != '.png') {
    alert(LL.uploadWrongFormat);
    return false;
  }

  // Check file size
  var fileSize = node.files[0].fileSize;
  if (fileSize > limit) {
    alert(sprintf(LL.uploadSizeLimit, limit));
    return false;
  }
  
  return true;
}

/* Autocomplete */
function initAutocomplete(divId, namesList, callbackF, resetGlobal) {
  var box = $(divId);
  box.autocompleteArray(
     namesList,
     {
       delay:30,
       minChars:1,
       matchSubset:1,
       autoFill: false,
       maxItemsToShow:5,
       callback: acCallback,
       subCallbackF: callbackF,
       resetF: resetGlobal
     }
  );
  if (callbackF) { //do something else instead of regular submit
    box.parent("form").submit( function(){
      acCallback(box,callbackF,resetGlobal);
      return false;
    });
  }
}
function acCallback(box, callbackF, resetGlobal) {
    var value = box.val();
    if(resetGlobal) {resetGlobal();} //reset filters first
    box.val(value);
    if(callbackF) {callbackF(value);}
}

/* Front page slider */
function initSlider() {
  $(window).bind("load", function() {
    $("div#slider1").codaSlider()
  });
  return false;
}

/* Front page accordion */
function initAccordion() {
  $('#myAccordion').accordion({
    header: '.acc',
    autoHeight: false
  });
			
  $("#listTabs > ul").tabs({ 
      fx: { opacity: 'toggle',
            duration: 'fast'
          } 
  });
  return false;
}

/* Star ratings */
function initStars(divId, friendIds) {
  refreshDynamicRatings(divId+' .hover-star',friendIds);
}
function refreshDynamicRatings(starsSelector, friendIds) {
  $(starsSelector).rating({
    /*focus: function(value, link){
      var tip = $(this).parent().next();
      tip[0].innerHTML = link.title;
    },*/
    focus: function($el, val){
      var tip = $el.parent().next();
      tip[0].innerHTML = val;
    },
    /*blur: function(value, link){
      var tip = $(this).parent().next();
      tip.html(tip[0].data);
    },*/
    blur: function($el, val){
      var tip = $el.parent().next();
      tip.html(tip[0].data);
    },
    /*setDis: function(value, link, el){
      var tip = $(this).parent().next();
      if(friendStarsSelector) {
        var ftip = $(friendStarsSelector + " form[name="+this.form.name+"] .hoverDisplay");
      }
      if(!$(el).is('.cancel')) {
        tip[0].data = value;
        if(ftip) ftip[0].data = value; 
      } else {
        tip[0].data = '';
        if(ftip) ftip[0].data = ''; 
      };
      tip.html(tip[0].data);
      if(ftip) {ftip.html(ftip[0].data);refreshSetRating(ftip.parent());} 
    },*/ 
    setDis: function($el,val) {
      var form = $el.parents('form')[0];
      var tip, data;
      if($el.is('.cancel')) {
        tip = $el.siblings('.hoverDisplay');
        data = '';
        tip[0].data = '';
        if(ftip) ftip[0].data = ''; 
      } else {
        tip = $el.parent().next();
        data = val;
        if(ftip) ftip[0].data = val; 
      };
      tip[0].data = data;
      tip.text(data);
      
      // update friends
      if (!friendIds) return false;
      for (var i = 0; i<friendIds.length; i++) {
        friendStarsSelector = friendIds[i];
        var ftip = $(friendStarsSelector + " form[name="+form.name+"] .hoverDisplay");
        if(ftip) { 
          ftip[0].data=data; 
          ftip.html(data); 
          refreshSetRating(ftip.parent());
        } 
      }
    }, 
    /*callback: function(value, link){
      saveRating(this.form.id,value);
    }*/
    callback: function($el, val) {
      var form = $el.parents('form')[0];
      saveRating(form.id, val);
    }
  });
}

function parseDecimal(num) {
  var parts = num.split(',');
  var val = parseInt(parts[0]) + parseFloat(parts[1]?parts[1]/10:0); 
  return val;
}

function refreshSetRatings() {
  //console.log("refresh stars");
  $(".rating").each( function() {
    refreshSetRating($(this));
  });
}

function refreshSetRating(robj) {
  var tip = robj.find(".hoverDisplay");
  var val = parseDecimal(tip.text());
  val = isNaN(val) ? 0 : val; // if no value set in DOM - reset to 0
  var bgr = robj.find(".bgRating");
  bgr.width( val*10+ "%" );
  tip[0].data = val;
}	

function saveRating(formName, value) {
  var parts = formName.split('-');
  var estId = parts[1];
  var ratingType = parts[2];
  var ajaxMsgDiv = $('#'+formName).parent().parent().find(".ajaxMsg");
  $.get("./ajax/saveRating.php",
    { estId: estId, type: ratingType, value: value},

    function(data){
      showRatingConfirmation(ajaxMsgDiv, value);
    }
  );
}


/*****************/
/* User comments */
function initComments() { 
    loadCommentsAjax("#theComments", placeId);
    initAddCommentEvents('#linkAddReview', '#newReview', '#theComments', placeId);
    initAddCommentEvents('none', '#editReview', '#theComments', placeId);
    initStars('#commentStars',['#infoStars','#editStars']);
    initStars('#editStars',['#infoStars','#commentStars']);
    refreshSetRatings(); //stars that are set and don't change
}

// Redraw table 
function refreshSortableDisplay(divId){
  $(divId).trigger("appendCache");
}

function loadCommentsAjax(divId, estId) {
  var script = "ajax/commentList.php?id="+estId;
  //load sortable comments
  $(divId).tablesorter({
        getData: script, 
        outDivId: divId, 
        itemHeadClass: "sortHead", 
        callbackDisplay: refreshCommentsListEvents,         
        ajaxCallback: refreshCommAjaxReady,         
        //headers:{0:{firstSort:"desc"}, 1:{firstSort:"desc"}}
        headers:{0:{firstSort:"desc"}}
  }).tablesorterPager({
        container: $("#pager"), 
        size: 5, 
        positionFixed: false, 
        pagesContainer: $("#pgs"), 
        extraPages: 2
  });
  $("#loadIndicator").fadeIn("slow");
}

// refresh comments display after each ajax load
function refreshCommAjaxReady(divId) {
  refreshSortableDisplay(divId);
  $("#loadIndicator").hide();
}

// refresh comments events after each change in the page (i.e. sort, next page, etc...)
function refreshCommentsListEvents() {
  refreshSetRatings();
  initFlagOffensive('.linkReportOffensive');
  initDelComment('.linkDelMyComment','#theComments');
  initVoteComment('.img_vote_up', 1);
  initVoteComment('.img_vote_down', -1);
  initEditCommentEvents('.linkEditMyComment', '.own', '#editReview');
}

function initAddCommentEvents(linkId, divId, table, estId) {
  var addCommLink = $(linkId);
  var addCommDiv = $(divId);
  //add comment link event
  if (addCommLink) {
    addCommLink.click(function() {
      addCommDiv.show();
    });
  }
  //cancel comment event
  addCommDiv.find(".inplace_cancel").click(function() {
    $(this).parents(divId).hide();
  });
  // ajax comment submission
  var form = addCommDiv.find(".wrapperReview form");
  form.unbind('submit');
  form.submit(function() {
    var thisForm = $(this);
    var cTitle = thisForm.find(":input[name='title']").val();
    var cCont = thisForm.find(":input[name='contents']").val();
    var cId = thisForm.find(".commentId").val();
    var ajx = thisForm.find(".ajaxSend");
    thisForm.find(".formButtons :input").hide();
    ajx.show();
    $.get("ajax/saveComment.php", { establishmentId: estId, commentId: cId, title: cTitle, contents: cCont },
        function(data){
          if (data=="ok") {
            $(table).trigger("update"); 
            ajx.hide();
            addCommDiv.hide();
            thisForm.find(".formButtons :input").show();
            //addCommLink.text("Cronica a fost trimisa");
            //addCommLink.fadeOut(1000);
          } else { 
            //error
            ajx.hide();
            thisForm.find(".formButtons :input").show();
          }
        }
    );
    return false;
  });
}

function initEditCommentEvents(linkId, divId, templateId) {
  var addCommLink = $(linkId);
  addCommLink.unbind('click');
  addCommLink.click(function() {
    //logConsole("click event add");
    var addCommDiv  = $(this).parents(divId);
    var addCommTemp = $(templateId).clone(true); //"true" needed to copy also the form events
    addCommDiv.after(addCommTemp).hide();
    addCommTemp.find("textarea").val(addCommDiv.find(".comment_body").text());
    addCommTemp.find("input.commentId").val(addCommDiv.find(".headline>.header_none").text());
    addCommTemp.find("input.headReviewText").val(addCommDiv.find(".headline>.header_left").text());
    addCommTemp.show();
	
	//add cancel events
    var cancelB = addCommTemp.find(".inplace_cancel");
    cancelB.unbind('click');
    cancelB.click(function() {
      //logConsole("click event cancel");
      addCommDiv.show();
      addCommTemp.remove();
    });
  });
}

function initFlagOffensive(linkId) {
  $(linkId).each( function () {
    var button = $(this); 
    button.unbind('click');
    var form = button.next("form");
    form.unbind('submit');
    var errs = form.find(".errorSel");
    var ajxl = form.next(".ajaxLoad");
    button.click(function() {
      form.toggle();
      errs.hide();
    });
    form.submit(function() {
      var cid = form.attr("name");
      var creason = form.find("option:selected").val();
      if (creason == "none") {
        errs.show();
        return false;
      } else {
        errs.hide();
      }
      form.find(":input").hide();
      ajxl.show();
      $.get("ajax/flagComment.php", { commentId: cid, reason: creason },
        function(data){
          ajxl.hide();
          button.unbind(); //remove all events after 1 submission
          button.addClass("inactive");
          if (data=="ok") {
            button.text(LL.flagCommentOk);
          } else {
            button.text(LL.flagCommentError);
          }
      });
      return false;
    });	
    form.find(":button").click( function() {
      form.hide();
      errs.hide();
    });
  });
}

function initDelComment(linkId,table) {
  $(linkId).each( function () {
    var button = $(this); 
    button.unbind('click');
    var form = button.next("form");
    form.unbind('submit');
    var errs = form.find(".errorSel");
    var ajxl = form.next(".ajaxLoad");
    button.click(function() {
      form.toggle();
      errs.hide();
    });
    form.submit(function() {
      var cid = form.attr("name");
      form.find(":input").hide();
      ajxl.show();
      $.get("ajax/deleteComment.php", { commentId: cid },
        function(data){
          ajxl.hide();
          button.addClass("inactive");
          if (data=="ok") {
          	button.unbind(); //remove all events after 1 submission
            //button.text("Sters");
			//button.parents('li.own').hide(); // hide message if delete sucessful
            $(table).trigger("update"); 
          } else {
            button.text(LL.deleteCommentError);
          }
      });
      return false;
    });	
	// button to cancel action ("Nu")
    form.find(":button").click( function() {
      form.hide();
      errs.hide();
    });
  });
}

function initVoteComment(linkId, mod) {
  $(linkId).each( function () {
    var button = $(this);
    button.unbind('click');
    var vc = button.siblings(".vote_count").find(".vcNum");
    var ajxl = button.siblings(".ajaxLoad");
    button.click(function() {
      if (!button.hasClass("inactive")) {
        ajxl.show();
        var cid = button.attr("name");
        var val = button.attr("value");
        $.get("./ajax/saveCommentRating.php", {'commentId':cid, 'value':val},
          function(data){
            ajxl.hide();
            button.siblings().removeClass("inactive").end().addClass("inactive");
            vc.text(data); //display new score from db
            updateVoteCommentTips(button.parent());
        });
      }
      return false;
    });
  });
}

function updateVoteCommentTips(votesDiv) {
  votesDiv.find("a").attr("title","");
  var idiv = votesDiv.find("a.inactive");
  var type = idiv.hasClass("img_vote_up") ? LL.alreadyVotedPositive : LL.alreadyVotedNegative;
  idiv.attr("title", type);
}


/* Stars v2 - not used for now
function initStars2() {
  $('#formFoodRateFix').stars({
      inputType: "select",
      captionEl: $('#hoverFoodFix'),
      split: 2,
      disabled: true
  });
  $('#formDecorRateFix').stars({
      inputType: "select",
      captionEl: $('#hoverDecorFix'),
      split: 2,
      disabled: true
  });
  $('#formServiciuRateFix').stars({
      inputType: "select",
      captionEl: $('#hoverServiciuFix'),
      split: 2,
      disabled: true
  });

  $('#formFoodRate').stars({
      inputType: "select",
      captionEl: $('#hoverFood'),
      cancelTitle: "Şterge",
      split: 2,
      callback: saveRating
  });
  $('#formDecorRate').stars({
      inputType: "select",
      captionEl: $('#hoverDecor'),
      cancelTitle: "Şterge",
      split: 2,
      callback: saveRating
  });
  $('#formServiciuRate').stars({
      inputType: "select",
      captionEl: $('#hoverServiciu'),
      cancelTitle: "Şterge",
      split: 2,
      callback: saveRating
  });
}

function saveRating(ui, type, value) {
  var formName = ui['options']['name'];
  var parts = formName.split('-');
  var estId = parts[1];
  var ratingType = parts[2];
  $.get("./ajax/saveRating.php",
         { estId: estId, type: ratingType, value: value},

         function(data) {
           showRatingConfirmation('#ajaxMsg', value);
         }
       );
}
*/

function showRatingConfirmation(elementId, value) {
  $(elementId).html(value ? sprintf(LL.voteSaved, value) : LL.voteDeleted).
    stop().css("opacity", 1).fadeIn(30); 
  setTimeout(function(){ $(elementId).fadeOut(1000) }, 2000); 
}


/* Init restaurant image gallery */
function initGallery() {
  $('#placeThumbsList').galleria({
      history   : true, // activates the history object for bookmarking, back-button etc.
      clickNext : true, // helper for making the image clickable
      insert    : '#main_image', // the containing selector for our main image
      onImage   : function(image,caption,thumb) { // let's add some image effects for demonstration purposes
          image.css('display','none').fadeIn(200);// fade in the image and caption
          var _li = thumb.parents('li');// fetch the thumbnail container
          _li.siblings().children('img.selected').fadeTo(1,0.5);// fade out inactive thumbnail
          thumb.fadeTo(70,1).addClass('selected');// fade in active thumbnail
          image.attr('title','Next image &gt;&gt;');// add a title for the clickable image
      },
      onThumb : function(thumb) { // thumbnail effects goes here
          var _li = thumb.parents('li');// fetch the thumbnail container
          var _fadeTo = _li.is('.active') ? '1' : '0.5';// if thumbnail is active, fade all the way.
          //thumb.css({display:'none',opacity:_fadeTo}).fadeIn(200); // fade in the thumbnail when finnished loading
          thumb.css({opacity:_fadeTo});
          // hover effects
          thumb.hover(
            function() { thumb.fadeTo(70,1); },
            function() { _li.not('.active').children('img').fadeTo(1,0.5); } // don't fade out if the parent is active
          );
      }
  });
  // report offensive images
  $("#imgOffender").click(function(){
      var offenderId = $("#main_image img").attr('id');
      $.get("./ajax/flagImage.php", { 'imgId': offenderId, 'reason': '(câmpul Motiv nu este încă implementat)'}, function(data) {
          //if(data="ok") { TODO: show user that image has been reported 
          alert(sprintf(LL.flagImageOk, offenderId));
        });
    });
  // archive images
  $("#imgArchive").click(function(){
      if (confirm(LL.archiveImage)) {
        var imgId = $("#main_image img").attr('id');
        $.get("./ajax/archiveImage.php", { 'imgId': imgId }, function(data) {
            if (data == 'ok') {
              // TODO: Update the image and image counts without reloading the page
              //window.location = '#tab_photos';
              //window.location.reload(true);
              $.galleria.removeImg($("#placeThumbsList li.active")); // remove active image
            } else {
              alert(LL.archiveImageError);
            }
          });
      }
    });
}


function initMap () { //for now placeMapData
  //place Map - do only once - no events
  var myMap = new mapObj("placeMap");
  myMap.refreshMapSingle(placeMapData);
}

function initMapGetLatLon (mapContainterId,mapDivId,latId,lonId,city) {
  var myMap = new mapObj(mapDivId);
  $("#"+mapContainterId).hide();//init state
  $("#mapLinkShow").click(function(){$("#"+mapContainterId).toggle()});
  $("#mapLinkClose").click(function(){$("#"+mapContainterId).hide()});
  myMap.refreshMapGetCoords(city,"#"+latId,"#"+lonId);
}
 
function initLogin() {
  // Show/hide lost password box events
  $("#sideLostPasswordBox").hide();
  $("#sideSentPassword").hide();
  $("#linkKnowPass").click(function() {
	  $("#sideLostPasswordBox").hide();
	  $("#sideLoginBox").show();
  });
  $("#linkLostPass").click(function() {
	  $("#sideLoginBox").hide();
	  $("#sideLostPasswordBox").show();
  }); 
}


/* Dynamically load js/css files */
/* ref: http://www.javascriptkit.com/javatutors/loadjavascriptcss.shtml */
var filesLoaded="" //list of files already loaded

function initPlugin(cssSrc,jsSrc,callback) {
  checkLoadJsCssFile(cssSrc,"css");
  if (jsSrc.length != 0) {
  	checkLoadJsCssFile(jsSrc,"js",callback);
  } else {
    if (callback) callback();
    return 1;
  }
}

function checkLoadJsCssFile(filename, filetype, callback){
  if (filename.length == 0) return 0;
  if (filesLoaded.indexOf("["+filename+"]")==-1){
    loadJsCssFile(filename, filetype, callback);
    filesLoaded+="["+filename+"]";
  } else {
    //alert("file "+filename+" already added!")
    return 0;
  }
  return 1;
}

function loadJsCssFile(filename, filetype, callback){
  if (filetype=="js"){ //if filename is a external JavaScript file
    $.getScript(filename, callback); //jQuery must have been loaded
  }
  else if (filetype=="css"){ //if filename is an external CSS file
    var fileref=document.createElement("link")
    fileref.setAttribute("rel", "stylesheet")
    fileref.setAttribute("type", "text/css")
    fileref.setAttribute("href", filename)
    if (typeof fileref!="undefined")
      document.getElementsByTagName("head")[0].appendChild(fileref)
  }
}


/*
function adisFunction() {
  $(document).ready(
    function()
    {
      $('.slider4').Slider(
        {
          accept : '.indicator',
          restricted: true,
          fractions : 20,
          opacity: 0.8,
          onSlide : function(procx, procy, x, y) {
            rating = parseInt(procx)/10;
            //document.getElementById('minFood').innerHTML = rating;
            var fslider = $(this).parent().parent().find(".min");
            //var rstring = ""+rating;
            fslider.text(rating);
            //fslider.html(rstring);
            fslider.css("left", procx+"%");
            //filterRowsByRange(rating,10,4);
              ttt();
          }
        }
        );
      $('.slider5').Slider(
        {
          accept : '.indicator',
          restricted: true,
          opacity: 0.8,
          onSlide : function(procx, procy, x, y) {
            //console.debug("procx=",procx,"; procy=",procy,"; x=",x,"; y=",y);
            rating = parseInt(procx)/10;
            //document.getElementById(this.SliderIteration == 0 ? 'minDecor' : 'maxDecor').innerHTML = rating;
            $(this).parent().parent().find(this.SliderIteration == 0 ? ".min" : ".max").text(rating);
            //filterRowsByRange(rating,10,6);
            ttt();
          },
          values: [
            [0,0],
            [50000,0]
          ]
        }
      );
      $('#sliderService').Slider(
        {
          accept : '.indicator',
          restricted: true,
          fractions : 20,
          opacity: 0.8,
          onSlide : function(procx, procy, x, y) {
            //console.debug("procx=",procx,"; procy=",procy,"; x=",x,"; y=",y);
            rating = parseInt(procx)/10;
            //document.getElementById('minService').innerHTML = rating;
            $(this).parent().parent().find(".min").text(rating);
            //filterRowsByRange(rating,10,5);
            ttt();
          }
        }
        );

      var $tabs = $("#results_tab_menu > ul").tabs( { fx: { opacity: 'toggle', duration: 'fast' } }, {selected: '#res_tab_1'} );

//      $("li").hover(
//          function () {
//            $(this).fadeIn("fast");
//          } 
//      );


      //toggle filter_body
      $(".filter_title").addClass("filter_open").end().next(".filter_content").show(); //initial state
      $(".filter_title").click(function(){
        $(this).next(".filter_content").slideToggle(500);
        $(this).toggleClass("filter_open");
        return false;
      });

      // toggle #filters shown 
      $(".filter .filter_content").each( function() {
        $(this).find(".filter_single:gt(2)").hide();  
      });
      $(".filter_show_singles").click(function() {
        $(this).parent().find(".filter_single:gt(2)").slideToggle();
        $(this).toggleClass("showLess");
        if ($(this).hasClass("showLess")) {
          $(this).find("p").text("Show less"); 
        } else {
          $(this).find("p").text("Show more"); 
        }
        return false;
      });
    }
  );


  function get_column_index(col_string) {
    var coln = $("#theTable th[@name="+col_string+"]")[0].cellIndex;
    return (coln+1);  
  }

  function filterRowsByString(filters, col_name) {
    var col_idx = get_column_index(col_name);
    var yyy = $("#theTable tbody tr td:nth-child("+col_idx+")");
    //var yyy = $("#theTable tbody tr td:nth-child(2)").parent();
    var zzz = $("#theTable tbody tr td:nth-child("+col_idx+")").each( function() {
      var row   = $(this).parent();
      var cltxt = this.textContent;
      filters.each( function() {
        var fltxt = this.value;
        if (fltxt.toLowerCase() == cltxt.toLowerCase()) { 
          row.addClass("invisibleRow");
          return false;
        }
      });
    });
  };

      
  function filterRowsByNumber(min, max, col_name) {
    var col_idx = get_column_index(col_name);
    $("#theTable tbody tr:not(:hidden) td:nth-child("+col_idx+")").each( function() {
      var row   = $(this).parent();
      var cltxt = parseFloat(this.textContent);
      if ((min > -1 && min > cltxt) || (max > -1 && max < cltxt)) { 
        row.addClass("invisibleRow");
      }
    });
  };


  function ttt() {
    // first set all columns to visible then filter them out based on filters
    $("#theTable tbody tr").removeClass("invisibleRow");
    //var fff = $("#filters input[@name=checkbox]").parent();
    //var ggg = $("#filters .filter_content");
    $("#f1 .filter_content").each( function() {
      col_name = $(this).attr("name");
      //var col_index = get_column_index(col_name);
      var filters = $(this).find("input[@name=checkbox]:not(:checked)");
      filterRowsByString(filters, col_name);
    });

    
    $("#filters .slider").each( function() {
      col_name = $(this).attr("name");
      var min  = parseFloat($(this).find(".min").size() ? $(this).find(".min").text() : -1);
      var max  = parseFloat($(this).find(".max").size() ? $(this).find(".max").text() : -1);
      filterRowsByNumber(min, max, col_name);
    });


    tablePaginater.init("theTable");

    var x = $("input[@name=checkbox]:not(:checked)");
    var y = $("input[@name=checkbox]:checked");
    var z = $("#f1 input[@name=checkbox]:not(:checked)");
    var z = $("#f1 :checkbox:not(:checked)");
    var t = $("#f1 input[@name=checkbox]:checked");
    var t = $("#f1 :checkbox:checked");
    var q = $("#f2 input[@name=checkbox]:not(:checked)");
    var w = $("#f2 input[@name=checkbox]:checked");
    var r = $("[@name=checkbox]");
  }
}
*/

