PageControl.js
Summary
No overview generated for 'PageControl.js'
const TKPageControlIndicatorElement = 'pageControlIndicatorElement';
const TKPageControlPageElement = 'pageControlPageElement';
const TKPageControlDidUpdateCurrentPage = 'pageControlDidUpdateCurrentPage';
const TKPageControlCSSClass = 'page-control';
const TKPageControlCSSIndicatorElementClass = 'page-control-indicator-element';
const TKPageControlCSSPageElementClass = 'page-control-page-element';
TKPageControl.synthetizes = ['dataSource',
'delegate',
'interactive',
'currentPage',
'numPages',
'distanceBetweenPageIndicators',
'showPageElements',
'incrementalJumpsOnly',
'allowsDragging',
'deferCurrentPageDisplay'];
function TKPageControl (element) {
this.callSuper();
this._interactive = true;
this._currentPage = 0;
this._numPages = 1;
this._distanceBetweenPageIndicators = 50;
this._showPageElements = true;
this._incrementalJumpsOnly = true;
this._allowsDragging = false;
this._deferCurrentPageDisplay = false;
if (element) {
this.element = element;
} else {
this.element = document.createElement("div");
}
this.element.addClassName(TKPageControlCSSClass);
}
TKPageControl.prototype.init = function () {
if (!this.dataSource ||
!TKUtils.objectHasMethod(this.dataSource, TKPageControlIndicatorElement) ||
(this._showPageElements && !TKUtils.objectHasMethod(this.dataSource, TKPageControlPageElement))) {
return;
}
if (this.showPageElements) {
var pageElement = this.dataSource[TKPageControlPageElement](this);
for (var i=0; i < this._numPages; i++) {
var el = pageElement.cloneNode();
el.addClassName(TKPageControlCSSPageElementClass);
el.style.webkitTransform = "translate(" + (i * this._distanceBetweenPageIndicators) + "px, 0px)";
el._pageControlIndex = i;
this.element.appendChild(el);
}
}
var indicatorElement = this.dataSource[TKPageControlIndicatorElement](this);
indicatorElement.addClassName(TKPageControlCSSIndicatorElementClass);
indicatorElement.style.webkitTransform = "translate(" + (this._currentPage * this._distanceBetweenPageIndicators) + "px, 0px)";
this.element.appendChild(indicatorElement);
if (this._interactive) {
if (this._allowsDragging) {
this.element.addEventListener("mousedown", this, false);
} else {
this.element.addEventListener("click", this, false);
}
}
};
TKPageControl.prototype.setCurrentPage = function (newCurrentPage) {
if (this._currentPage == newCurrentPage ||
newCurrentPage < 0 ||
newCurrentPage >= this._numPages) {
return;
}
this._currentPage = newCurrentPage;
if (TKUtils.objectHasMethod(this.delegate, TKPageControlDidUpdateCurrentPage)) {
this.delegate[TKPageControlDidUpdateCurrentPage](this, this._currentPage);
}
if (!this._deferCurrentPageDisplay) {
this.updateCurrentPageDisplay();
}
};
TKPageControl.prototype.updateCurrentPageDisplay = function () {
var indicatorElement = this.dataSource[TKPageControlIndicatorElement](this);
indicatorElement.style.webkitTransform = "translate(" + (this._currentPage * this._distanceBetweenPageIndicators) + "px, 0px)";
};
TKPageControl.prototype.handleEvent = function (event) {
switch (event.type) {
case "mousedown":
this.handleDragBegan(event);
break;
case "mousemove":
this.handleDragMove(event);
break;
case "mouseup":
this.handleDragEnded(event);
break;
case "click":
this.handleClick(event);
break;
default:
debug("unhandled event type in TKPageControl: " + event.type);
}
};
TKPageControl.prototype.setupMouseInteraction = function () {
if (this._showPageElements) {
var page_elements = this.element.querySelectorAll('.' + TKPageControlCSSPageElementClass);
var page_element_bounds = page_elements[0].getBounds();
this.minX = page_element_bounds.x + (page_element_bounds.width - this._distanceBetweenPageIndicators) / 2;
this.maxX = this.minX + page_elements.length * this._distanceBetweenPageIndicators;
}
else {
this.minX = this.element.getBounds().x;
}
};
TKPageControl.prototype.pageIndexAtX = function (x) {
var page_index = Math.floor((x - this.minX) / this._distanceBetweenPageIndicators);
return Math.max(Math.min(page_index, this._numPages), 0);
};
TKPageControl.prototype.handleClick = function (event) {
this.setupMouseInteraction();
this.element.addClassName("interactive");
this.currentPage = this.pageIndexAtX(event.clientX);
};
TKPageControl.prototype.handleDragBegan = function (event) {
if (!this._allowsDragging) {
return;
}
event.preventDefault();
this.setupMouseInteraction();
this.element.addClassName("interactive");
this.currentPage = this.pageIndexAtX(event.clientX);
window.addEventListener("mousemove", this, false);
window.addEventListener("mouseup", this, false);
};
TKPageControl.prototype.handleDragMove = function (event) {
event.preventDefault();
this.currentPage = this.pageIndexAtX(event.clientX);
};
TKPageControl.prototype.handleDragEnded = function (event) {
event.preventDefault();
this.element.removeClassName("interactive");
window.removeEventListener("mousemove", this);
window.removeEventListener("mouseup", this);
};
TKClass(TKPageControl);
function TKPageControlDataSourceHelper(data) {
this.data = data;
this.pageElement = null;
this.indicatorElement = null;
};
TKPageControlDataSourceHelper.prototype.pageControlPageElement = function(pageControl) {
if (!this.data) {
return null;
}
if (!this.pageElement) {
this.pageElement = TKUtils.buildElement(this.data.pageElement);
}
return this.pageElement;
};
TKPageControlDataSourceHelper.prototype.pageControlIndicatorElement = function(pageControl) {
if (!this.data) {
return null;
}
if (!this.indicatorElement) {
this.indicatorElement = TKUtils.buildElement(this.data.indicatorElement);
}
return this.indicatorElement;
};
TKPageControl.buildPageControl = function(element, data) {
if (TKUtils.objectIsUndefined(data) || !data || data.type != "TKPageControl") {
return null;
}
var pageControl = new TKPageControl(element);
pageControl.dataSource = new TKPageControlDataSourceHelper(data);
TKPageControl.synthetizes.forEach(function(prop) {
if (prop != "dataSource" && prop != "delegate") {
if (!TKUtils.objectIsUndefined(data[prop])) {
pageControl[prop] = data[prop];
}
}
});
return pageControl;
};
Documentation generated by
JSDoc on Tue Sep 15 21:24:36 2009