(function(jQuery){
  /**
   * dynamic linker plugin
   */
   
  $.fn.dynamicLinker = function( externalConfig ) {     
    var defaults = {
      link    : 'http://www.napad.pl',
      blank   : false,
      attribute : false
    }   
    var config    = $.extend( defaults, externalConfig );
    return this.each(function() {
      $(this).bind('click', function(e) { 
        e.preventDefault();
        if (config.attribute) config.target = $(this).attr(config.link);
        else config.target = config.link;
        if (config.blank) window.open(config.target);
        else document.location.href = config.target;
      });
    });
  }

  /**
   * cloud plugin
   */
   
  $.fn.cloud = function( externalConfig ) {     
    var defaults = {
      action      : 'mouseover',
      displayArrow  : true,
      position       : 'top center',
      arrow        : 'cloudArrow',
      cloud        : 'cloud',
      container   : $('body'),
      offset      : [0, 0],
      arrowOffset   : [0, 0],
      delayOut       : 200,
      delayIn     : 200,
      fadeIn      : 200,
      fadeOut     : 200,
      onLoad      :false,
      onClose     :false,
      padding     :[0,0,0,0],
      dock         :false,
      body         :false,
      cloudHover     :true
    }   
    var config    = $.extend( defaults, externalConfig );    
    var reset = 0;
    return $(this).live(config.action , function(e) {
      config.trigger = $(this);
      if (config.timer) clearTimeout(config.timer);
      reset = 1;
      if ($('body').find('.' + config.cloud).length > 0)  {
        var time = 0; 
      } else {
        var time = config.fadeIn;
      }
      $('.' + config.cloud).stop(true);
      clear(config.previousTrigger);
      config.previousTrigger = config.trigger;
      if (typeof(config.body) == 'object' || config.body == 'next' || config.body == 'prev') {
        if (config.body == 'next') config.handler = config.trigger.next();
        else if (config.body == 'prev') config.handler = config.trigger.prev();
        else config.handler = config.body.html(); 
        config.content = config.handler.html();       
        config.handler.html('');
      } else if (!config.body) {
        config.content = (config.trigger.attr('title')) ? config.trigger.attr('title') : '';
        config.trigger.attr('title', '');
        config.handler = true;
      } else {
        config.content = config.body;
        config.handler = false;
      }
     
      var triggerOffset = config.trigger.offset();
      $('body').append('<div class="' + config.cloud + '"><div class="' 
        + config.arrow + '"></div><div class="' + config.cloud + 'Body">' 
        + config.content + '</div></div>');
      
      $cloud = new Array();
      $arrow = new Array();
      $cloud  = $('.' + config.cloud);
      $body   = $('.' + config.cloud + 'Body');
      $arrow  = $('.' + config.arrow);
      if(!(config.position instanceof Array)) {
        config.position = config.position.split(' ');
      }
      var coordinates = new Array();
      coordinates['cloud'] = new Array();
      coordinates['arrow'] = new Array(); 

      $body.css({
        'padding': config.padding[0] + 'px ' + config.padding[1] + 'px ' +
          config.padding[2] + 'px ' + config.padding[3] + 'px'
      });
      
      $arrow.css({
        'position'  : 'absolute',
        'top'       : 0,
        'left'      : 0
      });
      if (config.position[0] == 'top' || config.position[0] == 'bottom') {
        if (config.position[1] == 'left') {
          coordinates['cloud']['horizontal'] = triggerOffset.left;
          coordinates['arrow']['horizontal'] = 0 ;
        } else if (config.position[1] == 'center') {  
          coordinates['cloud']['horizontal'] = triggerOffset.left  - 
            ($cloud.outerWidth() - config.trigger.outerWidth()) / 2;
          coordinates['arrow']['horizontal'] = ($cloud.outerWidth() - $arrow.outerWidth()) / 2;
        } else if (config.position[1] == 'right') {
          coordinates['cloud']['horizontal'] = triggerOffset.left -
            ($cloud.outerWidth() - config.trigger.outerWidth());            
          coordinates['arrow']['horizontal'] = $cloud.innerWidth() -
            $arrow.outerWidth();
        } else alert('Błędnie podany parametr pozycji elementu \'poprawny błędny\'');
       
        if (config.position[0] == 'top') {
          coordinates['cloud']['vertical'] = triggerOffset.top - 
            $cloud.outerHeight() - $arrow.outerHeight();
          coordinates['arrow']['vertical'] = $cloud.innerHeight();
          coordinates['arrow']['css'] = 3 * ($arrow.height() + 1);
        } else if (config.position[0] == 'bottom') {
          coordinates['cloud']['vertical'] = triggerOffset.top + config.trigger.outerHeight() +
            $arrow.outerHeight();
          coordinates['arrow']['vertical'] = - $arrow.outerHeight();
          coordinates['arrow']['css'] = 2 * ($arrow.height() + 1);
        }
      } else if (config.position[0] == 'left' || config.position[0] == 'right') {
        if (config.position[1] == 'top') {
          coordinates['cloud']['vertical'] = triggerOffset.top;
          coordinates['arrow']['vertical'] = 0 ;
        } else if (config.position[1] == 'center') {  
          coordinates['cloud']['vertical'] = triggerOffset.top - 
            ($cloud.outerHeight() - config.trigger.outerHeight()) / 2;
          coordinates['arrow']['vertical'] = ($body.outerHeight() - $arrow.outerHeight()) / 2;
        } else if (config.position[1] == 'bottom') {
          coordinates['cloud']['vertical'] = triggerOffset.top - 
            ($cloud.outerHeight() - config.trigger.outerHeight());         
          coordinates['arrow']['vertical'] = $body.outerHeight() - $arrow.outerHeight();
        } else alert('Błędnie podany parametr pozycji elementu \'błędny poprawny\'');
       
        if (config.position[0] == 'left') {
          coordinates['cloud']['horizontal'] = triggerOffset.left - $arrow.outerWidth() - 
            $cloud.outerWidth();
          coordinates['arrow']['horizontal'] = $cloud.innerWidth();
          coordinates['arrow']['css'] = 1 * ($arrow.height() + 1);
        } else if (config.position[0] == 'right') {
          coordinates['cloud']['horizontal'] = triggerOffset.left + $arrow.outerWidth() + 
            config.trigger.outerWidth();
          coordinates['arrow']['horizontal'] = - $arrow.outerWidth();
          coordinates['arrow']['css'] = 0 * ($arrow.height() + 1);
        }
      }
      if (config.dock) {
        var containerOffset = config.container.offset();
        if (config.dock == 'right') {
          coordinates['cloud']['horizontal'] = containerOffset.left -
            ($cloud.outerWidth() - config.container.innerWidth());
        } else if (config.dock == 'left') {
          coordinates['cloud']['horizontal'] = containerOffset.left;
        } else if (config.dock == 'center') {
          coordinates['cloud']['horizontal'] = containerOffset.left - 
            ($cloud.outerWidth() - config.container.innerWidth()) / 2;
        }
        coordinates['arrow']['horizontal'] = triggerOffset.left - coordinates['cloud']['horizontal'] +
          (config.trigger.outerWidth() - $arrow.outerWidth()) / 2;
      }
      $cloud.css({
        'left':coordinates['cloud']['horizontal'] + config.offset[0] + 'px',
        'top':coordinates['cloud']['vertical'] + config.offset[1] + 'px',
        'position':'absolute',
        'display' :'none'
      });
      $arrow.css({
        'left' : coordinates['arrow']['horizontal'] + config.arrowOffset[0] + 'px',
        'top'  : coordinates['arrow']['vertical'] + config.arrowOffset[1] + 'px',
        'background-position' : '-' + coordinates['arrow']['css'] + 'px 0px'
      });
      if (config.content !='') {
        $cloud.fadeIn(time); 
      }
      $cloud.find('input:text, textarea').blur(function() {                     
        reset = 0;
        close();
      }).focus(function() {
        reset = 1;
        if (config.timer) clearTimeout(config.timer);
      });
      if (config.onLoad) {
        config.onLoad();
      }
      
      if (config.cloudHover) {
        $cloud.bind('mouseenter click', function(){
           reset = 1;
        }).mouseleave(function() {
          reset = 0; 
          if(!($cloud.find('input:text, textarea').is(':focus'))) {
            close();
          }
        });
      }
      
    }).mouseleave(function() {
      reset = 0; 
      if(!($('.' + config.cloud).find('input:text, textarea').is(':focus'))) {
        close();
      }
    }).mouseenter(function() {
      reset = 1;      
    });
    
    $(document).click(function() {
      if (reset == 0)
        clear(config.trigger);
    });
    
    if(!Array.indexOf){
      Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
          if(this[i]==obj){
            return i;
          }
        }
        return -1;
      }
    }
    
    function close() 
    { 
      if (config.timer) clearTimeout(config.timer);
      config.timer = setTimeout(function() { 
        if (reset == 0) {
          $('.' + config.cloud).stop(true);
          clear(config.trigger);
        }
      }, config.delayOut);
    }
    
    function clear(trigger) 
    {
      if ($('.' + config.cloud).length>0) {
        if (config.timer) clearTimeout(config.timer);
        if (typeof(config.handler) == 'object' && (config.handler.html() =='' || config.handler.html() == $('.' + config.cloud + 'Body').html())) {
          config.handler.html($('.' + config.cloud + 'Body').html());
        } else if (config.handler && (trigger.attr('title') == '' || trigger.attr('title') == $('.' + config.cloud + 'Body').html())) {
          trigger.attr('title',$('.' + config.cloud + 'Body').html());
        }
      }
      if (config.onClose) {
        config.onClose();
      }
      $('.' + config.cloud).remove();
    }
  }
  
  /**
   * checking element focus
   */
  jQuery.expr[':'].focus = function( elem ) {
    return elem === document.activeElement && ( elem.type || elem.href );
  };

  
  /**
   * vartical align plugin
   */
  $.fn.vAlign = function() {
    return this.each(function(i){
    var ah = $(this).height();
    var ph = $(this).parent().height();
    var mh = (ph - ah) / 2;
    $(this).css('margin-top', mh);
    });
  };



  /**
  * jQuery Color Animations
  * Copyright 2007 John Resig
  * Released under the MIT and GPL licenses.
  */

  // We override the animation for all of these color styles
  jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
    jQuery.fx.step[attr] = function(fx){
      if ( fx.state == 0 ) {
        fx.start = getColor( fx.elem, attr );
        fx.end = getRGB( fx.end );
      }

      fx.elem.style[attr] = "rgb(" + [
        Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
        Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
        Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
      ].join(",") + ")";
    }
  });

  // Color Conversion functions from highlightFade
  // By Blair Mitchelmore
  // http://jquery.offput.ca/highlightFade/

  // Parse strings looking for color tuples [255,255,255]
  function getRGB(color) {
    var result;

    // Check if we're already dealing with an array of colors
    if ( color && color.constructor == Array && color.length == 3 )
      return color;

    // Look for rgb(num,num,num)
    if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
      return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];

    // Look for rgb(num%,num%,num%)
    if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
      return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

    // Look for #a0b1c2
    if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
      return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

    // Look for #fff
    if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
      return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

    // Otherwise, we're most likely dealing with a named color
    return colors[jQuery.trim(color).toLowerCase()];
  }
  
  function getColor(elem, attr) {
    var color;

    do {
      color = jQuery.curCSS(elem, attr);

      // Keep going until we find an element that has color, or we hit the body
      if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
        break; 

      attr = "backgroundColor";
    } while ( elem = elem.parentNode );

    return getRGB(color);
  };
  
  // Some named colors to work with
  // From Interface by Stefan Petre
  // http://interface.eyecon.ro/

  var colors = {
    aqua:[0,255,255],
    azure:[240,255,255],
    beige:[245,245,220],
    black:[0,0,0],
    blue:[0,0,255],
    brown:[165,42,42],
    cyan:[0,255,255],
    darkblue:[0,0,139],
    darkcyan:[0,139,139],
    darkgrey:[169,169,169],
    darkgreen:[0,100,0],
    darkkhaki:[189,183,107],
    darkmagenta:[139,0,139],
    darkolivegreen:[85,107,47],
    darkorange:[255,140,0],
    darkorchid:[153,50,204],
    darkred:[139,0,0],
    darksalmon:[233,150,122],
    darkviolet:[148,0,211],
    fuchsia:[255,0,255],
    gold:[255,215,0],
    green:[0,128,0],
    indigo:[75,0,130],
    khaki:[240,230,140],
    lightblue:[173,216,230],
    lightcyan:[224,255,255],
    lightgreen:[144,238,144],
    lightgrey:[211,211,211],
    lightpink:[255,182,193],
    lightyellow:[255,255,224],
    lime:[0,255,0],
    magenta:[255,0,255],
    maroon:[128,0,0],
    navy:[0,0,128],
    olive:[128,128,0],
    orange:[255,165,0],
    pink:[255,192,203],
    purple:[128,0,128],
    violet:[128,0,128],
    red:[255,0,0],
    silver:[192,192,192],
    white:[255,255,255],
    yellow:[255,255,0]
  };
    

  /*
  * Print Element Plugin 1.2
  *
  * Copyright (c) 2010 Erik Zaadi
  *
  * Inspired by PrintArea (http://plugins.jquery.com/project/PrintArea) and
  * http://stackoverflow.com/questions/472951/how-do-i-print-an-iframe-from-javascript-in-safari-chrome
  *
  *  Home Page : http://projects.erikzaadi/jQueryPlugins/jQuery.printElement 
  *  Issues (bug reporting) : http://github.com/erikzaadi/jQueryPlugins/issues/labels/printElement
  *  jQuery plugin page : http://plugins.jquery.com/project/printElement 
  *  
  *  Thanks to David B (http://github.com/ungenio) and icgJohn (http://www.blogger.com/profile/11881116857076484100)
  *  For their great contributions!
  * 
  * Dual licensed under the MIT and GPL licenses:
  *   http://www.opensource.org/licenses/mit-license.php
  *   http://www.gnu.org/licenses/gpl.html
  *   
  *   Note, Iframe Printing is not supported in Opera and Chrome 3.0, a popup window will be shown instead
  */
  ;(function(g){function k(c){c&&c.printPage?c.printPage():setTimeout(function(){k(c)},50)}function l(c){c=a(c);a(":checked",c).each(function(){this.setAttribute("checked","checked")});a("input[type='text']",c).each(function(){this.setAttribute("value",a(this).val())});a("select",c).each(function(){var b=a(this);a("option",b).each(function(){b.val()==a(this).val()&&this.setAttribute("selected","selected")})});a("textarea",c).each(function(){var b=a(this).attr("value");if(a.browser.b&&this.firstChild)this.firstChild.textContent=
  b;else this.innerHTML=b});return a("<div></div>").append(c.clone()).html()}function m(c,b){var i=a(c);c=l(c);var d=[];d.push("<html><head><title>"+b.pageTitle+"</title>");if(b.overrideElementCSS){if(b.overrideElementCSS.length>0)for(var f=0;f<b.overrideElementCSS.length;f++){var e=b.overrideElementCSS[f];typeof e=="string"?d.push('<link type="text/css" rel="stylesheet" href="'+e+'" >'):d.push('<link type="text/css" rel="stylesheet" href="'+e.href+'" media="'+e.media+'" >')}}else a("link",j).filter(function(){return a(this).attr("rel").toLowerCase()==
  "stylesheet"}).each(function(){d.push('<link type="text/css" rel="stylesheet" href="'+a(this).attr("href")+'" media="'+a(this).attr("media")+'" >')});d.push('<base href="'+(g.location.protocol+"//"+g.location.hostname+(g.location.port?":"+g.location.port:"")+g.location.pathname)+'" />');d.push('</head><body style="'+b.printBodyOptions.styleToAdd+'" class="'+b.printBodyOptions.classNameToAdd+'">');d.push('<div class="'+i.attr("class")+'">'+c+"</div>");d.push('<script type="text/javascript">function printPage(){focus();print();'+
  (!a.browser.opera&&!b.leaveOpen&&b.printMode.toLowerCase()=="popup"?"close();":"")+"}<\/script>");d.push("</body></html>");return d.join("")}var j=g.document,a=g.jQuery;a.fn.printElement=function(c){var b=a.extend({},a.fn.printElement.defaults,c);if(b.printMode=="iframe")if(a.browser.opera||/chrome/.test(navigator.userAgent.toLowerCase()))b.printMode="popup";a("[id^='printElement_']").remove();return this.each(function(){var i=a.a?a.extend({},b,a(this).data()):b,d=a(this);d=m(d,i);var f=null,e=null;
  if(i.printMode.toLowerCase()=="popup"){f=g.open("about:blank","printElementWindow","width=650,height=440,scrollbars=yes");e=f.document}else{f="printElement_"+Math.round(Math.random()*99999).toString();var h=j.createElement("IFRAME");a(h).attr({style:i.iframeElementOptions.styleToAdd,id:f,className:i.iframeElementOptions.classNameToAdd,frameBorder:0,scrolling:"no",src:"about:blank"});j.body.appendChild(h);e=h.contentWindow||h.contentDocument;if(e.document)e=e.document;h=j.frames?j.frames[f]:j.getElementById(f);
  f=h.contentWindow||h}focus();e.open();e.write(d);e.close();k(f)})};a.fn.printElement.defaults={printMode:"iframe",pageTitle:"",overrideElementCSS:null,printBodyOptions:{styleToAdd:"padding:10px;margin:10px;",classNameToAdd:""},leaveOpen:false,iframeElementOptions:{styleToAdd:"border:none;position:absolute;width:0px;height:0px;bottom:0px;left:0px;",classNameToAdd:""}};a.fn.printElement.cssElement={href:"",media:""}})(window);

  /**
   * gallery view plugin
   */
   
  $.fn.bigShow = function( externalConfig ) {   
    /* declaration of default config */  
    var defaults = {
      name      : 'bigShow',
      layout    : '<div></div>',
      advanced  : true,
      fixed     : true,
      images    : {
        thumbs  : {element : [], attr : 'href'},
        large   : {element : [], attr : 'href'},
        active  : 0,
        fadeIn  : 500,
        fadeOut : 200
      },
      thumbsbox : {
        layout  : '<div><div class="thumbsBoxRight"><div class="insert"></div></div></div>',
        speed   : 300,
        easing  : 'swing',
        pointer : { 
          layout  : '<div></div>', 
          offset  : [-2, -1],
          speed   : 500,
          easing  : 'swing'
        }
      },
      thumbs    : {
        layout  : '<div><div><div></div></div></div>',
        spacing : 10,
        fadeIn  : 500
      },
      controllers : {
        layout  : '<div></div>',
        offset  : [0, 0],
        fadeIn  : 500
      },
      display   : {
        layout  : '<div> <div class="bigShowDisplayTopLeft"><div class="bigShowDisplayTopRight"><div class="bigShowDisplayTop"></div></div></div> <div class="bigShowMiddleLeft"><div class="bigShowMiddleRight"><div class="insert" style="position:realtive;"></div></div></div> <div class="bigShowDisplayBottomLeft"><div class="bigShowDisplayBottomRight"><div class="bigShowDisplayBottom"></div></div></div> </div>',
        margin  : [20, 20, 20, 20],
        speed   : 200,
        easing  : 'swing',
        preload : {
          width   : 200,
          height  : 100
        }
      },
      overlay   : {
        opacity : 1,
        layout  : '<div></div>',
        active  : true,
        fadeIn  : 200,
        fadeOut : 800
      },
      close     : {
        layout  : '<div></div>',
        fadeOut : 200
      },
      taskbar   : {
        layout  : '<div><div class="image-enlarge"></div></div>'
      },
      methods   : {}
    }  
    
    defaults.thumbsbox.name           = defaults.name + 'Thumbsbox';
    defaults.thumbsbox.pointer.name   = defaults.name + 'ThumbsboxPointer';
    defaults.thumbs.name              = defaults.name + 'Thumb';
    defaults.controllers.name         = defaults.name + 'Controller';
    defaults.controllers.left         = defaults.name + 'ControllerLeft';
    defaults.controllers.right        = defaults.name + 'ControllerRight';
    defaults.display.name             = defaults.name + 'Display';
    defaults.overlay.name             = defaults.name + 'Overlay';
    defaults.close.name               = defaults.name + 'CloseButton';
    defaults.taskbar.name             = defaults.name + 'TaskBar';
    
    /* end of :: declaration of default config */
    
    var c = $.extend(true, defaults, externalConfig );    
    c.thumbsbox.layout  = c.thumbsbox.layout.replace('insert', c.thumbsbox.name + 'Insert');
    c.thumbs.layout     = c.thumbs.layout.replace('insert', c.thumbs.name + 'Insert');
    c.display.layout    = c.display.layout.replace('insert', c.display.name + 'Insert');
    var images = [];

    /* defined functions */
    c.methods.movePointer = function($obj) {
      $('.' + c.thumbs.name).removeClass(c.thumbs.name + 'Active');
      $obj.addClass(c.thumbs.name + 'Active');
      $('.' + c.thumbsbox.pointer.name).stop(true).animate({left : parseInt($obj.css('left')) + c.thumbsbox.pointer.offset[0] + 'px'}, c.thumbsbox.pointer.speed, c.thumbsbox.pointer.easing);
    }
    
    c.methods.displayResize = function(dynamic) {
      c.window.width  = $(window).width();
      c.window.height = $(window).height();
      
      $image = $('.' + c.display.name).find('img:first');
      if (typeof images[c.images.active].default_width == 'undefined') images[c.images.active].default_width = $image.width();
      if (typeof images[c.images.active].default_height == 'undefined') images[c.images.active].default_height = $image.height();
      
      var constraints = setDisplayConstraints();
      var dimmensions = { 
        width  : images[c.images.active].default_width, 
        height : images[c.images.active].default_height
      }
      $('.' + c.display.name + 'Constraint').css({height : constraints.height + 'px', width : constraints.width + 'px', margin: c.display.margin[0] + 'px auto ' + c.display.margin[2] + 'px auto'});
      dimmensions = calculateDimmensions(dimmensions.width, dimmensions.height, constraints.width, constraints.height, images[c.images.active].default_width, images[c.images.active].default_height);
      if (dynamic === 'true') {
        $image.css({'width' : dimmensions.width - 40 + 'px', 'height' : dimmensions.height + 'px'});
        $('.' + c.display.name).css({
          width  : dimmensions.width - 20 + 'px', 
          'height' : dimmensions.height + 'px',
          top    : (constraints.height - dimmensions.height) / 2 + 'px',
          left   : (constraints.width - dimmensions.width) / 2 + 'px'
        });
        $('.' + c.overlay.name).css({width : '100%'});      
        $('.' + c.controllers.name).css({height : c.window.height});
      } else {
        $image.css({
          'width'   : dimmensions.width - 20 + 'px',
          'height'  : dimmensions.height - 20 + 'px'
        });
        if (Math.abs($('.' + c.display.name).width() - dimmensions.width) < 2  && Math.abs($('.' + c.display.name).height() == dimmensions.height) < 2) {
          $image.stop(true, true).fadeIn(c.images.fadeIn, function() {
            $(this).siblings('img').remove();
          });
          
        } else {

          var shiftImage = function () {
            
            $('.' + c.display.name).stop(true, true).animate({
                width  : dimmensions.width + 'px',
                height : dimmensions.height + 'px',
                top    : Math.round((constraints.height - dimmensions.height) / 2) + 'px',
                left   : Math.round((constraints.width - dimmensions.width) / 2) + 'px'
            }, {
                duration: c.display.speed,
                easing: c.display.easing,
                complete: function() {
                    $(this).find('img:first').stop(true, true).fadeIn(c.images.fadeIn);
                },
                queue: false
            });

          }
          if ($('.' + c.display.name).find('img').length >1)
            $('.' + c.display.name).find('img').eq(1).stop(false, true).fadeOut(c.images.fadeOut, function() {
              $(this).remove();
              shiftImage();
            });
          else shiftImage();
        }
      }
    }
      
    c.methods.rotateImage = function(index) {
      if (index === 'prev') {
        c.images.active = (typeof images[c.images.active - 1] == 'undefined') ? c.images.thumbs.element.length-1 : c.images.active - 1;
      } else if (index === 'next') {
        c.images.active = (typeof images[c.images.active + 1] == 'undefined') ? 0 : c.images.active + 1;
      } else {
        c.images.active = index;
      }
      $image = $(images[c.images.active]).css({position:'absolute', top:0, left:0, 'z-index':447}).hide();
      $('.' + c.display.name).find('img').eq(1).remove();
      $('.' + c.display.name).find('img').css({'z-index':446}).stop(true, true).before($image);
      c.methods.displayResize();
    }
    
    c.methods.close = function() {
      $('.' + c.overlay.name).fadeOut(c.overlay.fadeOut);
      $('.' + c.name).fadeOut(c.close.fadeOut, function() {$(this).remove()});
    }
    
    c.methods.getImage = function() {
      return $('.' + c.display.name).find('img').attr('src');
    }
    
    function calculateDimmensions(dimmX, dimmY, consX, consY, srcX, srcY) {
      if (dimmX > consX || dimmY > consY) {
        if ((consX / dimmX) >= (consY / dimmY)) {
          dimmX = typeof srcX == 'undefined' && typeof srcY == 'undefined' ? Math.round(consY * dimmX / dimmY) : Math.round(consY * srcX / srcY);
          dimmY = consY;
        } else {
          dimmY = typeof srcX == 'undefined' && typeof srcY == 'undefined' ? Math.round(consX * dimmY / dimmX) : Math.round(consX * srcY / srcX);
          dimmX = consX;
        }
      }
      return {width : dimmX, height : dimmY};
    }
    
    function setDisplayConstraints() {
      var css = {
        width  : Math.round(c.window.width - $('.' + c.controllers.name).outerWidth(true) * 2 - (c.display.margin[1] + c.display.margin[3])),
        height : Math.round(c.window.height - $('.' + c.thumbsbox.name).outerHeight(true) - (c.display.margin[0] + c.display.margin[2] - parseInt($('.' + c.thumbsbox.name).css('marginBottom'))))
      }
      return css;
    }
    /* end of:: defined functions */
   
    return this.live('click', function(e) { 
      e.preventDefault();
      $this = $(this);      

      /* getting document information */
      c.document = {
        width  : $(document).width(),
        height : $(document).height()
      }
      c.window = {
        width  : $(window).width(),
        height : $(window).height()
      }
      /* end of :: getting document information */
      
      /* getting current image index */
      $.each(c.images.large.element, function(index) {
        if ($(this).attr(c.images.large.attr) == $this.attr(c.images.large.attr)) {
          c.images.active = index;
        }
      });
     
      /* creating overlay */
      if (! $('.' + c.overlay.name).length) {
        $(c.overlay.layout).addClass(c.overlay.name).css({
          opacity : c.overlay.opacity,
          position: 'absolute',
          top     : 0,
          left    : 0,
          width   : c.document.width,
          height  : c.document.height
        }).hide().appendTo($('body')).fadeIn(c.overlay.fadeIn);
      } else {
        $('.' + c.overlay.name).fadeIn(c.overlay.fadeIn);
      }
      /* end of::creating overlay */
      
      /* creating root container */
      $(c.layout).addClass(c.name).css({
        width     : '100%', 
        height    : '100%',
        position  : (c.fixed === true) ? 'fixed' : 'absolute',
        top       : 0,
        left      : 0
      }).appendTo($('body'));
      /* end of::creating root container */
      
      /* creating controllers */
      if (c.images.thumbs.element.length > 1) {
        $(c.controllers.layout).addClass(c.controllers.name + ' ' + c.controllers.name + 'Left').css({left : 0 + c.controllers.offset[0]}).appendTo('.' + c.name);
        $(c.controllers.layout).addClass(c.controllers.name + ' ' + c.controllers.name + 'Right').css({right : 0 + c.controllers.offset[0]}).appendTo('.' + c.name);
        $('.' + c.controllers.name).css({
          position : 'absolute',
          top      : (c.window.height - $('.' + c.controllers.name).outerHeight(true)) / 2 + c.controllers.offset[1],
          height   : c.window.height
        }).hide().fadeIn(c.controllers.fadeIn);      
        var direction = ['Left', 'Right'];
        $('.' + c.controllers.left).makeInteractive(c.controllers.left);
        $('.' + c.controllers.right).makeInteractive(c.controllers.right);
      }
      /* end of::creating controllers */
      
      /* creating thumbsbox */
      if (c.advanced) {
        
        $(c.thumbsbox.layout).addClass(c.thumbsbox.name).appendTo('.' + c.name);
                
        $.each( c.images.thumbs.element, function(index) {
          var thumb = new Image();
          if ($('.' + c.thumbs.name).length > 0) {
            $(c.thumbs.layout).addClass(c.thumbs.name).insertAfter($('.' + c.thumbs.name + ':last'));
          } else {
            $(c.thumbs.layout).addClass(c.thumbs.name).appendTo($('.' + c.thumbsbox.name).find(($('.' + c.thumbsbox.name +'Insert').length > 0) ? '.' + c.thumbsbox.name + 'Insert' : ':last'));
          }
          $(thumb).hide().load(function() {$(this).fadeIn(c.thumbs.fadeIn)}).attr('src', $(this).attr(c.images.thumbs.attr))
            .appendTo($('.' + c.thumbs.name + ':last').find(($('.' + c.thumbs.name + 'Insert').length > 0) ? '.' + c.thumbs.name + 'Insert' : ':last'));
        });
        $('.' + c.thumbs.name).eq(c.images.active).addClass(c.thumbs.name + 'Active');
        
        $('.' + c.thumbsbox.name).css({
          width     : 12 + 'px',
          height    : $('.' + c.thumbs.name).outerWidth(true) + 'px',
          overflow  : 'hidden',
          position  : 'relative'
        });

        $('.' + c.thumbs.name).each(function(index) {
          $thumb = $(this).find('img');
          $(this).css({
            position        : 'absolute',
            left          : parseInt($('.' + c.thumbsbox.name + 'Insert').css('paddingLeft')) + ($('.' + c.thumbs.name).outerWidth(true) + c.thumbs.spacing) * index + 'px',
            top           : ($('.' + c.thumbsbox.name + 'Insert').length > 0) ? $('.' + c.thumbsbox.name + 'Insert').css('padding-top') : 0
          });
          var dimm = calculateDimmensions($thumb.outerWidth(true), $thumb.outerHeight(true), $('.' + c.thumbs.name).eq(index).width(), $('.' + c.thumbs.name).eq(index).height());
          $(this).find('img').css({
            'width'       : dimm.width + 'px',
            'height'      : dimm.height + 'px',
            'margin'      : 'auto'
          });
        });
        $('.' + c.thumbs.name).makeInteractive(c.thumbs.name).click(function() {
          if (!$(this).hasClass(c.thumbs.name + 'Active')) {
            c.methods.movePointer($(this));          
            c.methods.rotateImage($(this).index());
          }
        }).find('img').vAlign();
        
        $(c.thumbsbox.pointer.layout).addClass(c.thumbsbox.pointer.name).appendTo(($('.' + c.thumbsbox.name +'Insert').length > 0) ? '.' + c.thumbsbox.name + 'Insert' : '.' + c.thumbsbox.name).hide();
        $('.' + c.thumbsbox.pointer.name).css({
          position  : 'absolute',
          top       : parseInt($('.' + c.thumbs.name).eq(c.images.active).css('top')) + c.thumbsbox.pointer.offset[1],
          left      : parseInt($('.' + c.thumbs.name).eq(c.images.active).css('left')) + c.thumbsbox.pointer.offset[0] 
        });
        
        $('.' + c.thumbsbox.name).animate({width : $('.' + c.thumbsbox.name).width() + $('.' + c.thumbsbox.name + 'Insert').outerWidth(true)/2 + ($('.' + c.thumbs.name).outerWidth(true)) * c.images.thumbs.element.length + c.thumbs.spacing * (c.images.thumbs.element.length-1)}, c.thumbsbox.speed, c.thumbsbox.easing, function() {$('.' + c.thumbsbox.pointer.name).show()});        
      }
      /* end of::creating thumbsbox */
     
      var constraints = setDisplayConstraints();
      /* creating display */
      $.each( c.images.large.element, function(index) {
        var image = new Image();  
        image.src = c.images.large.element.eq(index).attr(c.images.large.attr);
        images.push(image); 
      });
      $('.' + c.name).append($('<div></div>').addClass(c.display.name + 'Constraint').append(
          $(c.display.layout).addClass(c.display.name).css({position : 'absolute', width : c.display.preload.width + 'px', height : c.display.preload.height + 'px'})
        )
      );
      $('.' + c.display.name + 'Constraint').css({height : constraints.height + 'px', width : constraints.width + 'px', margin: c.display.margin[0] + 'px auto ' + c.display.margin[2] + 'px auto', position : 'relative'});
      $('.' + c.display.name).css({top: (constraints.height - c.display.preload.height) / 2 + 'px', left: (constraints.width - c.display.preload.width) / 2 + 'px'})
      $(images[c.images.active]).hide().load(function() {
        $('.' + c.display.name).find(($('.' + c.display.name +'Insert').length > 0) ? '.' + c.display.name + 'Insert' : ':last').append($(this));   
          
        /* creating close button */
        $('.' + c.display.name).find('img').after($(c.close.layout).addClass(c.close.name).css({position : 'absolute', top : 0, right : 0}));
        $('.' + c.close.name).makeInteractive(c.close.name).click(function() {c.methods.close()});
        /* end of::creating close button */
               
        /* creating taskbar */
        $(c.taskbar.layout).addClass(c.taskbar.name).css({position : 'absolute', bottom : 0, right : 0}).insertAfter($('.' + c.display.name).find('img'));
        /* end of::creating taskbar */
        
        $('.' + c.name).data('methods', c.methods);

        c.methods.displayResize();
      }).attr('src', c.images.large.element.eq(c.images.active).attr(c.images.large.attr));
      /* end of::creating display */

      /* changing images with controller */
      $('.' + c.controllers.name).click(function() {
        if ($(this).hasClass(c.controllers.name + 'Left')) {
          if (c.advanced) {
            c.methods.movePointer(($('.' + c.thumbs.name + 'Active').prev('.' + c.thumbs.name).length > 0) ? $('.' + c.thumbs.name + 'Active').prev() : $('.' + c.thumbs.name + 'Active').siblings('.' + c.thumbs.name+ ':last'));
          }
          c.methods.rotateImage('prev');
        } else {
          if (c.advanced) {
            c.methods.movePointer(($('.' + c.thumbs.name + 'Active').next('.' + c.thumbs.name).length > 0) ? $('.' + c.thumbs.name + 'Active').next() : $('.' + c.thumbs.name + 'Active').siblings('.' + c.thumbs.name+ ':first'));
          }          
          c.methods.rotateImage('next');
        }
      });
      /* end of::changing images with controller */
      
      if (c.overlay.active === true) $('.' + c.name).add('.' + c.display.name + 'Constraint').click(function(event) {
        if(event.target !== this) return true; 
        c.methods.close()
      });
      
      /* on window resize event */
      $(window).resize(function() {
        c.methods.displayResize('true');
      });
      /* end of::on window resize event */
     
    });
  }
  
  /*
   * plugin autocomplete
   */
  $.fn.universalAutoComplete = function( externalConfig ) {     
    var defaults = {
      url     : 'katalog/szukaj.php?akcja=ajaxAutoComplete',
      offset  : [20, 0]
    }   
    var c = $.extend( defaults, externalConfig );
    function close() {
      $('.autoComplete').remove();
    }
    function highlight(element, value) {
      var regexp = new RegExp('^(.*)(' + value + ')(.*)$', 'i');
      return element.replace(regexp, '$1<span class="autoCompleteHighlight" style="font-weight:bold">$2</span>$3');
    }
    return this.each(function(e) {
      var handler  = $(this);
      var jqxhr    = {};
      var input    = handler.find('input:text');
      input.bind('keyup mouseup', function(e) {
        var value = $(this).val();
        if (value.length >= 3) {
          var matches = $('.autoComplete').text().match(new RegExp(input.val(), 'gi'));
          var code = (e.keyCode ? e.keyCode : e.which);
          
          if ($('.autoComplete').length > 0 && code != 8 && matches != null && matches.length >= $('.autoComplete li').length) {
            $('.autoComplete li').each(function() {
              $(this).html(highlight($(this).text(), input.val()));
            });
          } else {
            if (this.timer) clearTimeout(this.timer);
            this.timer = setTimeout(function () {
              jqxhr = $.getJSON(c.url + '&query=' + $.trim(value), function(output) {
                close();
                if (output.length > 0) {
                  var offset = handler.offset();
                  $('<ul style="background-color:#ffffff;border:1px solid black;padding:10px 0;margin:0px;list-style-type:none"/>').appendTo('body').wrap('<div class="autoComplete" style="z-index:777"></div>');
                  $.each(output, function(index) {
                    output[index] = highlight(output[index], input.val());
                    $('.autoComplete ul').append($('<li style="padding:5px 10px;" />').makeInteractive('autoCompleteElement').html(output[index]).click(function() {
                      input.val($(this).text());
                      close();
                    }));
                  });
                  $('.autoComplete').css({position : 'absolute', top : offset.top + handler.outerHeight(true) + c.offset[1] + 'px', left : offset.left + c.offset[0] + 'px'})
                    .mouseleave(function() {this.timer = setTimeout(close, 1000); $(this).removeClass('autoCompleteHover')})
                    .mouseenter(function() {if(this.timer) clearTimeout(this.timer);$(this).addClass('autoCompleteHover')});
                }
              });
            }, 50);
          }  
        } else {
          if (!$.isEmptyObject(jqxhr)) {jqxhr.abort();}
          close();
        }
      });
      handler.find('input:text').blur(function() {
        if (!$.isEmptyObject(jqxhr)) {jqxhr.abort();}
        if (!$('.autoComplete').hasClass('autoCompleteHover'))
          close();
      });      
    });
  }

  $.fn.makeInteractive = function(name) {
    return this.live('mouseover', function() {
        $(this).addClass(name + 'Hover');
    }).live('mouseout', function() {
        $(this).removeClass(name + 'Hover');
    }).live('mousedown', function() {
        $(this).addClass(name + 'Clicked');
    }).live('mouseup', function() {
        $(this).removeClass(name + 'Clicked');
    });
  }

  $('#sbClose').makeInteractive('sbClose');
  $('.sbrClose').makeInteractive('sbrClose').live('click', function() {
    var productId = $(this).find('input[name=productId]').val();
    $('#item' + productId).fadeOut(300);
    
    var page_location = $('input[name=page_location]').val();
    var path_prefix;
      if(page_location == 'root') {
          path_prefix = 'katalog/';
      } else {
          path_prefix = '';
      }

    $.ajax({
        url: path_prefix + 'porownywarka.php',
        data: {id: productId, subject: 'ajaxRmvFromCmp'},
        success: function(data) {
            $('#cmpBtn').find('span').html(data);
            $('#id_' + productId).find('.cmpBtn').attr('title', 'Dodaj produkt do porównania').removeClass('cmpBtnOn cmpClicked');
            if(data == 0 || data == 1) {
                if($('#rollTop').css('display') == 'block') {
                    $('#cmpBtn').hide();
                } else {
                    $('#cmpBtn').hide();
                    if($('#favBtn').css('display') != 'block') {
                        $('#snapper').hide();
                    }
                }
                if(data == 0) {
                    $.fn.colorbox.close(); 
                }
            }
        }
    });
  });
  
  $('#deleteAllFromCmp').live('click', function() {
    var page_location = $('input[name=page_location]').val();
    var path_prefix;
      if(page_location == 'root') {
          path_prefix = 'katalog/';
      } else {
          path_prefix = '';
      }
      
      $.ajax({
          url: path_prefix + 'porownywarka.php',
          data: {subject: 'ajaxRmvAllFromCmp'},
          success: function() {
              $('#cmpBtn').find('span').html('0');
              if($('#rollTop').css('display') == 'block') {
                  $('#cmpBtn').hide();
              } else {
                  $('#cmpBtn').hide();
                  if($('#favBtn').css('display') != 'block') {
                    $('#snapper').hide();
                  }
              }
              
              $('.cmpBtn').each(function() {
                  $(this).attr('title', 'Dodaj produkt do prównania').removeClass('cmpBtnOn cmpClicked');
              });
              
              $.fn.colorbox.close();
          }
      });
  });
 
})(jQuery);
