var initGo = true;

function UBRTabsEventHandler(evt){ 
   var evt = evt || window.event;
   var el = evt.originalTarget || evt.srcElement;
   var ancs = dom.ancestors(el);
   for (var i=0,l=ancs.length;i<l;i++)
      if (ancs[i].tagName.toLowerCase() == 'a') {
         el = ancs[i];
         break; }
   var state = el.href.substring(el.href.indexOf('#'));  
   UBRTabsHandler(state);  
   dom.stopEvent(evt); 
}

function UBRTabsHandler(todo) { 
   var state = todo || getHashState(); 
   var as = dom.get(document.getElementById('ubrtabs'),'a');
   for (var i=0,l=as.length;i<l;i++)
      if (as[i].href.indexOf(state) != -1) as[i].className = 'cur';
      else as[i].className = '';
   changeUBRContent(state, todo);
}

function changeUBRContent(state, todo) { 
   var map = document.getElementById('map_canvas');
   var listdivs = ['metros','filter-list','results'];
   switch (state) {
      case '#map':
         for (var i=0,l=listdivs.length;i<l;i++)
            document.getElementById(listdivs[i]).style.display = 'none';
         if (!googleMap) gMapInit();
         else map.style.display = 'block';
         break;
      case '#list':
         map.style.display = 'none';
         if (!metroFlag) buildMetro();
         for (var i=0,l=listdivs.length;i<l;i++)
            document.getElementById(listdivs[i]).style.display = 'block';
         break;
   }
   objFilter(todo);
initGo=false;
}

function UBRFilterInit() {
   var node = document.getElementById('inputs');
   dom.addListener(node,{'click':UBRFilterHandler});

   var selected = getSelectedFilters();
   if (selected.length && initGo) objFilter();
}

function originalFilters() {
   var hasharray = location.hash.split('&');
   for (var i=0,l=hasharray.length;i<l;i++)
      if (hasharray[i].length != 36 && hasharray[i].indexOf('#') == -1) {
         var fid = 'f-'+hasharray[i];
         document.getElementById(fid).checked = true;
      }
}

function UBRFilterHandler(evt) {
   var i,l,k,j;
   var evt = evt || window.event;
   var el = evt.originalTarget || evt.srcElement;
   if (el.htmlFor) return;
   if (el.tagName.toLowerCase()!="input" || el.type!="checkbox") return;

   var offices = dom.get(document.getElementById('inputs'),'div','offices')[0];
   var atms = dom.get(document.getElementById('inputs'),'div','atms')[0];
   if (offices) offices = dom.get(offices,'input');
   if (atms) atms = dom.get(atms,'input');
   
   
   if (offices && el.checked && el == offices[0]) {
      for (i=1,l=offices.length;i<l;i++)
         offices[i].checked = false;
      if (atms)
         for (i=0,l=atms.length;i<l;i++)
            atms[i].checked = false;
   }
   
   if (atms && el.checked && el == atms[0]) {
      for (i=1,l=atms.length;i<l;i++)
         atms[i].checked = false;
      if (offices)
         for (i=0,l=offices.length;i<l;i++)
            offices[i].checked = false;         
   }
   
   if (atms && offices && el.checked && el != offices[0] && el != atms[0]) {
      for (i=1,l=offices.length;i<l;i++)
         if (el == offices[i]) {
            offices[0].checked = false;      
            for (k=0,j=atms.length;k<j;k++)
               atms[k].checked = false;               
         }
      for (i=1,l=atms.length;i<l;i++)
         if (el == atms[i]) {
            atms[0].checked = false;
            for (k=0,j=offices.length;k<j;k++)
               offices[k].checked = false;                 
         }
   }
   objFilter(); 
}

function objFilter(todo) {
   if(getSelectedFilters().length == 0){
      originalFilters();
   }
   var i,l,k,j,m,n,x, f = true, s = false, stations = [], results = {}, newhash, loc;
   var res = dom.get(document.getElementById('results'),'div','obj');
   var filters = getSelectedFilters();
   try { stations = getSelectedMetros(); } catch(e) {}
   
   loc = getHashState();
   
   newhash = todo ? todo : loc;
   
   for (i=0,l=res.length;i<l;i++) {
   // проход по всем выведенным банкоматам/офисам.
      if (atmAndOffices[res[i].id]) { // если данный объект существует в словаре банкоматов/офисов
         var obj = atmAndOffices[res[i].id]; // берём его в переменную
         for (k=0,j=filters.length;k<j;k++) { // бежим по массиву фильтров
            if (!obj[filters[k]]) f = false; // если у нашего банкомат/офис нету такой галки - фильтр не пройден.
            if (newhash.indexOf(filters[k].substring(2)) == -1) // если его нет в хеше
               newhash += '&'+filters[k].substring(2); //добавляем его туда.
         } 
         for (m=0,n=stations.length;m<n;m++) { // бежим по массиву фильтр.станций.
            if(obj[stations[m]]) s = true; // если у нашего банкомат/офис есть такая станция, фильтр пройден.
            if (newhash.indexOf(stations[m]) == -1) //если его нет в хеше.
               newhash += '&' + stations[m]; // добавляем его туда.
         }
         if (!stations.length && filters.length) s = true; // если в массиве станций нету ни одной, но другие фильтры есть - со станциями все ок.
         if (stations.length && !filters.length) f = true; //если есть станций но нет фильтров, с фильтрами все ок.
         if (f && s) // если всё ок 
            results[obj.id] = obj; // добавляем этот объект в результирующий объект.
         res[i].style.display = 'none'; // но по-любому его скрываем.
         f = true; s = false; // напоследок обнуляем подсобные значения и идем к следующему.
      }
   }
   
   if (location.hash.length)
      location.href = location.href.substring(0,location.href.indexOf('#')) + newhash;
   else location.href += newhash;

   var state, descs;
   
   if (document.getElementById('ubrtabs')) {
      descs = dom.descendants(document.getElementById('ubrtabs'));
      for (x in descs)
         if (descs[x].className == 'cur')
            state = descs[x].href.substring(descs[x].href.indexOf('#'));      
   } else {
      if (location.hash.indexOf('map') != -1) state = '#map';
      if (location.hash.indexOf('list') != -1) state = '#list';   
   }

   for (i=0,l=markers.length;i<l;i++)
         googleMap.removeOverlay(markers[i]);   
   markers = [];   
   i = 0;
   for (x in results) {i++; break;}
   if (!i) return;
   
   switch (state) {
      case '#map':
         for (x in results)
            markers.push(createMarker(results[x]));
         toggleInputs(true);
         progressBar.start(markers.length);
         var speed = Math.round(1000 / markers.length);
         if (speed > 50) speed = 50;
         var timeout = setTimeout(crMarker,300);
         break;
      case '#list':
         for (x in results)
            document.getElementById(results[x].id).style.display = 'block';
         dom.ie6Refresh();
         break;
   }
   
   var markerCounter = 0;

   function crMarker() {
      progressBar.updateLoader(1);
      googleMap.addOverlay(markers[markerCounter]);
      if( markerCounter + 1 == markers.length || progressBar.current_ >= progressBar.operations_) {
         clearTimeout(timeout);
         progressBar.remove();
         toggleInputs(false);
      } else timeout = setTimeout(crMarker,speed);
      markerCounter++;
   }
}

function toggleInputs(bool) {
   var node = document.getElementById('inputs');
   var inputs = dom.get(node,'input');
   for (i=0,l=inputs.length;i<l;i++)
      inputs[i].disabled = bool;
}

function createMarker(node) {
   var point = new GLatLng(node.lat,node.lon);
   var marker = new GMarker(point, ubrMarkerOptions);
   var div = document.getElementById(node.id).cloneNode(true);
   div.id = '';
   div.style.display = 'block';
   div.style.height = 'auto';
   var img = dom.get(div,'div','img')[0];
   var links = dom.get(div,'div','links')[0];
   var printText = getLang() == 'rus' ? 'версия для печати' : 'print version';
   var moreText = getLang() == 'rus' ? 'подробнее' : 'more';
   links.innerHTML = '<a href="offices.wbp?id='+node.id.substring(1)+'&city='+ubrCityId+'&m=p" class="printLink">'+printText+'</a><a href="offices.wbp?id='+node.id.substring(1)+'&city='+ubrCityId+'" class="moreLink">'+moreText+'</a>';
   if (img.getAttribute('rel') != '') img.innerHTML = '<img src="'+img.getAttribute('rel')+'"/>';
   
   /* var tt = document.createElement('div');
   tt.appendChild(div);
   tt.style.width = '350px';
   tt.style.overflow = 'hidden';
   marker.bindInfoWindow(tt);
   */
   div.style.width = '225px';
   div.style.oveflow = 'hidden';
   div.style.marginTop = '-11px';
   div.style.marginBottom = '5px';
   marker.bindInfoWindow(div);
   return marker;
}

function buildMetro() {
   if (metroSelect != "undefined" && metroSelect.length) {
      var stations = metroSelect;
      var container = document.getElementById('metros');
      var template = '<select multiple="multiple" size="7">{stations}</select><div><img src="/media/system/img/buttons/gt.gif"/><img src="/media/system/img/buttons/lt.gif"/></div><select multiple="multiple" size="7"></select>';
      var nodes = {
         s1: null, // исходный селект с метро
         s2: null, // фильтр с метро
         add: null, // кнопка добавления
         remove: null // кнопка удаления
      };
      var st='';
      
      function doAdd() {
         var arr =[];
         for (var i=0,l=nodes.s1.length; i<l; i++)
            if (nodes.s1[i].selected) arr.push(nodes.s1[i]);

         for (i=0,l=nodes.s2.length; i<l; i++)
            for (var j=0; j<arr.length; j++)
               if (arr[j].value == nodes.s2[i].value)
                  arr.splice(j--,1);

         for (i=0,l=arr.length;i<l;i++)
            doOption(nodes.s2, arr[i].text, arr[i].value);   
         objFilter();
      }
      
      function doRemove() {
         for (i=0,l=nodes.s2.length; i<l; i++)
            if (nodes.s2[i].selected) {nodes.s2.removeChild(nodes.s2[i--]); l--;}
         objFilter();
      }
               
      function doOption(el, txt, val) {
         var opt = document.createElement("option");
         opt.appendChild(document.createTextNode(txt));
         opt.setAttribute("value", val);
         el.appendChild(opt);
      }
      
     
      for (var i=0,l=stations.length;i<l;i++) {
         st += '<option value="'+stations[i].value+'">'+stations[i][getLang()]+'</option>';
      }
      container.innerHTML = template.replace(/\{stations\}/g, st);
      
      nodes.s1 = dom.get(container,'select')[0];
      nodes.s2 = dom.get(container,'select')[1];
      nodes.add = dom.get(container,'img')[0];
      nodes.remove = dom.get(container,'img')[1];
      dom.addListener(nodes.add, {'click':doAdd});
      dom.addListener(nodes.remove, {'click':doRemove});      
    
   
      var hasharray = location.hash.split('&');
      for (i=0,l=hasharray.length;i<l;i++)
         if (hasharray[i].length == 36) {
            for (var j=0,k=stations.length;j<k;j++)
               if (hasharray[i] == stations[j].value)
                  var text = stations[j][getLang()];
            doOption(nodes.s2, text ,hasharray[i])
         }
      if (hasharray.length) {
         originalFilters();
         objFilter();
      }
   }
   metroFlag = true;
}

function getSelectedFilters() {
   var arr = [],i,l;
   var node = document.getElementById('inputs');
   var inputs = dom.get(node,'input');
   for (i=0,l=inputs.length;i<l;i++)
      if (inputs[i].checked)
         arr.push(inputs[i].id);
   return arr;
}

function getSelectedMetros() {
   var arr = [],i,l;
   var node = dom.get(document.getElementById('metros'),'select')[1];
   for (i=0,l=node.length;i<l;i++)
      arr.push(node[i].value);
   return arr;
}

function getHashState() { 
   var loc = '';
   if (location.hash.indexOf('&') != -1)
      loc = location.hash.substring(0,location.hash.indexOf('&'));
   else
      loc = location.hash;
   return loc;
}

function gMapInit() {
	if (GBrowserIsCompatible()) {
		googleMap = new GMap2(document.getElementById('map_canvas'));
		googleMap.setCenter(mapCenter, mapZoom);
		googleMap.enableScrollWheelZoom();
		var customUI = googleMap.getDefaultUI();
		customUI.controls.maptypecontrol = false;
		googleMap.setUI(customUI);
		googleMap.setMapType(G_NORMAL_MAP);
		checkMetro();
      progressBar = new ProgressbarControl(googleMap);
   }
}

var ubrIcon = new GIcon(G_DEFAULT_ICON);
ubrIcon.image = "/media/system/inc/gmap/ubrIcon.png";
ubrIcon.iconSize = new GSize(18, 33);
ubrIcon.iconAnchor = new GPoint(9,33);

var ubrMarkerOptions = {icon:ubrIcon};

var mapZoom = 12;
var metroController;
var googleMap;
var metroFlag;
var progressBar;
var markers = [];