/**
 * 	jQuery.fn - jQuery Functions
*/

var fn = {};
var Dropdown = {};

(function($) {
    fn = $.fn;
    epoint = {fn : fn};
    
    globalEnv = {
    	POPUP_INTERVAL: false,
    	DROPDOWN_INTERVAL: false,
    	IE6: $.browser.msie && $.browser.version=="6.0" ? true : false,
    	HIDDEN_SELECT_FIELDS: false,
    	BLOCK_HIDING_LAYERS: false,
    	IS_DROPDOWN_OPENED: false,
    	DEFINED_HIDE_TIMEOUT: false,
    	SET_POSITION_INTERVAL: false,
    	TEMPORARY_POPUP_POSITION: false,
    	MZ: { close : "close" }
    };

/**
 * Compare globalEnv & localEnv
 * @param opts module params
 * @return object
 */
  fn.addEnv = function(/* object */ opts) {
    return $.extend(globalEnv, opts);
  };

/**
 * 1. Funkcja sprawdza czy obiekt jquerowy nie jest pusty
 */
	fn.exists = function() {
		//Użycie: jquery_obj.exists()
		return ($(this).size() > 0);
	}
	
/**
 *	Funkcja pokazująca okno modalne
 */
	fn.popup = function(/*String*/ layerId, /*Object*/ options) {
	 	Dropdown.hideDropdown();
		var $msg = $("#"+layerId);
				
	  if (!globalEnv.popups) {
      fn.addEnv({popups: {}});  
    }
		globalEnv.popups[layerId] = $msg.parent()[0];
		var o = $.extend({
      ACTIVE_POPUP_CLASS: "active_popup",
      POPUP_WIDTH: null,
      POPUP_HEIGHT: null,
      AUTOFOCUS: null,
      CALLBACK: null
    }, options);
		
		$msg.addClass(o.ACTIVE_POPUP_CLASS);
		
		//hide select fields - only IE6!
		//fn.hideSelectFields();
		
		fn.cover();
		$msg.appendTo("body");
				
		$msg.delay(500).each(function() {
			$msg.css({
				opacity: 0,
				display: "block"
			})
			if(o.POPUP_WIDTH) { $msg.width(o.POPUP_WIDTH); }
			if(o.POPUP_HEIGHT) { $msg.width(o.POPUP_HEIGHT); }
			$msg.centreLayer();
			globalEnv.POPUP_INTERVAL = setInterval(function() { $msg.centreLayer(); }, 500);
			if(o.AUTOFOCUS) {
				$msg.find("input[type='text']").first().focus();
			}
			$msg.animate({opacity: 1},'fast', function() {
				$msg.css("filter","none");
	      if(o.CALLBACK) {
          o.CALLBACK();
        }
			});

		});
		
		// fix submitowania enterem (tylko w popup)
		var $defaultSubmits = $msg.find("input[name='default_submit']");
    $defaultSubmits.each(function() {
      $(this).css("top","").css("left","").wrap("<div class='default_submit_wrapper'>");
    });
	}
	
	fn.hidePopups = function(errorMode) {
		var isErrorMode = (errorMode && errorMode == true) ? true : false;
		clearInterval(globalEnv.POPUP_INTERVAL);
		clearInterval(globalEnv.DROPDOWN_INTERVAL);
		clearTimeout(globalEnv.DEFINED_HIDE_TIMEOUT);
		Dropdown.hideDropdown();
		var $activePopup = $(".active_popup");
		$activePopup.removeClass("active_popup").fadeOut(function() {
			$activePopup.find(".popup_content").css("height", "auto");
			$activePopup.css("top", "0");
			globalEnv.TEMPORARY_POPUP_POSITION = false;
		});
				
		if(!isErrorMode) {
			fn.cover();
		}
		
		if (globalEnv.popups && globalEnv.popups[$activePopup.attr("id")]) {
        $(globalEnv.popups[$activePopup.attr("id")]).append($activePopup);
        globalEnv.popups[$activePopup.attr("id")] = null;
    }
	}
	
/**
 * Funkcja ustawiająca warstwę centralnie na ekranie
 */
	fn.centreLayer = function() {
		var $this = $(this);
		var clientDimensions = {
			HEIGHT: $("html").attr("clientHeight"),
			WIDTH: $("html").attr("clientWidth"),
			SCROLLTOP: $(window).scrollTop()
		}

		$this
		  .css({
			   left: function() {
				    var _leftpos = Math.floor((clientDimensions.WIDTH - $this[0].scrollWidth)/2);
				    return (_leftpos > 0 ? _leftpos : 0);
			   }})

    // check to position
    var __top = Math.floor((clientDimensions.HEIGHT/2 - $this[0].offsetHeight/2) + clientDimensions.SCROLLTOP);
              
    if($this.height() > (clientDimensions.HEIGHT - 154) || __top < 0) {
      var $popupContent = $this.find(".popup_content")
      var $popupPanelsHeight = $this.height() - $popupContent.height();
      $popupContent.css("height", (clientDimensions.HEIGHT - $popupPanelsHeight - 154)).addClass("show_scrollbar");
      if($.browser.msie && $.browser.version=="6.0") {
        //$popupContent.css("width", $popupContent.width() - 16);
      }
      __top -= (5 + clientDimensions.SCROLLTOP);
      if(__top <= 0) {
      	__top = 5;
      }
      
    }

		if(parseInt($this.css('top')) != __top && globalEnv.TEMPORARY_POPUP_POSITION != __top) {
      if(globalEnv.TEMPORARY_POPUP_POSITION) {
	      $this.animate({
	          top: "+=" + (__top - parseInt($this.css('top')))
	      });
      } else {
      	$this.css("top", __top)
      }
		}

	 globalEnv.TEMPORARY_POPUP_POSITION = __top;

	}
 
/**
 * Funkcja odpowiedzialna za cover wyszarzający stronę
 */
 	fn.cover = function() {
 		function getActualDimensions() {
 			var docB = document.body;
 			var docE = document.documentElement;
 			var maxDocHeight = Math.max(docB.scrollHeight, docE.scrollHeight, 
 										docB.offsetHeight, docE.offsetHeight, 
 										docB.clientHeight, docE.clientHeight); 
 			return {
 				width: $("html").attr("clientWidth"),
 				height: maxDocHeight }
 		}
 		
 		if(!$("#cover").exists()) {
 			var $div = $("<div>"); 
 			$div
 			  .attr("id", "cover")
 				.insertBefore("#wrapper")
 				.css(getActualDimensions())
 				.css({display: "none", opacity: 0.5});
 		}
 		var $cover = $("#cover");
 		$cover.fadeToggle();
 	}

/**
 * Toggle checkbox
 */

fn.toggleCheckbox = function() {
  $(this).each(function() {
    var $this = $(this);
    if($this.is(":checked")) {
      $this.attr('checked', false);
    } else {
      $this.attr('checked', true);
    }
	});
}
 
/**
 * Change document location
 */

	fn.changeLocation = function(/* String */ url) {
		if(url) return document.location = url;
	}

/**
 * Country selector
 */
	fn.countrySelector = function(/*Event*/ e, /*HTMLInputElement*/ field, /*String*/ val) {
		var $this = $(this);
		e = $.event.fix(e);
		if(!$this.hasClass("active_country_selector")) { 
			$(".active_country_selector").fadeOut().removeClass("active_country_selector");
		}
		$this.click(function(e) { e.stopPropagation(); });
    $this.prev(".open_country_selector").click(function(e) { e.stopPropagation(); });
		e.stopPropagation();
		if(field != null) {
			field.value = val;
			$(field).change();
			$this.fadeOut();
			$this.removeClass("active_country_selector");
		} else {
			$this.fadeToggle();
			$this.toggleClass("active_country_selector");
		}
		
		$("html").click(function() { $this.fadeOut(); $this.removeClass("active_country_selector"); });
		
	}
  
/**
 * Synchronize heights elements
 */  
 
fn.synchronizeHeights = function () {
	var $elements = $(this);
	if($elements.size() == 0) return;
	var maxHeight = 0;
	$elements.each(function() {
		maxHeight = $(this).height() > maxHeight ? $(this).height() : maxHeight;
	});
	$elements.height(maxHeight);
}

/**
 * mit license. paul irish. 2010.
 * webkit fix from Oren Solomianik. thx!
*/

$.fn.imagesLoaded = function(callback){
  var elems = this.find('img'),
      len = elems.length,
      //blank = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
      blank = "/_img_common/pixel.gif";
  var $i = 1;
  $(elems).bind('load',function(i){
      if (--len <= 0 && this.src !== blank){ 
      	callback.call(elems,this);
      	$i++;
      }
  }).each(function(){
     // cached images don't fire load sometimes, so we reset src.
     if (this.complete || this.complete === undefined){
        var src = this.src;
        // webkit hack from http://groups.google.com/group/jquery-dev/browse_thread/thread/eee6ab7b2da50e1f
        // data uri bypasses webkit log warning (thx doug jones)
        this.src = blank;
        this.src = src;
     }
  });

  return this;
};

fn.hideSelectFields = function() {
	if(globalEnv.IE6) {
		//TODO
		//HIDDEN_SELECT_FIELDS
	}
}

Dropdown = {
  o: {},
  
  setWidth: function() { o.msg.width(width); },
  
  isMouseOver: false,
  
  isActiveDropdown: function() {
    return $(".active_dropdown").exists() ? true : false;
  },
  
  hideDropdown: function() {
    clearInterval(globalEnv.DROPDOWN_INTERVAL);
    clearInterval(globalEnv.SET_POSITION_INTERVAL);
    clearTimeout(globalEnv.DEFINED_HIDE_TIMEOUT);
    
    if(typeof o != 'undefined' && o != null) {
	    o.msg.stop(true, true).slideUp('slow', function() {
	      if (globalEnv.dropDownLayers && globalEnv.dropDownLayers[o.msg.attr("id")]) {
	        $(globalEnv.dropDownLayers[o.msg.attr("id")]).append(o.msg);
	        globalEnv.dropDownLayers[o.msg.attr("id")] = null;
	      }
	      o.msg.removeClass("active_dropdown");
	      o.posToEl.removeClass("active_dropdown_trigger");
	      // unbind onclick events
	      o.msg.unbind("click.msg");
	      o.el.unbind("click.el");
	    });
    }
  },
  
  setActiveElements: function() {
    o.posToEl.addClass("active_dropdown_trigger");
    o.msg.addClass("active_dropdown");
    if(o.isBottomFixedPosition) {
      o.msg.addClass("from_quick_order");
      // [IE6] fix position=fixed
      if(globalEnv.IE6) {
        o.msg.addClass('fixed_bottom');
      }
    } else {
      o.msg.removeClass("from_quick_order");
      if(globalEnv.IE6) {
        o.msg.removeClass('fixed_bottom');
      }
    }   
  },
  
  bindHideClick: function() {
      $("html").unbind("click.htmlHideClick").one("click.htmlHideClick", function() {  
         if(!globalEnv.BLOCK_HIDING_LAYERS) {
            if(globalEnv.IS_DROPDOWN_OPENED) {
              Dropdown.hideDropdown();
            }
            globalEnv.IS_DROPDOWN_OPENED = false;
          } else {
            Dropdown.bindHideClick();
            globalEnv.IS_DROPDOWN_OPENED = true;
          }
          globalEnv.BLOCK_HIDING_LAYERS = false;
      });
  },
  
  setLayerPosition: function() {
    clearInterval(globalEnv.SET_POSITION_INTERVAL);
    var $triggerPosition = o.posToEl.offset();
    
    function __setPosition(triggerPos) {
      var __top = triggerPos.top + o.posToEl.outerHeight();
      var __left = triggerPos.left;
      
      var freespace = $("html").attr("clientWidth") - (triggerPos.left + o.posToEl.outerWidth());
      o.toRight = o.toRight || o.msg.width() > freespace ? true : false;
      o.msg.css({width: o.definedWidth ? o.definedWidth : ''})
      
      // to RIGHT
      if(o.toRight) {
        __left = (__left + o.posToEl.outerWidth()) - o.msg.outerWidth();
        o.msg.addClass("to_right");
        
      }
      // to BOTTOM
      if(o.toBottom) {
        __top -= o.msg.outerHeight();
      }
      // TO BOTTOM FIXED
      if(o.isBottomFixedPosition) {
        if(!globalEnv.IE6) {
          __top = 'auto';
          o.msg.css({ bottom: 0, position: 'fixed', zIndex: 101})
        } else {
          __top = '';
        }
      } else {
        o.msg.css({ bottom: 'auto', position: 'absolute'})
      }
      
      if(o.isOpenedFromPopupLayer) {
        var $activePopup = o.posToEl.parents(".popup");
        o.msg.css("z-index", $activePopup.css("z-index") + 10);
      }
      
      o.msg.css({ 
        top: __top,
        left: __left
      });
    }
      
    __setPosition($triggerPosition);
    o.lastPositionTrigger = o.posToEl.offset();
    globalEnv.SET_POSITION_INTERVAL = setInterval(function() {
      if(o.lastPositionTrigger.top != o.posToEl.offset().top) {
        o.lastPositionTrigger = o.posToEl.offset();
        __setPosition(o.posToEl.offset());
      }
    }, 500);
  },
  
  init: function() {
          o = Dropdown.o;
          o.el = $(o.el); // Clicked element
          o.msg = (typeof o.dropDownLayer == 'string') ? $("#" + o.dropDownLayer) : o.dropDownLayer; // Dropdown layer
          o.msg.unbind('.dropdownMouseEvents');
          o.posToEl = ((typeof o.posToEl == "object") && o.posToEl != null) ? o.posToEl : o.el; // Position to...
          o.isBottomFixedPosition = o.el.parents("#orderLayer").exists();
          o.isOpenedFromPopupLayer = o.el.parents(".popup").exists();
  
          // Stop event propagation
          o.posToEl.click(function(e) { e.stopPropagation(); });
          o.msg.bind('click.msg', function(e) { e.stopPropagation(); });
          o.el.bind('click.el', function(e) { e.stopPropagation(); });

          // Remember $msg parent
          globalEnv.dropDownLayers[o.msg.attr('id')] = o.msg.parent()[0];
  
          // Add classes to active elements
          Dropdown.setActiveElements();
    
          // Append layer to body 
          o.msg.appendTo("body");
  
          // Set layer position
          Dropdown.setLayerPosition();
          //fn.dropdown.setPosition(o.msg, o.posToEl, o);
          if(o.isOpenedFromPopupLayer) {
            globalEnv.DROPDOWN_INTERVAL = setInterval(function() {
               Dropdown.setLayerPosition();
               //fn.dropdown.setPosition(o.msg, o.posToEl, o);
            }, 500);
          }
    
          // hide layer after click into HTML element
          Dropdown.bindHideClick();
          
          // register mouse events
          o.msg.bind('mouseenter.dropdownMouseEvents', function() {
            Dropdown.isMouseOver = true;
          }).bind('mouseleave.dropdownMouseEvents', function() {
            Dropdown.isMouseOver = false;
          });
          
          // Show dropdown layer
          o.msg.stop(true, true).slideDown(function() { 
            if(o.hideTimeout) {
              if(!Dropdown.isMouseOver) {
                globalEnv.DEFINED_HIDE_TIMEOUT = setTimeout(function() { Dropdown.hideDropdown(); }, o.hideTimeout);
              }
              o.msg.bind('mouseleave.dropdownMouseEvents', function() { 
                globalEnv.DEFINED_HIDE_TIMEOUT = setTimeout(function() { Dropdown.hideDropdown(); }, o.hideTimeout);
              });
              o.msg.bind('mouseenter.dropdownMouseEvents', function() {
                clearTimeout(globalEnv.DEFINED_HIDE_TIMEOUT);
              });
            }
            globalEnv.IS_DROPDOWN_OPENED = true;
          });
  }
}


fn.dropdown = function(/*Event*/ e,
                        /*Clicked element*/ el,
                        /*String or jQuery Object*/ dropDownLayer, 
                        /*String or jQuery Object*/ posToEl,
                        /*Object*/ options) {
                        
                // Check global settings
                if (!globalEnv.dropDownLayers) {
                  fn.addEnv({dropDownLayers: {}});
                }

                // Set local settings
                Dropdown.o = $.extend({
                                 e: e,
                                 el: el,
                                 dropDownLayer: dropDownLayer,
                                 posToEl: posToEl,
                                 toRight: false,
                                 toBottom: false,
                                 definedWidth: false,
                                 hideTimeout: false
                }, options);
               
                // Init dropdown
                if(Dropdown.isActiveDropdown()) {
                  Dropdown.hideDropdown();
                  setTimeout(function() { Dropdown.init(); }, 650);
                } else {
                  Dropdown.init();
                }
};

})(jQuery);
