var list_map, points_cache, points_table, trigger_list, trigger_map;

jQuery.extend(jQuery.expr[':'], {
  inContains : function(a,b,m) {
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
  }
});

// points popup
$('#point-list-table').click(function(e) {
  e = e || window.event();
  var target = e.target || e.srcElement;
  var target_class = target.className;
  delete e;
  if (target_class == 'point-title') {
    $('#point-placeholder').jqm({ajax: target.getAttribute('rel'), target: $('#point-placeholder .content'), ajaxText: '<div class="spinner">'+ _t['JS_LOADING'] +'</div>'}).jqmShow();
    return false;
  } else if ((target_class == 'calc-trigger' || target_class == 'i-send' || target_class == 'i-accept') && calc_trigger_click) {
    calc_trigger_click(target);
    return false;
  }
});

$(function() {
  if (!points_table) points_table = document.getElementById('point-list-table'); // cache

  // initial process
  if ($('#gmap').length) {
    list_map = new Map('gmap', points);
    show_map_trigger();
    // load map in background
    //setTimeout(function() { if (!$('#map-trigger').hasClass('active')) list_map.init(true); }, 3000);
  }
  if (points_table && document.location.hash != '') {
    js_filter_table(true);
  }

  if ($('#metro_list').length) {
    show_metro_trigger();
  }

  // region select part
  if ($('#region-trigger').length && !$('#region-placeholder').length) {
    $('#wrapper').after('<div class="jqmWindow" id="region-placeholder"><div class="content"></div><span class="jqmClose">'+ _t['CLOSE_LINK'] +'</span><!--[if lte IE 6.5]><iframe class="ie6-iframe"></iframe><![endif]--></div>');
    $('#region-placeholder').jqm({ajax: '@rel', target: $('#region-placeholder .content'), trigger: $('#region-trigger'), ajaxText: '<div class="region-loader spinner">'+ _t['JS_LOADING'] +'</div>', onLoad: region_loaded_callback});
  }

  // hidden blocks with toggles
  $('.toggle-hidden').click(function() {
    $('#'+$(this).attr('rel')).slideToggle();
    return false;
  });

  // JS filter
  $('#address-field').keyup(function() {
    //if (!$('#address-spinner').length && $(this).val().length > 2) {
    if ($(this).val().length > 2) {
      $('#table-overlay').removeClass('hidden');
    }
    // timeout for typing
    if (this.timer) { clearTimeout(this.timer); }
    this.timer = setTimeout(function(){ js_filter_table(); }, 800);
  });
  $('#check-unistream').add('#check-payments').add('#check-credits').add('#check-daily').add('#check-hourly').click(function() {
    if (typeof document.body.style.maxHeight === 'undefined') { // layout for IE6 - too slow
      $('#table-overlay').removeClass('hidden');
    }
    setTimeout(function() {
      //if (console) console.profile('filter function');
      $('#address-field').val('');
      js_filter_table();
      //if (console) console.profileEnd();
    }, 0);
  });

  if (points_table) {
    // sticky table headers for all except IE (6-8) - nope, for IE7-8 works
    $('#point-list-table').floatHeader({fadeOut:0,faceIn:0});
  }

  // help link
  $('#wrapper').after('<div class="jqmWindow" id="help-placeholder"><div class="content"></div><span class="jqmClose">'+ _t['CLOSE_LINK'] +'</span><!--[if lte IE 6.5]><iframe class="ie6-iframe"></iframe><![endif]--></div>');
  $('#help-placeholder').jqm({ajax: '@rel', target: $('#help-placeholder .content'), trigger: $('#help-icon-trigger'), ajaxText: '<div class="spinner">'+ _t['JS_LOADING'] +'</div>', onLoad: region_loaded_callback});

  // status link
  /*$('#wrapper').after('<div class="jqmWindow" id="status-placeholder"><h2>Проверка статуса перевода</h2><iframe style="border:none;width:100%;height:300px" id="status-frame" src=""></iframe><span title="Закрыть окно" class="jqmClose">Закрыть</span><!--[if lte IE 6.5]><iframe class="ie6-iframe"></iframe><![endif]--></div>');
  $('#status-placeholder').jqm({target: '#status-frame', trigger: $('#status-link'), onShow: loadInIframeModal});*/

  $('#print-list-icon').click(function() {
    window.print();
    return false;
  });
});

var loadInIframeModal = function(hash) {
  var $trigger = $(hash.t);
  var $modal = $(hash.w);
  var myUrl = '/geo/status-frame';
  var $modalContent = $("iframe", $modal);

  $modalContent.html('').attr('src', myUrl);
  hash.w.show();
}

$(window).load(function() {
  if (!getCookie('gzip_support')) {
    setTimeout(function() { $('body').append('<iframe src="'+calc_url+lang_prefix+'/gzip_test" style="display:none"></iframe>'); }, 100);
  }
  setCookie('test', 1, 1, '/');
  if (!getCookie('test') && $('#filter-block').length) {
    $('#filter-block').after('<p style="background:#FFFF69;border:1px solid #ccc;padding:7px">'+ t['JS_COOKIE_WARINIG'] +'</p><br />');
  }
  setCookie('test', 0, 0, '/');
});

/**
 * Callback fires when loaded region overlay.
 */
function region_loaded_callback(hash) {
  // change country
  $('#country_list').change(function() {
    $('#country_list').attr('disabled', 'disabled').addClass('disabled');
    if (!$('#city-loader').length) {
      $('#country_list').after('<p id="city-loader" class="spinner city-loader">'+ _t['JS_LOADING'] +'</p>');
    }
    $('#submit-city').attr('disabled', 'disabled');
    $('#city_list').html('<option disabled="disabled">'+ _t['JS_LOADING'] +'</option>');
    var country_id = $(this).val();
    $.ajax({
      url: calc_url+lang_prefix+'/ajax_load',
      data: 'func=city_list&country='+ country_id,
      dataType: 'json',
      timeout: 30000,
      success: function(data) {
        var opts = '';
        /*if (country_id == 15) {
          opts = '<option value="16">Москва</option><option value="270">Санкт-Петербург</option>';
        } else if (country_id == 83) {
          opts = '<option value="84">Киев</option>';
        } else if (country_id == 79) {
          opts = '<option value="80">Тбилиси</option>';
        } else if (country_id == 393) {
          opts = '<option value="394">Ташкент</option>';
        } else if (country_id == 443) {
          opts = '<option value="444">Душанбе</option>';
        }*/
        var j=0, item;
        while (item = data[j++]) {
          opts += '<option value="'+item.key+'">'+item.value+'</option>';
        }
        $('#city_list').empty().html(opts);
        delete opts;
        $('#country_list').removeAttr('disabled').removeClass('disabled');
        $('#city-loader').remove();
      },
      error: function(XMLHttpRequest, textStatus, errorThrown) {
        $('#country_list').removeAttr('disabled').removeClass('disabled');
        $('#city-loader').remove();
        $('#city_list').html('<option disabled="disabled">'+ t['JS_ERROR_LOADING_DESC'] +'</option><option disabled="disabled">'+ t['JS_ERROR_LOADING_DESC'] +'</option>');
      }
    });
  });
  $('#city_list').click(function() {
    $('#submit-city').attr('disabled', false);
  });
  if ($('#region-trigger').length) {
    $('#city_list').dblclick(function() {
      $('#submit-city').attr('disabled', 'disabled');
      $('#region-select-form').submit();
    })
    $('#submit-city').click(function() {
      $(this).attr('disabled', 'disabled');
      $('#region-select-form').submit();
    });
  }
  $('#submit-city').parent().removeClass('hidden');
}

/**
 * Add events for map/list triggers.
 */
function show_map_trigger() {
  if (!trigger_list) trigger_list = document.getElementById('list-trigger');
  if (!trigger_map) trigger_map = document.getElementById('map-trigger');
  var map_spinner = $('#map-loading');
  map_spinner.removeAttr('style');
  $('#list-trigger:not(.active) .trigger').live('click', function() {
    map_spinner.removeClass('hidden');
    setTimeout(function() { points_table.style.display = 'block'; $('#point-list-table').floatHeader({fadeOut:0,faceIn:0}); map_spinner.addClass('hidden');}, 0);
    list_map.hide();
    trigger_list.className = 'active';
    trigger_map.className = '';
  });
  $('#map-trigger:not(.active.disabled) .trigger').live('click', function() {
    map_spinner.removeClass('hidden');
    points_table.style.display = 'none';
    trigger_map.className = 'active';
    trigger_list.className = '';
    setTimeout(function() { list_map.show(); map_spinner.addClass('hidden'); $('div.floatHeader').remove();}, 0);
  });
  $('#map-trigger.disabled').live('click', function() { return false; });
}

/**
 * Add events for metro trigger.
 */
function show_metro_trigger() {
  if ($('#metro_list').length) {
    $('#metro_list').clone().attr('id', 'metro_list_popup').insertBefore('#metro-selected-list-popup');
    //$('#metro_list').after('<div id="metro-trigger"><span class="trigger"><span class="icon"></span> Схема метро</span><div id="metro-trigger-list"></div></div>');
    $('#metro-map-block').jqm({trigger: $('#metro-trigger .trigger'), onHide: metro_close_callback}).append('<span class="jqmClose">'+ _t['CLOSE_LINK'] +'</span>');
    $('#metro-panel .submit-button').click(function() {
      return false;
    });

    // events for select stations
    $('#metro-layer .metro-station.active').click(function() {
      update_selected_metro($(this));
    });
    $('#metro_list_popup').change(function() {
      if ($(this).val() != '') {
        update_selected_metro($(this));
      }
    });
    if (document.location.hash != '') {
      // mark selected stations
      update_selected_metro();
    }
  }
}

/**
 * Event of selecting metro station.
 */
function update_selected_metro(point) {
  var metro_arr = []
  if ($('#metro_list2').val() != '') {
    metro_arr = $('#metro_list2').val().split(',');
  }
  // delete empty values
  for (metro in metro_arr) {
    if (metro_arr[metro] == '') {
      metro_arr.splice(metro, 1);
    }
  }

  // toggle selected metro station
  if (point) {
    point_id = (point.attr('rel') != undefined) ? point.attr('rel') : point.val();
    if (in_array(point_id, metro_arr)) {
      for (metro in metro_arr) {
        if (metro_arr[metro] == point_id) {
          metro_arr.splice(metro, 1);
        }
      }
    } else {
      metro_arr = metro_arr.concat(point_id);
    }
  }

  $('#metro_list2').val(metro_arr.join(','));
  $('#metro-layer .metro-station.selected').removeClass('selected');
  $('#metro-selected-list-popup, #metro-trigger-list').html('');

  if (metro_arr.length > 0) {
    for (metro in metro_arr) {
      var station_point = $('#metro-layer .metro-station[rel="'+metro_arr[metro]+'"]').addClass('selected');
      $('#metro-selected-list-popup, #metro-trigger-list').append('<div class="metro-icon"><span>'+ station_point.slice(0,1).text() +'</span> <span title="'+ _t['JS_REMOVE_STATION'] +'" class="remove" rel="'+metro_arr[metro]+'">'+ _t['REMOVE_LINK'] +'</span></div> ');
      $('.metro-icon span.remove').click(function() {
        update_selected_metro($('#metro-layer .metro-station[rel="'+$(this).attr('rel')+'"]'));
        js_filter_table();
      });
    }
  }
}

/**
 * Callback when close metro popup - apply selected metro filter.
 */
function metro_close_callback(hash) {
  hash.w.hide();
  hash.o.remove();
  $('#address-field').val('');
  js_filter_table();
}

/**
 * Opens window for click on point on map.
 */
function point_click_on_map(pid) {
  $('#point-placeholder').jqm({trigger: false, target: $('#point-placeholder .content'), ajax:$('#row-'+pid+' .point-title').attr('rel'), ajaxText: '<div class="spinner">'+ _t['JS_LOADING'] +'</div>'}).jqmShow();
}

/**
 * Filters table rows dynamically.
 */
function js_filter_table(init) {
  var doc = document;
  var loc = doc.location.hash;
  // fill from GET url
  if (init && loc != '') {
    var hash = loc.substr(1).split('&');
    for (i in hash) {
      var variable = hash[i].split('=');
      switch (variable[0]) {
        case 'pmetro':
          if (variable[1] != '') {
            $('#metro_list2').val(unescape(variable[1]));
          }
          break;
        case 'paddress':
          if (variable[1] != '') {
            $('#address-field').val(unescape(variable[1]));
          }
          break;
        case 'punistream':
          $('#check-unistream').attr('checked', 'checked');
          break;
        case 'ppayments':
          $('#check-payments').attr('checked', 'checked');
          break;
        case 'pcredits':
          $('#check-credits').attr('checked', 'checked');
          break;
        case 'pdaily':
          $('#check-daily').attr('checked', 'checked');
          break;
        case 'phourly':
          $('#check-hourly').attr('checked', 'checked');
          break;
      }
    }
  }

  // for address search
  var addr_field = $('#address-field').val();
  if (addr_field != '' && addr_field.length > 2) {
    var addr_str = new RegExp(addr_field.toUpperCase());
  }

  var metro_arr = [];
  var metro_field = $('#metro_list2').val();
  if (metro_field && metro_field != '') {
    metro_arr = metro_field.split(',');
  }

  // get filter values
  var check_unistream = $('#check-unistream').is(':checked');
  var check_payments = $('#check-payments').is(':checked');
  var check_credits = $('#check-credits').is(':checked');
  var check_daily = $('#check-daily').is(':checked');
  var check_hourly = $('#check-hourly').is(':checked');

  var points_list = points; // local variable for global
  var points_arr = [];
  var hidden_obj = {};
  var hidden_count = 0;
  var withMap = 0;

  for (point in points_list) {
    points_arr.push(point);
    var cur = points_list[point];
    var include = true;
    if (isNaN(point)) continue; // skip not point members (points.size etc)

    if (metro_field && metro_field != '') {
      include = false;
      var point_metro = cur.metroStationsIDList.split(',');
      var l = point_metro.length;
      while (l--) {
        if (in_array(point_metro[l], metro_arr) == true) {
          include = true;
        }
      }
    }

    // address filter
    if (addr_str && addr_str.test(cur.Address.toUpperCase()) == false) {
      include = false;
    }
    // checkboxes
    if (check_unistream && cur.isOwnBranch != 'True') {
      include = false;
    }
    if (check_payments && cur.canAcceptPhonePayments != 'True') {
      include = false;
    }
    if (check_credits && cur.canAcceptCreditRepayments != 'True') {
      include = false;
    }
    if (check_daily && /CLOSED|выходной/i.test(cur.Worktime)) {
      include = false;
    }
    if (check_hourly && !/круглосуточно/i.test(cur.Worktime)) {
      include = false;
    }

    // hide row if nedeed
    if (include == false) {
      hidden_count++;
      hidden_obj[cur.Bank_ID] = 1;
      points_list[point].hidden = true; // hide on map
    } else {
      delete cur.hidden; // reset hidden points for map
      if (cur.GMapsTargetLng || cur.GMapsTargetLat) {
        withMap++;
      }
    }
  }
  delete points_list;

  if (list_map) {
    if (withMap == 0) {
      $('#map-trigger').addClass('disabled');
    } else {
      $('#map-trigger').removeClass('disabled');
    }
    list_map.dirty = true; // mark map to change
    if ($('#map-trigger').hasClass('active')) {
      list_map.show();
    }
  }

  // caching points for performance
  if (!points_cache) {
    points_cache = {};
    var count = points_arr.length;
    while (count--) {
      var point_id = points_arr[count];
      points_cache[point_id] = doc.getElementById ('row-' + point_id);
    }
  }

  var count = points_arr.length;
  while (count--) {
    var point_id = points_arr[count];
    var el = points_cache[point_id];
    var el_class = el.className;
    if (el_class != 'hidden' && hidden_obj[point_id]) {
      el.className = 'hidden';
    } else if (el_class == 'hidden' && !hidden_obj[point_id]) {
      el.className = '';
    }
  }
  delete hidden_obj;

  $('#table-overlay').addClass('hidden');

  var visible_count = points_arr.length - hidden_count;
  $('#point-count').html(visible_count);
  if (visible_count == 0) {
    if (!$('#nopoints-message').length) {
      $('#point-list-table').after('<p id="nopoints-message"><big>'+ _t['LIST_NOT_FOUND'] +'</big></p>');
    }
  } else {
    $('#nopoints-message').remove();
  }

  // change URL
  if (loc != '') {
    doc.location.hash = '';
  }
  var url_str = [];
  if (metro_field && metro_field != '') {
    url_str.push('pmetro='+escape(metro_field));
  }
  if (addr_field != '') {
    url_str.push('paddress='+escape(addr_field));
  }
  if (check_unistream) {
    url_str.push('punistream');
  }
  if (check_payments) {
    url_str.push('ppayments');
  }
  if (check_credits) {
    url_str.push('pcredits');
  }
  if (check_daily) {
    url_str.push('pdaily');
  }
  if (check_hourly) {
    url_str.push('phourly');
  }
  if (url_str.length > 0) {
    doc.location.hash = url_str.join('&');
  }

  delete doc;
}

/**
 * Save cookie.
 * To remove cookie - pass 'expiredays=0'
 */
function setCookie(c_name, value, expiredays, path) {
  document.cookie=c_name+ "=" +escape(value)+
  ((expiredays || expiredays == 0) ? ";max-age=" + (expiredays*24*60*60) : "") +
  ((path==null) ? "" : ";path="+path);
}

function getCookie(name) {
  var cookie = " " + document.cookie;
  var search = " " + name + "=";
  var setStr = null;
  var offset = 0;
  var end = 0;
  if (cookie.length > 0) {
    offset = cookie.indexOf(search);
    if (offset != -1) {
      offset += search.length;
      end = cookie.indexOf(";", offset)
      if (end == -1) {
        end = cookie.length;
      }
      setStr = unescape(cookie.substring(offset, end));
    }
  }
  return(setStr);
}

/**
  // http://kevin.vanzonneveld.net
  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   improved by: vlado houba
  // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
  // *     returns 1: true
  // *     example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});
  // *     returns 2: false
  // *     example 3: in_array(1, ['1', '2', '3']);
  // *     returns 3: true
  // *     example 3: in_array(1, ['1', '2', '3'], false);
  // *     returns 3: true
  // *     example 4: in_array(1, ['1', '2', '3'], true);
  // *     returns 4: false
  */
function in_array(needle, haystack, argStrict) {
  var key = '', strict = !!argStrict;

  if (strict) {
      for (key in haystack) {
          if (haystack[key] === needle) {
              return true;
          }
      }
  } else {
      for (key in haystack) {
          if (haystack[key] == needle) {
              return true;
          }
      }
  }

  return false;
}
