var hoverImages = {
  sem: 0,
  atimers: [],
  links: {},
  ajaxRequest: function (options){
    var result = $.ajax({
      url: options.url,
      type: options.type || 'GET',
      cache: options.cache || false,
      dataType: options.dataType || 'html',
      async: options.async || false,
      contentType: options.contentType || 'application/x-www-form-urlencoded; charset=utf-8',
      data: options.data || false,
      success: options.success,
      error: options.error,
      complete: options.complete
    });
    html = result.responseText;
    return html;
  },
  preloadImages: function($section) {

    vCycleImages = setInterval(function() {
      var bImgLoaded = true;
      images = $section.children("img.preHover");
      //var images = $("#slideshow img");
 
      for (var i = 0; i < images.length; i++) {
         var img = images[i];
         if (img.complete == false)
            bImgLoaded = false;
      }
 
      if (bImgLoaded) {
         //$("#slideshow").cycle({ delay: 1000, speed: 1000 });
         clearInterval(vCycleImages);
      }
    }, 1000);

  },
  clearTimers: function(current) {
    if( hoverImages.atimers.length ) {
      for(i=0, j=hoverImages.atimers.length; i<j; i++) {
        $element = $(hoverImages.atimers[i]);
        $element.stopTime();
        $next = $element.next();
        $element.hide();
        $next.show();
      }
    } else {
      $next = $(current).next();
      $(current).hide();
      $next.show();
    }
    hoverImages.atimers = new Array();
  },
  animationProcess: function(element, period, disp) {

    $pindex = $element.attr('linkData');
    if( !$pindex ) {
      return;
    }

    $section = $(element).children();

    if( $section[0] ) {
      hoverImages.preloadImages($section);
      //pwidth = $section.width();
      pwidth = $section.attr('dataWidth');
    } else {
      return;
    }

    for(i=0, j=hoverImages.atimers.length; i<j; i++) {
      if( $(element).attr('linkData') == $(hoverImages.atimers[i]).attr('linkData') ) return;
      //if( hoverImages.atimers[i] == element) return;
    }    
    hoverImages.atimers[hoverImages.atimers.length] = element;

    //hoverImages.width = $(element).width();
    //hoverImages.pwidth = pwidth;
    width = $(element).width();
    pwidth = pwidth;

    hoverImages.loop = 1;
    //hoverImages.disp = disp;
    //hoverImages.period = period;

    hoverImages.posx = 0;
    hoverImages.posy = 0;
    $(element).scrollLeft(0);

    $(element).everyTime(period, function(iteration){
      //pwidth = hoverImages.pwidth;

      //width = hoverImages.width;
      //disp = hoverImages.disp;
      //period = hoverImages.period;

      if( iteration*period < 200 ) {
        hoverImages.loop = 1;
      }

      if( !hoverImages.loop ) return;


      current = $(element).scrollLeft();
/*
      if( hoverImages.loop < 0 ) {
        if( current > disp ) {
          current = parseInt(current-disp);
        } else {
          current = 0;
          //hoverImages.loop = 1;
        }
      } else {
        if( (current+disp) < (pwidth-width) ) {
          current = parseInt(current+disp);
        } else {
          current = parseInt(pwidth-width);
          //hoverImages.loop = -1;
        }
      }
*/

      if( hoverImages.loop < 0 ) {
        if( current > disp ) {
          current = parseInt(current-disp);
        } else if( (current-1) > disp ) {
          current = parseInt(current-1);
        } else {
          current = 0;
          //hoverImages.loop = 1;
        }
      } else {
        if( (current+disp) < (pwidth-width) ) {
          current = parseInt(current+disp);
        } else if( (current+1) < (pwidth-width) ) {
          current = parseInt(current+1);
        } else {
          current = parseInt(pwidth-width);
          //hoverImages.loop = -1;
        }
      }

      $(element).scrollLeft(current);
    });
  },


  hoverProcess: function() {

    $('.jqoff').hover(function (action){
      $element = $(action.currentTarget);
    }, function (action){
      $element = $(action.currentTarget);

      if( $element.html() == 'none' ) {
        return;
      }
      hoverImages.clearTimers($element);
    });

    $('.jqoff').mousemove(function (action){
      var xMouse = action.pageX || (action.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
      var yMouse = action.pageY || (action.clientY + (document.documentElement.scrollTop || document.body.scrollTop));

      if( hoverImages.posy ) {
        if( yMouse-hoverImages.posy > 4 || hoverImages.posy-yMouse > 4   ) {
          hoverImages.loop = 0;
          hoverImages.posy = yMouse;
        }
      } else {
        hoverImages.posy = yMouse;
      }

      if( hoverImages.posx ) {
        if( xMouse > hoverImages.posx ) {
          hoverImages.loop = 1;
        } else if(xMouse < hoverImages.posx) {
          hoverImages.loop = -1;
        }
      }

      hoverImages.posx = xMouse;

      $element = $(action.currentTarget);
    });

    $('.jqhover').hover(function (action){
      $element = $(action.currentTarget);
      $previous = $element.prev();

      if( $previous.html() == 'none' ) {
        return;
      }

      if( $previous.html().length > 0 ) {
        $element.hide();
        $previous.show();
        return;
      }

      //hoverImages.sem = 1;
      result = hoverImages.ajaxRequest({
        type: "post",
        url: hoverImages.links.productsListing,
        data: hoverImages.key + '=' + $element.attr('linkData'),
        dataType : "html",
        async: false,
        success: function(msg){
        },
        error: function(msg) {
          //alert(msg);
        },
        complete: function(msg) {
          if( msg.responseText.length > 0 ) {
            $previous.html(msg.responseText);
            $element.hide();
            $previous.show();
            //hoverImages.sem = 0;
          } else {
            $previous.html('none');
            $element.unbind("hover");
            $previous.unbind("hover");
            //hoverImages.sem = 0;
          }
        }
      });
    }, function (action){
      if( $previous.html() != 'none' ) {
        $element = $(action.currentTarget);

        if( hoverImages.atimers.length ) {
          dup = false;
          for(i=0, j=hoverImages.atimers.length; i<j; i++) {
            if( $element.attr('linkData') == $(hoverImages.atimers[i]).attr('linkData') ) continue;
            $tmp = $(hoverImages.atimers[i]);
            $tmp.stopTime();
            $tmpnext = $tmp.next();
            $tmp.hide();
            $tmpnext.show();
            dup = true;
          }
          if( dup ) {
            hoverImages.atimers = new Array();
          }
        }
        //if( !hoverImages.sem ) {
          hoverImages.animationProcess($previous, 30, 5);
        //}
      }
    });
  },
  initialize: function (key, content){
    hoverImages.key = key;

    if ($('.jqhover').is(':visible')) {
      $('.jqhover').each(function (){
        hoverImages.hoverProcess();      
      });
    }
  }
};


jQuery.fn.extend({
	everyTime: function(interval, label, fn, times, belay) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, times, belay);
		});
	},
	oneTime: function(interval, label, fn) {
		return this.each(function() {
			jQuery.timer.add(this, interval, label, fn, 1);
		});
	},
	stopTime: function(label, fn) {
		return this.each(function() {
			jQuery.timer.remove(this, label, fn);
		});
	}
});

jQuery.extend({
	timer: {
		global: [],
		guid: 1,
		dataKey: "jQuery.timer",
		regex: /^([0-9]+(?:\.[0-9]*)?)\s*(.*s)?$/,
		powers: {
			// Yeah this is major overkill...
			'ms': 1,
			'cs': 10,
			'ds': 100,
			's': 1000,
			'das': 10000,
			'hs': 100000,
			'ks': 1000000
		},
		timeParse: function(value) {
			if (value == undefined || value == null)
				return null;
			var result = this.regex.exec(jQuery.trim(value.toString()));
			if (result[2]) {
				var num = parseFloat(result[1]);
				var mult = this.powers[result[2]] || 1;
				return num * mult;
			} else {
				return value;
			}
		},
		add: function(element, interval, label, fn, times, belay) {
			var counter = 0;
			
			if (jQuery.isFunction(label)) {
				if (!times) 
					times = fn;
				fn = label;
				label = interval;
			}
			
			interval = jQuery.timer.timeParse(interval);

			if (typeof interval != 'number' || isNaN(interval) || interval <= 0)
				return;

			if (times && times.constructor != Number) {
				belay = !!times;
				times = 0;
			}
			
			times = times || 0;
			belay = belay || false;
			
			var timers = jQuery.data(element, this.dataKey) || jQuery.data(element, this.dataKey, {});
			
			if (!timers[label])
				timers[label] = {};
			
			fn.timerID = fn.timerID || this.guid++;
			
			var handler = function() {
				if (belay && this.inProgress) 
					return;
				this.inProgress = true;
				if ((++counter > times && times !== 0) || fn.call(element, counter) === false)
					jQuery.timer.remove(element, label, fn);
				this.inProgress = false;
			};
			
			handler.timerID = fn.timerID;
			
			if (!timers[label][fn.timerID]) {
				timers[label][fn.timerID] = window.setInterval(handler,interval);
			
			//this.global.push( element );
            }
			
		},
		remove: function(element, label, fn) {
			var timers = jQuery.data(element, this.dataKey), ret;
			
			if ( timers ) {
				
				if (!label) {
					for ( label in timers )
						this.remove(element, label, fn);
				} else if ( timers[label] ) {
					if ( fn ) {
						if ( fn.timerID ) {
							window.clearInterval(timers[label][fn.timerID]);
							delete timers[label][fn.timerID];
						}
					} else {
						for ( var fn in timers[label] ) {
							window.clearInterval(timers[label][fn]);
							delete timers[label][fn];
						}
					}
					
					for ( ret in timers[label] ) break;
					if ( !ret ) {
						ret = null;
						delete timers[label];
					}
				}
				
				for ( ret in timers ) break;
				if ( !ret ) 
					jQuery.removeData(element, this.dataKey);
			}
		}
	}
});

jQuery(window).bind("unload", function() {
	jQuery.each(jQuery.timer.global, function(index, item) {
		jQuery.timer.remove(item);
	});
});