var X = X || {};
X.loadedCss = [];
/*
 * simple function to retrieve and embed a CSS file
 */
X.addCss = function(url) {
    if ($.inArray(url,X.loadedCss) < 0) {
        X.loadedCss[X.loadedCss.length] = url;
        var headID = document.getElementsByTagName("head")[0];         
        var cssNode = document.createElement('link');
        cssNode.type = 'text/css';
        cssNode.rel = 'stylesheet';
        cssNode.href = url;
        cssNode.media = 'screen';
        headID.appendChild(cssNode);
    }
    return 0;
};

X.domain = window.location.protocol + '//' + window.location.host;

/**
 * Base function used for inheritance
 */
X.Base = function(){
    return this;
};
/**
 * 
 * @param {Object} options
 */
X.Base.prototype.setOptions = function(options) {
    this.options = $.extend({},this.options,options);
};
/**
 * Add event listener to Object
 * @param {String} event
 * @param {Function} func
 */
X.Base.prototype.addEvent = function(event,func) {
    if(!this.events) {
        this.events = {};
    }
    if (this.events[event]) {
        this.events[event][this.events[event].length] = func;
    }
    else {
        this.events[event] = [];
        this.events[event][0] = func;
    }
    return this;
};
/**
 * Removes selected event from Object
 * @param {String} event
 */
X.Base.prototype.removeEvents = function(event) {
    if (this.events && this.events[event]) {
        delete this.events[event];
    }
    return this;
};
/**
 * Fires selected event
 * @param {String} event
 * @param {Object} arg
 */
X.Base.prototype.fireEvent = function(event,arg) {
    var self = this;
    if (this.events) {
        $.each(this.events[event], function(index, func){
            func.call(self, arg);
        });
    }
    return this;
};

/**
 * @constructor
 * Creates function that inherits methods and properties from a given function or from X.Base (if no argument is given)
 */
X.Class = function(parent) {
    var child = function(options){
        this.setOptions(options);
    };
    child.prototype = parent ? new parent : new X.Base;
    child.constructor = child;
    child.prototype.parent = parent ? parent.prototype : X.Base.prototype;
    return child;
};

X.getDomain = function(www) {
    var domain = location.host;
    if(www && domain.indexOf('www')=='0') {
        domain = domain.replace('www',www);
    }
    return domain;
};

X.ImageZoom = {
    createLinks: function() {
        $('.x-zoom-thumb-link').each(function(index,element){
            var href = $(element).attr('src').replace('images/thumb/','images/thumb/big/')
                                             .replace('/small/','/big/')
                                             .replace('/big/big/','/big/');
            $(element).wrap('<a href="' + href + '" />');
        });
    },
    
    fancybox: function() {
        $('#x-content a[href$=".jpg"], #x-content a[href$=".JPG"], #x-content a[href$=".jpeg"], #x-content a[href$=".JPEG"], #x-content a[href$=".gif"], #x-content a[href$=".GIF"], #x-content a[href$=".png"], #x-content a[href$=".PNG"], #x-content a[href$=".tiff"], #x-content a[href$=".TIFF"]').fancybox({
            'transitionIn'  :   'elastic',
            'transitionOut' :   'elastic',
            'easingIn'      :   'swing', //czemu nie dziala?
            'easingOut'     :   'swing',
            'speedIn'       :   300,
            'speedOut'      :   200,
            'padding'       :   2,
            'overlayShow'   :   true,
            'titlePosition' :   'outside' //inside, outside, over
        });
    }
};

X.c = function(string) {
    if (typeof console != 'undefined' && typeof console.log == 'function') {
        console.log(string);
    }
}

X.random = function(min,max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
};

/**
 * Author: Bartek Garbiak
 */
(function($){
  $.fn.catchEvent = function(eventName,options) {
    
    if (eventName && typeof eventName === 'object') {
         for (var i in eventName) {
             if (eventName.hasOwnProperty(i)) {
                 this.catchEvent(i,eventName.i);
             }
         }
         return this;
        
    }
    else if (!eventName) {
         eventName = 'click';
    }

    var settings = {
        preventDefault  : true,
        loadingOverlay  : false,
        loadingClass    : 'loading',
        onCatch         : function(obj,ev){},
        releaseOn       : null,
        onRelease       : function(obj,ev){},
        trigger         : null
    };

    if (options) { 
        $.extend(settings, options);
    }

    var that = this;

    this.bind(eventName + '.catchEvent', function(e) {
        X.c(that.data());
         if (settings.preventDefault) {
             e.preventDefault();
         }

         if (settings.loadingOverlay) {
             that.after('<div class="catchEvent ' + (typeof settings.loadingOverlay === 'string' ? settings.loadingOverlay: settings.loadingClass) + '"></div>');
         }
         else if (settings.loadingClass) {
             that.addClass('loading');
         }

         if (typeof settings.onCatch === 'function') {
             settings.onCatch(that,e);
         }

         that.data(eventName + '.catchEvent', {
             loadingOverlay: settings.loadingOverlay,
             loadingClass: settings.loadingClass
         });

         that.unbind(eventName + '.catchEvent').bind(eventName + '.catchEvent',function(){});

         if (settings.releaseOn) {
             that.bind(settings.releaseOn + '.catchEvent', function(){
                 that.trigger('release.catchEvent');
             });
         }
         that.bind('release.catchEvent',function(e){
             settings.onRelease(that,e);
             //that.releaseEvent(eventName).unbind('.catchEvent');
             that.trigger(settings.trigger ? settings.trigger : eventName).unbind('.catchEvent');
         });

    });

    return this;

  };
  
  $.fn.releaseEvent = function(eventName) {
      if (!eventName) {
          var data = this.data();
          var eventCatched = false;
          for (var i in data) {
              if (data.hasOwnProperty(i)) {
                  if (i.indexOf('.catchEvent') > -1) {
                      eventCatched = true;
                      eventName = i.replace('.catchEvent','');
                      this.releaseEvent(eventName);
                  }
              }
          }
          if (!eventCatched) {
              this.unbind('.catchEvent');
          }
          return this;
      }
      else if ($.isArray(eventName)) {
          $.each(eventName,function(i,n){
              this.releaseEvent(n);
          });
      }
      var data = this.data()[eventName + '.catchEvent']; //&& 
    
      if (data && data.loadingOverlay) {
          this.parent().find('div.catchEvent.' + (typeof data.loadingOverlay === 'string' ? data.loadingOverlay: data.loadingClass)).remove();
      }
      else if (data && data.loadingClass) {
          this.removeClass(data.loadingClass);
      }
      this.trigger('release.catchEvent');
      $.removeData(this, eventName + '.catchEvent');
      this.unbind('.catchEvent');

      return this;

  };
  
})(jQuery);
