var tabs = new Tabs("#ccf","#fff");
var map;
var xmlhttp;

// Funkcja obiektowa dla
// każdego elementu photo
function photo(id, url) {
   this.id = id;
   this.url = url;
   this.longitude = null;
   this.latitude = null;
   this.tags = [];
   this.origObject;
   this.setLocation = function(lon,lat) {
      this.longitude = lon;
      this.latitude = lat;
   }
}

// Globalny obiekt Photo służący do zarządzania
// wszystkimi wywołaniami Ajaksa związanymi ze zdjęciami 
// i przetwarzania wszelkich danych dotyczących zdjęć 
var Photo = {
   currentPhoto : -1,

   // Tworzy tablicę obiektów photo pobranych z witryny
   // Flickr na podstawie identyfikatora użytkownika 
   processPhotos : function(obj) {
      this.photos = new Array(obj.photos.photo.length);
      for (var i = 0; i < obj.photos.photo.length; i++) {
         var pic = obj.photos.photo[i];
         var url = "http://farm" + pic.farm + ".static.flickr.com/" +
            pic.server + "/" + pic.id + "_" + pic.secret + ".jpg";
         this.photos[i] = new photo(pic.id, url);
         this.photos[i].origObject = obj.photos.photo[i];
      }
      aaManageEvent(aaElem('button'),'click',aaBindEventListener(this,this.loadPhoto));
      this.getPhoto();
   },

   // Metoda obsługi zdarzeń do pobierania następnego zdjęcia
   loadPhoto   : function(evnt) {
      evnt = evnt ? evnt : window.event;
      aaCancelEvent(evnt);
      this.getPhoto();
      return false;
   },

   // Przetwarzanie żądania dotyczącego nowego zdjęcia i pobieranie lokalizacji,
   // jeśli nie jest jeszcze zapisana w obiekcie photo
   getPhoto     : function() {

       this.currentPhoto++;
       if (this.currentPhoto >= this.photos.length) this.currentPhoto = 0;
       var pic = this.photos[this.currentPhoto];
       aaElem("image").src=pic.url;

       // Wymagany odnośnik do witryny Flickr i stały odnośnik do mapy
       if (aaElem('maplinks'))
           aaElem('required').removeChild(aaElem('maplinks'));

       var a = document.createElement('a');
       a.setAttribute('href','http://flickr.com/photos/69562477@N00/' + pic.id + '/');
       a.appendChild(document.createTextNode('Odnośnik do zdjęcia na witrynie Flickr'));
       var ul = document.createElement('ul');
       ul.setAttribute('id','maplinks');
       var li = document.createElement('li');
       li.appendChild(a);
       ul.appendChild(li);

       // Ustawianie stałego odnośnika
       a = document.createElement('a');
       var url = "slideshow.php?farm=" + pic.origObject.farm +
                 "&server=" + pic.origObject.server + "&id=" + pic.id +
                 "&secret=" + pic.origObject.secret;
       a.setAttribute('href',url);
       a.appendChild(document.createTextNode('Stały odnośnik do statycznej strony ze zdjęciem'));
       li = document.createElement('li');
       li.appendChild(a);
       ul.appendChild(li);
       aaElem('required').appendChild(ul);

       // Ustawianie oznaczeń z witryny Flickr
       if (pic.tags.length == 0) {
         aaAddScript("flickrjs.php?service=getTags&format=json&callback=Photo.createTagArray&photo_id=" + pic.id);
       } else {
         this.resetTags();
       }

       // Pobieranie danych o miejscu wykonania zdjęcia
       if (!pic.latitude) {
         aaAddScript("flickrjs.php?service=getLocation&format=json&callback=Photo.placeLocation&photo_id=" + pic.id);
       }

       // Zapamiętywanie bieżącej pozycji
       window.location.hash = this.currentPhoto;
    },

    // Kod do obsługi map Google
    placeLocation  : function(obj) {
      var lat = parseFloat(obj.photo.location.latitude);
      var lon = parseFloat(obj.photo.location.longitude);
      this.photos[this.currentPhoto].setLocation(lon,lat);
      var ul = aaElem('maplinks');
      var li = document.createElement('li');
      var a = document.createElement('a');
      var url = "http://maps.google.com/maps?f=q&hl=en&q=" + lat + "," + lon + "&ie=UTF8&z=15&om=0&iwloc=addr";
      a.setAttribute('href',url);
      a.appendChild(document.createTextNode('Odnośnik do Google Mapswyświetlający dane miejsce'));
      li.appendChild(a);
      ul.appendChild(li);
    },

    // Dołączanie tablicy oznaczeń do zdjęcia
    createTagArray : function(obj) {
       var pic = this.photos[this.currentPhoto];
       var tags = obj.photo.tags.tag;
       for (var i = 0; i < tags.length; i++) {
          if (tags[i].machine_tag != 1) {
              var tag = tags[i].raw;
              pic.tags[pic.tags.length] = tag;
          }
       }
       this.resetTags();
    },

    // Wyświetlenie na zakładce z oznaczeniami oznaczeń bieżącego zdjęcia
    resetTags : function() {
      var pic = this.photos[this.currentPhoto];
      aaElem('techpostname').style.visibility="hidden";
      var tagArea = aaElem('flickrtags');
      var ul = aaElem('tagUl');
  
      // Zmiana wyświetlanych elementów
      if (ul)
         tagArea.removeChild(ul);
      if (pic.tags.length > 0) {
         ul = document.createElement('ul');
         ul.id = 'tagUl';
  
         // Dodanie poszczególnych oznaczeń
         for (var i = 0; i < pic.tags.length; i++) {
           var li = document.createElement('li');
           var a = document.createElement('a');
           a.setAttribute('href', 'http://technorati.com/tag/' + pic.tags[i]);
           a.appendChild(document.createTextNode(pic.tags[i]));
           li.appendChild(a);
           aaManageEvent(li,'click',aaBindEventListener(this,this.getTechPosts));
           ul.appendChild(li);
        }
        tagArea.appendChild(ul);
      }
    },
 
   // Pobieranie z Technorati wpisów odpowiadających oznaczeniom z Flickr
   getTechPosts : function(evnt) {
      var tagarea = aaElem('flickrtags');
      var p = document.createElement('p');
      p.setAttribute('id','working');
      p.appendChild(document.createTextNode('...a toku'));
      tagarea.appendChild(p);

      evnt = evnt ? evnt : window.event;
      aaCancelEvent(evnt);
      var target =  evnt.target ? evnt.target : evnt.srcElement;
      var tag = target.childNodes[0].nodeValue;

      // Wyczyszczenie obszaru z wpisami z witryny Technorati
      var content = aaElem('techpostcontent');
      if (content)
         aaElem('techposts').removeChild(content);

      // Pobieranie obiektu XHR, przygotowywanie i wysyłanie żądania
      if (!xmlhttp) xmlhttp = aaGetXmlHttpRequest();
      var qry = "tag=" + tag;
      var url = 'technorati.php?' + qry;
      xmlhttp.open('GET', url, true);
      xmlhttp.onreadystatechange = this.processTechPosts;
      xmlhttp.send(null);

   },
   
   // Przetwarzanie wpisów z witryny Technorati
   processTechPosts : function() {
     if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
         var working = aaElem('working');
         working.parentNode.removeChild(working);
         var items = xmlhttp.responseXML.getElementsByTagName('item');
         var content = document.createElement('div');
         content.id = 'techpostcontent';

         // Dołączanie odnośników do wpisów
         if (items.length > 0) {
            for (var i = 0; i < items.length; i++) {
               var name = "";
               if (items[i].getElementsByTagName('name')[0].firstChild)
                  name = items[i].getElementsByTagName('name')[0].firstChild.nodeValue;
               var title = "No title";
               if (items[i].getElementsByTagName('title')[0].firstChild)
                  title = items[i].getElementsByTagName('title')[0].firstChild.nodeValue;
               var link = "";
               if (items[i].getElementsByTagName('permalink')[0].firstChild)
                  link = items[i].getElementsByTagName('permalink')[0].firstChild.nodeValue;
 
               var a = document.createElement('a');
               a.appendChild(document.createTextNode(title));
               a.setAttribute('href',link);
               var p = document.createElement('p');
               p.appendChild(a);
               p.appendChild(document.createTextNode(' autor: ' + name));
               content.appendChild(p);
            }
         } else {
            content.appendChild(document.createTextNode('Brak wpisów z Technorati'));
         }
         aaElem('techposts').appendChild(content);
         aaElem('techpostname').style.visibility="visible";
     }
   }
};
     
// Konfiguracja zdarzeń load i unload
aaManageEvent(window,"load", function() {

   setUpTabs();
   aaElem('techpostname').style.visibility="hidden";

   var hash = window.location.hash;
   if (hash) {
      var subLoc = hash.split("#")[1];
      Photo.currentPhoto = parseInt(subLoc) - 1;
   }

  aaAddScript("flickrjs.php?service=getPhotos&format=json&callback=Photo.processPhotos");

});

