
var  WebserviceAdapter = function(oCalendar, oConnect) {
    var that = this;
    this.redirect = function (url) {
      window.location = url;
    };
    this.calendar = oCalendar;
    this.connectionManager = oConnect;
    this.baseurl = "http://www.am.katowice.pl/index.php?a=kalendarz";
    this.filter_mask = 0x3ff;
    var links = [];

    this.localizeCalendar = function () {
      var cal_cfg = calendarCfg();

      cal_cfg.setProperty("MONTHS_SHORT",   ["sty", "lut", "ma", "kwi", "maj", "cze", "lip", "sie", "wrz", "pa\u017a", "lis", "gru"]);
      cal_cfg.setProperty("MONTHS_LONG",    ["stycze\u0144", "luty", "marzec", "kwiecie\u0144", "maj", "czerwiec", "lipiec", "sierpie\u0144", "wrzesie\u0144", "pa\u017adziernik", "listopad", "grudzie\u0144"]);

      cal_cfg.setProperty("WEEKDAYS_1CHAR", ["n", "p", "w", "\u015b", "c", "p", ""]);
      cal_cfg.setProperty("WEEKDAYS_SHORT", ["nd", "pn", "wt", "\u015br", "cz", "pt", "sb"]);
      cal_cfg.setProperty("WEEKDAYS_MEDIUM",["nie", "pon", "wto", "\u015bro", "czw", "pi\u0105", "sob"]);
      cal_cfg.setProperty("WEEKDAYS_LONG",  ["niedziela", "poniedzia\u0142ek", "wtorek", "\u015broda", "czwartek", "pi\u0105tek", "sobota"]);

    }
    this.filter = function (events) {
      //this.filter_mask = parseInt(events);
      this.filter_mask = events;
        that.calendar.removeRenderers();
        decorateCalendarDaysWithClass(
          getDayNodes(that.responseXML),
          getCalendarYear(),
          getCalendarMonth()
        );

        that.calendar.render();
    };
    
    var callback = {
      success : function (oResponse) {
        that.responseXML = oResponse.responseXML;
        that.calendar.removeRenderers();
        decorateCalendarDaysWithClass(
          getDayNodes(oResponse.responseXML),
          getCalendarYear(),
          getCalendarMonth()
        );
        
        that.calendar.render();
      },
      failure : function () { }
    };
    var getDayNodes = function (doc) {
      return YAHOO.util.Dom.getElementsBy(function () { return true; }, 'day', doc);
    };
    var decorateCalendarDaysWithClass = function (nodes, year, month) {
      var i = 0;
      var renderers = {};
      var create_renderer = function (renderers, value, className) {
        if (!renderers[value]) {
          renderers[value] = function (workingDate, cell) {
            YAHOO.util.Dom.addClass(cell, className);
          };
        }
        return renderers[value];
      };
      var filterNodeValue = function (eventNode) {
        var value = eventNode.text | eventNode.textContent;
        value = parseInt(value);
        value &=that.filter_mask;
        return value;
      };
      var selectRenderer = function (eventNode) {
        var value = filterNodeValue(eventNode);
        if (value==0) {
          return that.calendar.renderBodyCellRestricted;
        } else if (value==1) {
          return create_renderer(renderers, value, "am_event_1");
        } else if (value==2) {
          return create_renderer(renderers, value, "am_event_2");
        } else if (value==4) {
          return create_renderer(renderers, value, "am_event_3");
        } else if (value==8) {
          return create_renderer(renderers, value, "am_event_4");
        } else if (value==16) {
          return create_renderer(renderers, value, "am_event_5");
        } else if (value==32) {
          return create_renderer(renderers, value, "am_event_6");
        } else if (value==64) {
          return create_renderer(renderers, value, "am_event_7");
        } else if (value==128) {
          return create_renderer(renderers, value, "am_event_8");
        } else if (value==256) {
          return create_renderer(renderers, value, "am_event_9");
        } else if (value==512) {
          return create_renderer(renderers, value, "am_event_10");
        } else {
          return create_renderer(renderers, 1023, "am_event_multiple");
        }
      };
      var buildDate = function (month, day, year) {
        var date = month + "/" + day + "/" + year;
        return date;
      };
      if (nodes.length==0) {
        that.calendar.addMonthRenderer(month+1, that.calendar.renderBodyCellRestricted);
      }
      var children;
      links = [];
      for (i=0; i< nodes.length; ++i) {
        that.calendar.addRenderer(buildDate(month+1, i+1, year), selectRenderer(YAHOO.util.Dom.getFirstChild(nodes[i])));
        children = YAHOO.util.Dom.getChildren(nodes[i]);
        if (children.length > 1) {
          links[i] = children[1].text || children[1].textContent;
        } else {
          links[i] = null;
        }
      }
    };
    this.subscribeEvents = function () {     
      that.calendar.changePageEvent.subscribe(that.sendRequest, that, true);
      that.calendar.selectEvent.subscribe(function (d, args, obj) {
        var date = args[0][0];
        var day = date[2]-1;
        this.redirect(links[day]+'&filter='+this.filter_mask);
        that.calendar.deselectAll();
      }, that, true);
    };

    this.getCalendarDate = function() {
      return getCalendarMonth() + "/1/" + getCalendarYear();
    };

    var getCalendarYear = function () {
      return calendarCfg().getProperty('pagedate').getFullYear();
    };
    var getCalendarMonth = function () {
      return calendarCfg().getProperty('pagedate').getMonth();
    };
    var calendarCfg = function () {
      return that.calendar.cfg;
    };
    this.sendRequest = function () {
      that.calendar.addMonthRenderer(getCalendarMonth()+1, that.calendar.renderBodyCellRestricted);
      that.connectionManager.asyncRequest('GET', that.baseurl + "&m=" + (getCalendarMonth()+1) + "&y=" + getCalendarYear(), callback);
    };
};
