script.js 9.44 KB
var hash_interpreted = false;

$(function(){
  $('.tabs').tabs({
    show: function() {
      if (hash_interpreted)
        update_hash();
    },
  });
  $('button').button();
  $('input.datepicker').datepicker($.datepicker.regional["pl"]);
  $(document).on('mouseover', '.ui-state-default', function() {
    $(this).addClass('ui-state-hover');
  });
  $(document).on('mouseout', '.ui-state-default', function() {
    $(this).removeClass('ui-state-hover');
  });
  if (window.paginer || $('.tabs').length > 0) {
    $(window).bind('hashchange', function(e) {
      var hash = location.hash.substr(1);
      interpret_hash(hash);
      hash_interpreted = true;
    });
    $(window).trigger('hashchange');
  }
});

$.fn.disable = function() {
  return this.prop('disabled', true);
};

$.fn.enable = function() {
  return this.prop('disabled', false);
};

$.fn.value = function() {
  if (this.is(':checkbox'))
    return this.prop('checked');
  else if (this.is(':radio'))
    return this.prop('checked')? this.val() : null;
  else
    return this.val();
};

$.fn.bind_hover = function(c) {
  var elem = this;
  this.hover(
    function() {elem.addClass(c);},
    function() {elem.removeClass(c);}
  );
};

function multiselect_toggle(select, option_value, enable) {
  select = $(select);
  widget = select.multiselect2("widget");
  option = widget.find('[value="' + option_value + '"]');
  if (enable)
    option.enable();
  else
    option.disable();
  option.parent().toggleClass('ui-state-disabled', !enable);
  option.parent().parent().toggleClass('ui-multiselect-disabled', !enable);
};

function multiselect_enable(select, option_value) {
  select = $(select);
  widget = select.multiselect2("widget");
  option = widget.find('[value="' + option_value + '"]');
  option.enable();
  option.parent().removeClass('ui-state-disabled');
  option.parent().parent().removeClass('ui-multiselect-disabled');
};

function _(text) {
  return text;
};

function error_alert(text) {
  alert(text);
};

// parametry: method, url, data | description, dest, callback, callback_args
$.ajaxJSON = function(params) {
  var encoded_data = {};
  if (params.save && !before_save())
    return false;
  $.each(params.data, function(key, value) {
    encoded_data[key] = $.toJSON(value);
  });
  $.ajax({
    type: params.method,
    url: params.url,
    dataType: 'json',
    data: encoded_data,
    success: parse_result(params),
    error: params.error_callback
  });
  return true;
};

function blank(str) {
  re = /^[\t\n ]*$/;
  return re.test(str);
}

function strip(str) {
  return str.replace(/^\s+|\s+$/g, '');
}

// parametry: description, dest, callback, callback_args
function parse_result(params) {
  return function(data, status) {
    if(data.result != 'ok' || status == 'error') {
      if(data.result=='logout')
        error_alert(_("Sesja wygasła - zaloguj się i spróbuj ponownie."));
      else
        if (!params.bad_data_callback || params.bad_data_callback(data.result)) {
          var msg = params.description + ' ' + _("nie powiodło się:\n");
          msg += data.result;
          error_alert(msg);
        }
    }
    else { // OK
      if (params.dest) {
        params.dest.html(data.html);
      }
      if (data.js) {
        eval(data.js); // nie używane
      }
      if (params.callback) {
        if (!params.callback_args)
          params.callback_args = [];
        args = [data].concat(params.callback_args);
        params.callback.apply({}, args);
      }
    }
  }
};

function debug(content) {
  var doc = $('#debug').contents().get(0);
  doc.open();
  doc.writeln(content);
  doc.close();
};

$(function() {
  $('#show-debug').click(function() {
    $('#debug').toggle();
  });
  $('#debug').height($(window).height() - $('#main_menu').height());
  $('#debug').css('top', $('#main_menu').height())
});

function parse_error(event, request, settings) {
  debug(request.responseText);
  $('#show-debug').show();
}

//$.ajaxSetup({global: true, error: parse_error});

$(function() {$('#debug').ajaxError(parse_error);});

$('html').ajaxSend(function(event, xhr, settings) {
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
        // Only send the token to relative URLs i.e. locally.
        xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
    }
});

// http://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/2117698#2117698
(function($) {

 $.fn.textMetrics = function() {

  var h = 0, w = 0, el = this;

  var div = document.createElement('div');
  document.body.appendChild(div);
  $(div).css({
   position: 'absolute',
   left: -1000,
   top: -1000,
   display: 'none'
  });

  $(div).html($(el).html());
  var styles = ['font-size','font-style', 'font-weight', 'font-family','line-height', 'text-transform', 'letter-spacing'];
  $(styles).each(function() {
   var s = this.toString();
   $(div).css(s, $(el).css(s));
  });

  h = $(div).outerHeight();
  w = $(div).outerWidth();

  $(div).remove();

  var ret = {
   height: h,
   width: w
  };

  return ret;
 }

})(jQuery);

function update_hash() {
  var new_hash = make_hash();
  old_hash = new_hash;
  location.href = '#' + new_hash;
}

// nie dodawać, jeśli wartości są domyślne?
function make_hash() {
  var bottom_tabs, tabs, tab_path = [], query, id, data, original_data;
  var paginer_el;
  var are_tabs = $('.tabs').length > 0;
  if (are_tabs) {
    tabs = $('.tabs:visible').first();
    while (tabs.find('.tabs:visible').length > 0) {
      tabs = tabs.find('.tabs:visible').first();
    }
    bottom_tabs = tabs;
    do {
      tab_path.unshift(tabs.children('.ui-tabs-panel:visible')[0].id);
      tabs = tabs.parents('.tabs').first();
    } while (tabs.length > 0);
  } else
    tab_path = [''];
  paginer_el = $('.paginer:visible', bottom_tabs);
  if (paginer_el.length > 0) {
    var id = paginer_el[0].id;
    data = paginer[id][1];
    original_data = original_paginer[id][1];
    // TODO sprawdzać, czy nie domyślny!
    query = [];
    if (data.order_by != original_data.order_by)
      query.push('order_by=' + data.order_by);
    $.each(data.filters, function(field, value) {
      if (original_data.filters[field] === undefined)
        query.push(field + '=' + value);
    });
    if (get_page_number(id) > 1)
      query.push('page=' + get_page_number(id));
    tab_path.push(query.join('&'));
  } else
    tab_path.push('');
  return tab_path.join('/');
}

var old_hash = 'not gonna happen';

function interpret_hash(hash) {
  var data = hash.split('/'), options, children;
  if (hash == old_hash)
    return;
  var id, paginer_data, original_data, new_order_by, new_filters, new_page;
  var paginer_container, paginer_el;
  if (hash != '')
    $.each(data.slice(0, data.length - 1), function(i, part) {
      if (part)
        $('#' + part).parents('.tabs').first().tabs('select', '#' + part);
    });
  else {
    paginer_container = $('.ui-tabs-panel').first();
    hash_interpreted = false; // HACK
    while (paginer_container.length > 0) {
      paginer_container.parents('.tabs').first().tabs(
        'select', '#' + paginer_container[0].id);
      children = $('.ui-tabs-panel', paginer_container);
      if (children.length > 0)
        paginer_container = children.first();
      else
        paginer_container = children;
    }
    hash_interpreted = true; // HACK, może zadziała
  }
  if (window.paginer) {
    if (data[0] != '')
      paginer_container = $('#' + data[data.length - 2]);
    else { // nie ma tabów (lub pusty hash...)
      paginer_container = $(document.body);
      do {
        children = $('.ui-tabs-panel:visible', paginer_container);
        if (children.length)
          paginer_container = children[0];
      } while(children.length);
    }
    paginer_el = $('.paginer', paginer_container)
    if (paginer_el.length > 0) {
      id = paginer_el[0].id;
      paginer_data = paginer[id][1];
      original_data = original_paginer[id][1];
      new_order_by = original_data.order_by;
      new_page = 1;
      new_filters = $.extend({}, original_data.filters);
      if (data[data.length - 1])
        $.each(data[data.length - 1].split('&'), function(i, pair) {
          if (pair) {
            var p = pair.split('=', 2);
            var field = p[0], value = p[1];
            if (value == 'false')
              value = false;
            if (value == 'true')
              value = true; // nieodporne na tekstowe filtry (jeśli będą)
            if (field == 'order_by') {
                new_order_by = value;
            } else if (field == 'page') {
              new_page = parseInt(value);
            } else { // jakieś sprawdzanie poprawności? w sumie serwer to zrobi...
                new_filters[field] = value;
            }
          }
        });
      paginer_data.order_by = new_order_by;
      paginer_data.filters = new_filters;
      page_numbers[id] = new_page;
      update_list(id, true); // protect hash
      show_order(id);
      reload_panel(id);
    }
  }
  old_hash = hash;
}