/**
* Copyright (c) 2006 Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
*
*/

(function($) {

$.event.special.mousewheel = {
setup: function() {
var handler = $.event.special.mousewheel.handler;

// Fix pageX, pageY, clientX and clientY for mozilla
if ( $.browser.mozilla )
$(this).bind('mousemove.mousewheel', function(event) {
$.data(this, 'mwcursorposdata', {
pageX: event.pageX,
pageY: event.pageY,
clientX: event.clientX,
clientY: event.clientY
});
});

if ( this.addEventListener )
this.addEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
else
this.onmousewheel = handler;
},

teardown: function() {
var handler = $.event.special.mousewheel.handler;

$(this).unbind('mousemove.mousewheel');

if ( this.removeEventListener )
this.removeEventListener( ($.browser.mozilla ? 'DOMMouseScroll' : 'mousewheel'), handler, false);
else
this.onmousewheel = function(){};

$.removeData(this, 'mwcursorposdata');
},

handler: function(event) {
var args = Array.prototype.slice.call( arguments, 1 );

event = $.event.fix(event || window.event);
// Get correct pageX, pageY, clientX and clientY for mozilla
$.extend( event, $.data(this, 'mwcursorposdata') || {} );
var delta = 0, returnValue = true;

if ( event.wheelDelta ) delta = event.wheelDelta/120;
if ( event.detail     ) delta = -event.detail/3;
if ( $.browser.opera  ) delta = -event.wheelDelta;

event.data  = event.data || {};
event.type  = "mousewheel";

// Add delta to the front of the arguments
args.unshift(delta);
// Add event to the front of the arguments
args.unshift(event);

return $.event.handle.apply(this, args);
}
};

$.fn.extend({
mousewheel: function(fn) {
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
},

unmousewheel: function(fn) {
return this.unbind("mousewheel", fn);
}
});

})(jQuery);

/**
* jquery.scrollable 0.11. Making HTML elements scroll.
* 
* http://flowplayer.org/tools/scrollable.html
*
* Copyright (c) 2008 Tero Piirainen (tero@flowplayer.org)
*
* Released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/
(function($) {

// plugin initialization
$.fn.extend({
scrollable: function(arg1, arg2, arg3) {   
return this.each(function() {
if (typeof arg1 == "string") {
var el = $.data(this, "scrollable");
el[arg1].apply(el, [arg2, arg3]);

} else { 
new $.scrollable(this, arg1, arg2);
}
});
} 
});

// constructor
$.scrollable = function(el, opts) {   

// store this instance
$.data(el, "scrollable", this);

this.init(el, opts); 
};

// methods
$.extend($.scrollable.prototype, { 

init: function(el, config)  {

// current instance
var self = this;  

var opts = {    
size: 5,
horizontal:false,  
activeClass:'active',
speed: 300,
onSeek: null,

// jquery selectors
items: '.items',
prev:'.prev',
next:'.next',
navi:'.navi',
naviItem:'span'
}; 

this.opts = $.extend(opts, config);   

// root / itemRoot
var root = this.root = $(el);  
var itemRoot = $(opts.items, root);  
if (!itemRoot.length) itemRoot = root;  

// wrap itemRoot.children() inside container
itemRoot.css({position:'relative', overflow:'hidden', visibility:'visible'});
itemRoot.children().wrapAll('<div class="__scrollable" style="position:relative"/>');

this.wrap = itemRoot.children(":first");
this.wrap.css(opts.horizontal ? "width" : "height", "200000em").after('<br clear="all"/>');  
this.items = this.wrap.children();
this.index = 0;


// set height based on size
if (opts.horizontal) {
//itemRoot.width(opts.size * (this.items.eq(1).offset().left - this.items.eq(0).offset().left) -2);
itemRoot.width(opts.size * (this.items.eq(1).offset().left - this.items.eq(0).offset().left));
} else {
//itemRoot.height(opts.size * (this.items.eq(1).offset().top - this.items.eq(0).offset().top) -2);
itemRoot.height(opts.size * (this.items.eq(1).offset().top - this.items.eq(0).offset().top)); 
} 

// mousewheel
if ($.isFunction($.fn.mousewheel)) { 
root.bind("mousewheel.scrollable", function(event, delta)  { 
self.move(-delta, 50); 
return false;
});
} 

// keyboard
$(window).bind("keypress.scrollable", function(evt) {

if ($(evt.target).parents(".__scrollable").length) {

if (opts.horizontal && (evt.keyCode == 37 || evt.keyCode == 39)) {
self.move(evt.keyCode == 37 ? -1 : 1);
return false;
} 

if (!opts.horizontal && (evt.keyCode == 38 || evt.keyCode == 40)) {
self.move(evt.keyCode == 38 ? -1 : 1);
return false;
}
}

return true;

}); 


// item.click()
this.items.each(function(index, arg) {
$(this).bind("click.scrollable", function() {
self.click(index);
// ALTERACAO
return false;
});
});

this.activeIndex = 0;

// prev
$(opts.prev, root).click(function() {
self.prev();
// ALTERACAO
return false;
});


// next
$(opts.next, root).click(function() {
self.next();
// ALTERACAO
return false;
});


// navi   
$(opts.navi, root).each(function() {   
var navi = $(this);

var status = self.getStatus();

// generate new entries
if (navi.is(":empty")) {
for (var i = 0; i < status.pages; i++) { 

var item = $("<" + opts.naviItem + "/>").attr("page", i).click(function() {    
var el = $(this);
el.parent().children().removeClass(opts.activeClass);
el.addClass(opts.activeClass);
self.setPage(el.attr("page"));

});

if (i == 0) item.addClass(opts.activeClass);
navi.append(item);   
}

// assign onClick events to existing entries
} else {

navi.children().each(function(i)  {
var item = $(this);
item.attr("page", i);
if (i == 0) item.addClass(opts.activeClass);

item.click(function() {
item.parent().children().removeClass(opts.activeClass);
item.addClass(opts.activeClass);
self.setPage(item.attr("page"));
});

});
}

});  

},


click: function(index) {

var item = this.items.eq(index);
var klass = this.opts.activeClass;

if (!item.hasClass(klass) && (index >= 0 || index < this.items.size())) { 

var prev = this.items.eq(this.activeIndex).removeClass(klass);
item.addClass(klass);   

this.seekTo(index - Math.floor(this.opts.size / 2));
this.activeIndex = index;
}  
},

getStatus: function() {
var len =  this.items.size();
var s = {
length: len, 
index: this.index, 
size: this.opts.size,
pages: Math.floor(len / this.opts.size),
page: Math.floor(this.index / this.opts.size)
};

return s;
}, 


// all other seeking functions depend on this generic seeking function 
seekTo: function(index, time) {

if (index < 0) index = 0;  
index = Math.min(index, this.items.length - this.opts.size);  

var item = this.items.eq(index);  
if (item.size() == 0) return false;   
this.index = index;


if (this.opts.horizontal) {
var left = this.wrap.offset().left - item.offset().left;  
this.wrap.animate({left: left}, time || this.opts.speed);

} else {
var top = this.wrap.offset().top - item.offset().top;
this.wrap.animate({top: top}, time || this.opts.speed);    
}

// custom onSeek callback
if ($.isFunction(this.opts.onSeek)) {
this.opts.onSeek.call(this.getStatus());
}

// navi status update
var navi = $(this.opts.navi, this.root);

if (navi.length) {
var klass = this.opts.activeClass;
var page = Math.round(index / this.opts.size);
navi.children().removeClass(klass).eq(page).addClass(klass);
}


return true; 
},


move: function(offset, time) {
this.seekTo(this.index + offset, time);

// ALTERACAO

if(this.index == 0) {
$(this.root).find(this.opts.prev).addClass('off');
} else {
$(this.root).find(this.opts.prev).removeClass('off');
}

if(this.index == this.items.size() - this.opts.size){
$(this.root).find(this.opts.next).addClass('off');
} else {
$(this.root).find(this.opts.next).removeClass('off');
}

},

next: function(time) {
this.move(1, time);
},

prev: function(time) {
this.move(-1, time); 
},

movePage: function(offset, time) {
this.move(this.opts.size * offset, time); 
},

setPage: function(index, time) {
this.seekTo(this.opts.size * index, time);
},

prevPage: function(time) {
var page = Math.floor(this.index / this.opts.size);
this.seekTo(this.opts.size * (page-1), time);
},  

nextPage: function(time) {
var page = Math.floor(this.index / this.opts.size);
this.seekTo(this.opts.size * (page+1), time);
}, 

begin: function(time) {
this.seekTo(0, time);
},

end: function(time) {
this.seekTo(this.items.size() - this.opts.size, time);  
}


});  

})(jQuery);
