Skip to content

Instantly share code, notes, and snippets.

@jittagornp
Last active October 8, 2015 02:32
Show Gist options
  • Save jittagornp/a46cb09c8a64ef8abf4b to your computer and use it in GitHub Desktop.
Save jittagornp/a46cb09c8a64ef8abf4b to your computer and use it in GitHub Desktop.
angularjs of pamarin.com
/**
* @author jittagornp
* create 22/08/2015
*/
var pamarin = angular.module('pamarin', [
'ui.router',
'ui.router.stateHelper',
'LocalStorageModule',
'ngDialog',
'ab-base64',
'checklist-model',
'ui-notification',
'ipCookie',
'720kb.tooltips',
'angularMoment',
'nsPopover',
'ngSanitize',
'uiGmapgoogle-maps',
'ngProgress',
'youtube-embed'
]);
pamarin.constant('config', window.app.conf);
pamarin.constant('principal', window.app.principal);
pamarin.constant('messages', window.app.messages);
pamarin.constant('data', window.app.data);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.config([
'ngDialogProvider',
function (ngDialogProvider) {
ngDialogProvider.setDefaults({
className: 'ngdialog-theme-default',
showClose: true,
closeByDocument: true,
closeByEscape: true,
closeByNavigation: true,
animationEndSupport : false,
trapFocus : false,
preserveFocus : false,
disableAnimation : true
});
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.config([
'uiGmapGoogleMapApiProvider',
function (uiGmapGoogleMapApiProvider) {
uiGmapGoogleMapApiProvider.configure({
key: 'AIzaSyBhl7CqSB0QxqoA7ou1ow6LBMeeoF5oQSw&v=3.exp&signed_in=true',
//v: '3.17'//,
libraries: 'places'
});
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.config([
'localStorageServiceProvider',
function (localStorageServiceProvider) {
localStorageServiceProvider
.setPrefix('pamarin');
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.config([
'config',
'NotificationProvider',
function (config, NotificationProvider) {
NotificationProvider.setOptions({
delay: 10000,
startTop: 40,
startRight: 30,
templateUrl : config.host + '/notification/info.html',
verticalSpacing: 20,
horizontalSpacing: 20,
positionX: 'left',
positionY: 'bottom'
});
}
]);
/**
* @author jittagornp
* create 11/09/2015
*/
pamarin.config([
'config',
'$stateProvider',
function (config, $stateProvider) {
var ready = {
'account': false
};
/* ------------------------------------------------------------------ */
var mainResolver = {
initData: [
'$q',
'data',
'UserPageService',
'model.AccountPageContent',
function ($q, data, service, AccountPageContent) {
if (ready['account']) {
var defer = $q.defer();
service.load(function (data) {
defer.resolve(data);
});
return defer.promise;
}
return AccountPageContent.fromProtocol(data.init);
}
]
};
/* ------------------------------------------------------------------ */
var timeout = setTimeout(function () {
clearTimeout(timeout);
angular.forEach(
ready,
function (value, key) {
ready[key] = true;
}
);
}, 500);
$stateProvider
.state('account', {
url: '/account',
templateUrl: function () {
if (ready['account']) {
return config.host + '/template/account';
}
return null;
},
resolve: mainResolver,
controller: 'AccountCtrl'
});
}
]);
/**
* @author jittagornp
* create 11/09/2015
*/
pamarin.config([
'config',
'$stateProvider',
function (config, $stateProvider) {
var ready = {
'home': false,
'home.tripofuserfollowing': false,
'home.triplastest': false
};
/* ------------------------------------------------------------------ */
var mainResolver = {
initData: [
'$q',
'data',
'$state',
'controller.HomePage',
'model.HomePageContent',
function ($q, data, $state, HomePage, HomePageContent) {
if (ready['home']) {
var defer = $q.defer();
(new HomePage()).loadData({
stateName: $state.next.name
}, function (data) {
defer.resolve(data);
});
return defer.promise;
}
return HomePageContent.fromProtocol(data.init);
}
]
};
var tripLastestResolver = {
initData: [
'$q',
'HomePageService',
function ($q, pageService) {
if (ready['home.triplastest']) {
var defer = $q.defer();
pageService.loadTripLastestTab(
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return null;
}
]
};
var tripFollowingResolver = {
initData: [
'$q',
'HomePageService',
function ($q, pageService) {
if (ready['home.tripofuserfollowing']) {
var defer = $q.defer();
pageService.loadTripFollowingTab(
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return null;
}
]
};
/* ------------------------------------------------------------------ */
var timeout = setTimeout(function () {
clearTimeout(timeout);
angular.forEach(
ready,
function (value, key) {
ready[key] = true;
}
);
}, 500);
$stateProvider
.state('home', {
url: '/',
templateUrl: function () {
if (ready['home']) {
return config.host + '/template';
}
return null;
},
resolve: mainResolver,
controller: 'HomeCtrl'
})
.state('home.triplastest', {
url: 'trips/lastest',
views: {
tab: {
templateUrl: function () {
if (ready['home.triplastest']) {
return config.host + '/template/trips/lastest';
}
return null;
},
resolve: tripLastestResolver,
controller: 'TripLastestCtrl'
}
}
})
.state('home.tripofuserfollowing', {
url: 'trips/followings',
views: {
tab: {
templateUrl: function () {
if (ready['home.tripofuserfollowing']) {
return config.host + '/template/trips/followings';
}
return null;
},
resolve: tripFollowingResolver,
controller: 'TripFollowingCtrl'
}
}
});
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.config([
'$locationProvider',
'$urlRouterProvider',
function ($locationProvider, $urlRouterProvider) {
$locationProvider.html5Mode(true);
$urlRouterProvider.otherwise("/");
}
]);
/**
* @author jittagornp
* create 11/09/2015
*/
pamarin.config([
'config',
'$stateProvider',
function (config, $stateProvider) {
var ready = {
'trips': false
};
/* ------------------------------------------------------------------ */
var mainResolver = {
initData: [
'$q',
'data',
'TripService',
'$stateParams',
'model.TripPageContent',
function ($q, data, service, $stateParams, TripPageContent) {
if (ready['trips']) {
var defer = $q.defer();
service.loadPageDataByUsernameAndTripname(
$stateParams.username,
$stateParams.tripname,
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return TripPageContent.fromProtocol(data.init);
}
]
};
/* ------------------------------------------------------------------ */
var timeout = setTimeout(function () {
clearTimeout(timeout);
angular.forEach(
ready,
function (value, key) {
ready[key] = true;
}
);
}, 500);
$stateProvider
.state('trips', {
url: '/+{username}/~{tripname:.*\\/?$}',
templateUrl: function ($stateParams) {
if (ready['trips']) {
return config.host + '/template/+' + $stateParams.username + '/~' + $stateParams.tripname;
}
return null;
},
resolve: mainResolver,
controller: 'TripCtrl'
});
}
]);
/**
* @author jittagornp
* create 11/09/2015
*/
pamarin.config([
'config',
'$stateProvider',
function (config, $stateProvider) {
var ready = {
'users.trips': false,
'users.tripslike': false,
'users.followers': false,
'users.followings': false,
'users': false
};
/* ------------------------------------------------------------------ */
var mainResolver = {
initData: [
'$q',
'data',
'$state',
'$stateParams',
'controller.UserPage',
'model.UserPageContent',
function ($q, data, $state, $stateParams, UserPage, UserPageContent) {
if (ready['users']) {
var defer = $q.defer();
(new UserPage()).loadData({
username: $stateParams.username,
stateName: $state.next.name
}, function (data) {
defer.resolve(data);
});
return defer.promise;
}
return UserPageContent.fromProtocol(data.init);
}
]
};
var tripResolver = {
initData: [
'$q',
'$stateParams',
'UserTripTabService',
function ($q, $stateParams, service) {
if (ready['users.trips']) {
var defer = $q.defer();
service.loadByUsername(
$stateParams.username,
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return null;
}
]
};
var tripLikeResolver = {
initData: [
'$q',
'$stateParams',
'UserTripTabService',
function ($q, $stateParams, service) {
if (ready['users.tripslike']) {
var defer = $q.defer();
service.loadLikeByUsername(
$stateParams.username,
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return null;
}
]
};
var followingResolver = {
initData: [
'$q',
'$stateParams',
'UserFollowPageService',
function ($q, $stateParams, pageService) {
if (ready['users.followings']) {
var defer = $q.defer();
pageService.loadFollowingTabByUsername(
$stateParams.username,
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return null;
}
]
};
var followerResolver = {
initData: [
'$q',
'$stateParams',
'UserFollowPageService',
function ($q, $stateParams, pageService) {
if (ready['users.followers']) {
var defer = $q.defer();
pageService.loadFollowerTabByUsername(
$stateParams.username,
function (data) {
defer.resolve(data);
}
);
return defer.promise;
}
return null;
}
]
};
/* ------------------------------------------------------------------ */
var timeout = setTimeout(function () {
clearTimeout(timeout);
angular.forEach(
ready,
function (value, key) {
ready[key] = true;
}
);
}, 500);
$stateProvider
.state('users', {
url: '/+{username}',
templateUrl: function ($stateParams) {
if (ready['users']) {
return config.host + '/template/+' + $stateParams.username;
}
return null;
},
resolve: mainResolver,
controller: 'UserCtrl'
})
.state('users.trips', {
url: '/trips',
views: {
tab: {
templateUrl: function ($stateParams) {
if (ready['users.trips']) {
return config.host + '/template/+' + $stateParams.username + '/trips';
}
return null;
},
resolve: tripResolver,
controller: 'UserTripCtrl'
}
}
})
.state('users.tripslike', {
url: '/trips/like',
views: {
tab: {
templateUrl: function ($stateParams) {
if (ready['users.tripslike']) {
return config.host + '/template/+' + $stateParams.username + '/trips/like';
}
return null;
},
resolve: tripLikeResolver,
controller: 'UserTripLikeCtrl'
}
}
})
.state('users.followings', {
url: '/followings',
views: {
tab: {
templateUrl: function ($stateParams) {
if (ready['users.followings']) {
return config.host + '/template/+' + $stateParams.username + '/followings';
}
return null;
},
resolve: followingResolver,
controller: 'UserFollowingCtrl'
}
}
})
.state('users.followers', {
url: '/followers',
views: {
tab: {
templateUrl: function ($stateParams) {
if (ready['users.followers']) {
return config.host + '/template/+' + $stateParams.username + '/followers';
}
return null;
},
resolve: followerResolver,
controller: 'UserFollowerCtrl'
}
}
});
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.config([
'$httpProvider',
function ($httpProvider) {
function isPage(resp) {
return resp.config.url.match('/pagedata/');
}
function isTab(resp) {
return resp.config.url.match('/pagedata/tab');
}
/**
* @interceptor ScrollTopInterceptor
*/
$httpProvider.interceptors.push([
function () {
var $win = jQuery(window);
return {
response: function (resp) {
if (isTab(resp)) {
return resp;
}
if (isPage(resp)) {
$win.scrollTop(0);
return resp;
}
return resp;
}
};
}
]);
}
]);
/**
* @author jittagornp
* create 06/09/2015
*/
pamarin.run([
'$rootScope',
function ($rootScope) {
var $win = jQuery(window);
var $page = jQuery('.pr-page-wrapper');
var scroll = $win.scrollTop();
var fixedScroll = scroll;
$win.on('scroll', function () {
scroll = $win.scrollTop();
});
$rootScope.$on(
'ngDialog.opened',
function (e, $dialog) {
$page.css({
marginTop: (-1) * scroll + 'px'
});
fixedScroll = scroll;
}
);
$rootScope.$on(
'ngDialog.closed', function (e, $dialog) {
$page.css({
marginTop: 0
});
$win.scrollTop(fixedScroll);
}
);
}
]);
/**
* @author jittagornp
* create 30/09/2015
*/
pamarin.run([
'$state',
'messages',
'$rootScope',
'state.DirtyState',
'component.ConfirmDialog',
function ($state, messages, $rootScope, DirtyState, ConfirmDialog) {
var hasDirty = false;
function showDialog(state, params) {
ConfirmDialog.create()
.setHeader(messages['dialog.confirmLeafOutPage.TITLE'])
.setMessage(messages['dialog.confirmLeafOutPage.MESSAGE'])
.setConfirmButtonLabel(messages['dialog.confirmLeafOutPage.button.confirm'])
.setCancelButtonLabel(messages['dialog.confirmLeafOutPage.buttom.cancel'])
.onPreConfirm(function () {
DirtyState.clearDirty();
$state.go(state.name, params);
hasDirty = false;
})
.onPreCancel(function () {
hasDirty = false;
})
.open();
}
$rootScope.$on(
'$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
if (DirtyState.isDirty()) {
if (!hasDirty) {
hasDirty = true;
showDialog(toState, toParams);
}
event.preventDefault();
}
}
);
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.run([
'amMoment',
function (moment) {
moment.changeLocale('th');
//moment.changeTimezone('Asia/Bangkok');
}
]);
/**
* @author jittagornp
* create 05/09/2015
*/
pamarin.run([
'$rootScope',
'state.DirtyState',
'ngProgressFactory',
function ($rootScope, DirtyState, ngProgressFactory) {
var progress = ngProgressFactory.createInstance();
progress.setHeight('1px');
progress.setColor('#3297fd');
function isPage(state) {
return state.name.indexOf('.') === -1 && !DirtyState.isDirty();
}
$rootScope.$on(
'$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
if (isPage(toState)) {
progress.start();
}
}
);
$rootScope.$on(
'$stateChangeSuccess',
function (event, toState, toParams, fromState, fromParams) {
if (isPage(toState)) {
progress.complete();
}
}
);
progress.start();
progress.complete();
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.run([
'$state',
'$rootScope',
function ($state, $rootScope) {
$rootScope.$on(
'$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
$state.next = toState;
}
);
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.directive('focusOnScrolled', function () {
var MOUSEWHEEL_STEP = 20;
return function (scope, element, attr) {
element.bind('mousewheel DOMMouseScroll', function (e) {
var scrollTo = null;
var $self = jQuery(this);
if (!$self.hasScrollBar()) {
return;
}
if (e.type === 'mousewheel') {
scrollTo = (e.originalEvent.wheelDelta * -1);
}
else if (e.type === 'DOMMouseScroll') {
scrollTo = MOUSEWHEEL_STEP * e.originalEvent.detail;
}
if (scrollTo) {
e.preventDefault();
$self.scrollTop(scrollTo + $self.scrollTop());
}
});
};
});
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.directive('ngBack', [
'$window',
function ($window) {
return function (scope, element, attrs) {
element.bind("click", function (event) {
scope.$apply(function () {
$window.history.back();
});
event.preventDefault();
});
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.directive('ngEnter', function () {
return function (scope, element, attrs) {
element.bind("keydown keypress", function (event) {
if (event.which === 13) {
scope.$apply(function () {
scope.$eval(attrs.ngEnter);
});
event.preventDefault();
}
});
};
});
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.directive('setClassWhenAtTop', [
'$window',
function ($window) {
var $win = angular.element($window); // wrap window object as jQuery object
return {
restrict: 'A',
link: function (scope, element, attrs) {
var topClass = attrs.setClassWhenAtTop; // get CSS class from directive's attribute value
var offsetTop = element.offset().top; // get element's offset top relative to document
var error = parseInt(attrs.fixedError, 10) || 0;
$win.on('scroll', function (e) {
if ($win.scrollTop() >= (offsetTop - error)) {
element.addClass(topClass);
} else {
element.removeClass(topClass);
}
});
}
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.directive('whenScrolled', function () {
return function (scope, elm, attr) {
var raw = elm[0];
elm.bind('scroll', function () {
if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) {
scope.$apply(attr.whenScrolled);
}
});
};
});
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.filter('cut', [
function () {
return function (value, max, tail) {
if (!value)
return '';
max = parseInt(max, 10);
if (!max) {
return value;
}
if (value.length <= max) {
return value;
}
return value.substr(0, max) + (tail || ' …');
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.filter('timeFromNow', [
'util.Time',
function (Time) {
return function (value) {
if (!value) {
return '';
}
return Time.fromNow(value);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('enum.ArticleStatus', [
'messages',
'enum.Enumerate',
function (messages, Enumerate) {
/**
* @enum ArticleStatus
*/
var ArticleStatus = Enumerate([
{
name: 'PUBLIC',
description: messages.ARTICLE_PUBLIC
},
{
name: 'DRAFF',
description: messages.ARTICLE_DRAFF
}
]);
return ArticleStatus;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('enum.Enumerate', function () {
return (function (list, fnc) {
/**
* @enum Enumerate
*/
var Enumerate = function (ctx) {
if (angular.isObject(ctx)) {
angular.forEach(ctx, function (val, key) {
this[key] = val;
}, this);
} else if (angular.isString(ctx)) {
this.name = ctx;
} else {
throw new Error('incorrect arguments.');
}
};
Enumerate.values = [];
/**
* @param {String | Object} ctx
* @returns {Enumerate}
*/
Enumerate.valueOf = function (ctx) {
if (!ctx || ctx == 'null') {
return null;
}
var obj = null;
angular.forEach(Enumerate.values, function (item) {
if (item.name === ctx) {
obj = item;
return false;
}
});
if (!obj) {
obj = new Enumerate(ctx);
Enumerate.values.push(obj);
}
return obj;
};
/**
* @param {String} protocol
* @returns {Enumerate}
*/
Enumerate.fromProtocol = function (protocol) {
try {
return Enumerate.valueOf(protocol);
} catch (ex) {
return null;
}
};
/**
* @returns {String}
*/
Enumerate.prototype.toProtocol = function () {
return this.name;
};
/**
* @returns {String}
*/
Enumerate.prototype.toString = function () {
return this.name;
};
/**
* @param {String | Enumerate} name
* @returns {Boolean}
*/
Enumerate.prototype.is = function (name) {
if (angular.isString(name)) {
return this.name === name;
}
return this === name;
};
fnc && angular.forEach(fnc, function (val, key) {
Enumerate.prototype[key] = val;
});
angular.forEach(list, function (item) {
Enumerate[
angular.isObject(item)
? item.name
: item
] = Enumerate.valueOf(item);
});
return Enumerate;
});
});
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('enum.LikeType', [
'enum.Enumerate',
function (Enumerate) {
/**
* @enum LikeType
*/
var LikeType = Enumerate([
'POST',
'COMMENT'
]);
return LikeType;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('enum.MapMarkerType', [
'enum.Enumerate',
function (Enumerate) {
/**
* @enum MapMarkerType
*/
var MapMarkerType = Enumerate([
'POST'
]);
return MapMarkerType;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('enum.MapType', [
'enum.Enumerate',
function (Enumerate) {
/**
* @enum MapType
*/
var MapType = Enumerate([
'ROADMAP',
'TERRAIN',
'SATELLITE',
'HYBRID'
]);
return MapType;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('enum.PostType', [
'messages',
'enum.Enumerate',
function (messages, Enumerate) {
/**
* @enum PostType
*/
var PostType = Enumerate([
{
name: 'CONTENT',
description: messages.CONTENT
},
{
name: 'GALLERY',
description: messages.PHOTO
},
{
name: 'MAP',
description: messages.MAP
},
{
name: 'VIDEO',
description: messages.VIDEO
}
]);
return PostType;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.AccountPageContent', [
'model.User',
function (User) {
/**
* @model AccountPageContent
*/
var AccountPageContent = function () {
this.user = null; /* model.User */
};
/**
* @param {Object} protocol
* @returns {AccountPageContent}
*/
AccountPageContent.fromProtocol = function (protocol) {
try {
var data = new AccountPageContent();
data.user = User.fromProtocol(protocol.user);
return data;
} catch (ex) {
return null;
}
};
return AccountPageContent;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Authority', [
'util.Values',
function (Values) {
/**
* @model Authority
*/
var Authority = function (id, desc) {
this.id = id || null; /* String */
this.description = desc || null; /* String */
};
Authority.ADMIN = new Authority('ADMIN', 'administrator');
/**
* @returns {Object}
*/
Authority.prototype.toProtocol = function () {
return {
auth_id: Values.asValue(this.id),
description: Values.asValue(this.description)
};
};
/**
* @param {Object} protocol
* @returns {Authority}
*/
Authority.fromProtocol = function (protocol) {
try {
return new Authority(protocol.auth_id, protocol.description);
} catch (ex) {
return null;
}
};
return Authority;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Comment', [
'util.Time',
'model.User',
'util.Values',
function (Time, User, Values) {
/**
* @model Comment
*/
var Comment = function () {
this.id = null; /* String */
this.message = null; /* String */
this.backupMessage = null; /* String */
this.createDate = null; /* String */
this.createDateDesc = null; /* String */
this.updateDate = null; /* String */
this.updateDateDesc = null; /* String */
this.referenceId = null; /* String */
this.userId = null; /* String */
this.user = null; /* model.User */
this.isOwner = null; /* Boolean */
};
/**
* @param {Object} protocol
* @returns {Comment}
*/
Comment.fromProtocol = function (protocol) {
try {
var comment = new Comment();
comment.id = protocol.comment_id;
comment.message = protocol.message;
comment.backupMessage = protocol.message;
comment.createDate = protocol.create_date;
comment.createDateDesc = Time.fromNow(protocol.create_date);
comment.updateDate = protocol.update_date;
comment.updateDateDesc = Time.fromNow(protocol.update_date);
comment.referenceId = protocol.reference_id;
comment.userId = protocol.user_id;
comment.user = User.fromProtocol(protocol.user);
comment.isOwner = protocol.is_owner || false;
return comment;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Comment.prototype.toProtocol = function () {
return {
comment_id: Values.asValue(this.id),
message: Values.asValue(this.message),
create_date: Values.asValue(this.createDate),
update_date: Values.asValue(this.updateDate),
reference_id: Values.asValue(this.referenceId),
user_id: Values.asValue(this.userId)
};
};
return Comment;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.CommentPageResource', [
'model.PageResource',
'model.Comment',
'model.ProtocolMapper',
function (PageResource, Comment, ProtocolMapper) {
/**
* @model {CommentPageResource}
*/
var CommentPageResource = function () {
};
/*
* @param {Object} protocol
* @returns {model.PageResource}
*/
CommentPageResource.fromProtocol = function (protocol) {
var page = PageResource.fromProtocol(protocol);
page.content = ProtocolMapper.fromArray(page.content, Comment);
return page;
};
return CommentPageResource;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Follows', [
'util.Values',
function (Values) {
/**
* @model Follows
*/
var Follows = function () {
this.total = null; /* Number */
this.followed = null; /* Boolean */
};
/**
* @param {Object} protocol
* @returns {Follows}
*/
Follows.fromProtocol = function (protocol) {
try {
var follows = new Follows();
follows.total = protocol.total || 0;
follows.followed = protocol.followed || false;
return follows;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Follows.prototype.toProtocol = function () {
return {
total: Values.asValue(this.total),
followed: Values.asValue(this.followed)
};
};
return Follows;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.HomePageContent', [
'model.TripCardPageResource',
function (TripCardPageResource) {
/**
* @model HomePageContent
*/
var HomePageContent = function () {
this.phrase = null; /* String */
this.tripCardPage = null; /* model.TripCardPageResource */
};
/**
* @param {Object} protocol
* @returns {HomePageContent}
*/
HomePageContent.fromProtocol = function (protocol) {
try {
var content = new HomePageContent();
if(protocol.phrase){
content.phrase = protocol.phrase;
}
if (protocol.trip_card_page) {
content.tripCardPage = TripCardPageResource.fromProtocol(protocol.trip_card_page);
}
return content;
} catch (ex) {
return null;
}
};
/*
* @param {PageResource} page
*/
HomePageContent.prototype.addTripCardPage = function (page) {
this.tripCardPage.number = page.number;
this.tripCardPage.hasNextPage = page.hasNextPage;
angular.forEach(page.content, function (card) {
this.tripCardPage.content.push(card);
}, this);
};
return HomePageContent;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Like', [
'model.User',
'enum.LikeType',
function (User, LikeType) {
/**
* @model Like
*/
var Like = function () {
this.id = {
referenceId: null, /* String */
userId: null, /* String */
referenceType: null /* enum.LikeType */
};
this.user = null; /* model.User */
};
/**
* @param {Object} protocol
* @returns {Like}
*/
Like.fromProtocol = function (protocol) {
try {
var like = new Like();
like.id.referenceId = protocol.id.reference_id;
like.id.userId = protocol.id.user_id;
like.id.referenceType = LikeType.valueOf(protocol.id.reference_type);
like.user = User.fromProtocol(protocol.user);
return like;
} catch (ex) {
return null;
}
};
return Like;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Likes', [
'model.Like',
'model.ProtocolMapper',
function (Like, ProtocolMapper) {
/**
* @model Likes
*/
var Likes = function () {
this.total = null; /* Number */
this.liked = null; /* Boolean */
this.likes = null; /* Array<model.Like> */
};
/**
* @param {Object} protocol
* @returns {Likes}
*/
Likes.fromProtocol = function (protocol) {
try {
var likes = new Likes();
likes.total = protocol.total || 0;
likes.liked = protocol.liked || false;
likes.likes = ProtocolMapper.fromArray(protocol.likes, Like);
return likes;
} catch (ex) {
return null;
}
};
return Likes;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Link', [
'util.Values',
function (Values) {
/**
* @model Link
*/
var Link = function () {
this.pattern = null; /* String */
this.mapping = null; /* Object */
this.href = null; /* String */
};
/**
* @param {Object} protocol
* @returns {Link}
*/
Link.fromProtocol = function (protocol) {
try {
var link = new Link();
link.pattern = protocol.pattern;
link.mapping = protocol.mapping;
link.href = protocol.href;
return link;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Link.prototype.toProtocol = function () {
return {
pattern: Values.asValue(this.pattern),
mapping: Values.asValue(this.mapping),
href: Values.asValue(this.href)
};
};
return Link;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.MapMarker', [
'enum.MapMarkerType',
'util.Values',
function (MapMarkerType, Values) {
/**
* @model MapMarker
*/
var MapMarker = function () {
this.id = null; /* String */
this.latitude = null; /* Number */
this.longitude = null; /* Number */
this.referenceId = null; /* String */
this.referenceType = null; /* enum.MapMarkerType */
};
/**
* @param {Number} lat
* @param {Number} lng
* @returns {MapMarker}
*/
MapMarker.fromLatitudeLongitude = function (lat, lng) {
var marker = new MapMarker();
marker.latitude = lat;
marker.longitude = lng;
return marker;
};
/**
* @param {Object} protocol
* @returns {MapMarker}
*/
MapMarker.fromProtocol = function (protocol) {
try {
var marker = new MapMarker();
marker.id = protocol.marker_id;
marker.latitude = protocol.latitude;
marker.longitude = protocol.longitude;
marker.referenceId = protocol.reference_id;
marker.referenceType = MapMarkerType.valueOf(protocol.reference_type) || MapMarkerType.POST;
return marker;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
MapMarker.prototype.toProtocol = function () {
return {
marker_id: Values.asValue(this.id),
latitude: Values.asValue(this.latitude),
longitude: Values.asValue(this.longitude),
reference_id: Values.asValue(this.referenceId),
reference_type: Values.asValue(this.referenceType)
};
};
return MapMarker;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.PageData', [
function () {
/**
* @model PageData
*/
var PageData = function () {
this.title = null; /* String */
this.metadata = null; /* Array<Object> */
this.content = null; /* ? */
};
/**
* @param {Object} protocol
* @returns {PageData}
*/
PageData.fromProtocol = function (protocol) {
try {
var data = new PageData();
data.title = protocol.title;
data.metadata = protocol.metadata || [];
data.content = protocol.content;
return data;
} catch (ex) {
return null;
}
};
return PageData;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.PageRequest', [
'enum.Enumerate',
function (Enumerate) {
/**
* @model PageRequest
*/
var PageRequest = function (number, size, sorts) {
this.number = number || 0;
this.size = size || 0;
this.sorts = sorts || [];
};
/**
* @model PageRequest.Sort
*
* @param {String} property
* @param {PageRequest.Sort.Direction} direction
*/
PageRequest.Sort = function (property, direction) {
this.property = property;
this.direction = direction;
};
/**
* @enum PageRequest.Sort.Direction
*/
PageRequest.Sort.Direction = Enumerate([
'ASC',
'DESC'
]);
function buildSorts(sorts) {
var sts = [];
angular.forEach(sorts, function (sort) {
sts.push(sort.property + ':' + sort.direction);
});
return sts.join(',');
}
/**
* @returns {String}
*/
PageRequest.prototype.toString = function () {
return 'page=' + this.number
+ '&size=' + this.size
+ (this.sorts.length ? ('&sort=' + buildSorts(this.sorts)) : '');
};
return PageRequest;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.PageResource', [
function () {
/**
* @model PageResource
*/
var PageResource = function () {
this.size = null;
this.number = null;
this.content = null;
this.sorts = null;
this.links = null;
this.totalElements = null;
this.totalPages = null;
this.numberOfElements = null;
this.hasNextPage = null;
this.isSlice = null;
};
/**
* @param {Object} protocol
* @returns {PageResource}
*/
PageResource.fromProtocol = function (protocol) {
try {
var page = new PageResource();
page.size = protocol.size || 0;
page.number = protocol.number || 0;
page.content = protocol.content || [];
page.sorts = protocol.sorts || [];
page.links = protocol.links || [];
page.totalElements = protocol.total_elements || 0;
page.totalPages = protocol.total_pages || 0;
page.numberOfElements = protocol.number_of_elements || 0;
page.hasNextPage = protocol.has_next_page || false;
page.isSlice = protocol.is_slice || false;
return page;
} catch (ex) {
return null;
}
};
return PageResource;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Post', [
'util.Values',
'enum.PostType',
'model.PostMap',
'model.PostVideo',
'SecurityContext',
'model.PostContent',
'model.PostGallery',
function (Values, PostType, PostMap, PostVideo, securityContext, PostContent, PostGallery) {
/**
* @model Post
*/
var Post = function () {
this.id = null; /* String */
this.title = null; /* String */
this.referenceId = null; /* String */
this.createDate = null; /* String */
this.updateDate = null; /* String */
this.type = null; /* enum.PostType */
this.sequence = null; /* Number */
this.userId = null; /* String */
this.map = null; /* model.PostMap */
this.content = null; /* model.PostContent */
this.video = null; /* model.PostVideo */
this.gallery = null; /* model.PostGallery */
this._title = null; /* String */
};
/**
* factory method for create Post with Content
*
* @returns {Post}
*/
function newContent() {
var post = new Post();
post.type = PostType.CONTENT;
post.content = new PostContent();
post._editing = true;
post.userId = securityContext.principal.id;
return post;
}
/**
* factory method for create Post with Map
*
* @returns {Post}
*/
function newMap() {
var post = new Post();
post.type = PostType.MAP;
post.map = new PostMap();
post._editing = true;
post.userId = securityContext.principal.id;
return post;
}
/**
* factory method for create Post with Video
*
* @returns {Post}
*/
function newVideo() {
var post = new Post();
post.type = PostType.VIDEO;
post.video = new PostVideo();
post._editing = true;
post.userId = securityContext.principal.id;
return post;
}
/**
* factory method for create Post with Gallery
*
* @returns {Post}
*/
function newGallery() {
var post = new Post();
post.type = PostType.GALLERY;
post.gallery = new PostGallery();
post._editing = true;
post.userId = securityContext.principal.id;
return post;
}
/**
* factory method for create post from type
*
* @param {String} type
* @returns {Post}
*/
Post.fromType = function (type) {
if (PostType.CONTENT.is(type)) {
return newContent();
}
if (PostType.MAP.is(type)) {
return newMap();
}
if (PostType.VIDEO.is(type)) {
return newVideo();
}
if (PostType.GALLERY.is(type)) {
return newGallery();
}
throw 'Unsupported post type.';
};
/**
* @param {Object} protocol
* @returns {Post}
*/
Post.fromProtocol = function (protocol) {
try {
var post = new Post();
post.id = protocol.post_id;
post.title = protocol.title;
post.referenceId = protocol.reference_id;
post.createDate = protocol.create_date;
post.updateDate = protocol.update_date;
post.type = PostType.valueOf(protocol.type);
post.sequence = protocol.post_sequence;
post.userId = protocol.user_id;
if (protocol.content) {
post.content = PostContent.fromProtocol(protocol.content);
}
if (protocol.map) {
post.map = PostMap.fromProtocol(protocol.map);
}
if (protocol.video) {
post.video = PostVideo.fromProtocol(protocol.video);
}
if (protocol.gallery) {
post.gallery = PostGallery.fromProtocol(protocol.gallery);
}
return post;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Post.prototype.toProtocol = function () {
return {
post_id: Values.asValue(this.id),
title: Values.asValue(this.title),
reference_id: Values.asValue(this.referenceId),
create_date: Values.asValue(this.createDate),
update_date: Values.asValue(this.updateDate),
type: Values.asValue(this.type),
post_sequence: Values.asValue(this.sequence),
user_id: Values.asValue(this.userId),
content: Values.asValue(this.content),
map: Values.asValue(this.map),
video: Values.asValue(this.video),
gallery: Values.asValue(this.gallery)
};
};
Post.prototype.backup = function () {
this._title = this.title;
if (this.content) {
this.content.backup();
}
if (this.map) {
this.map.backup();
}
if (this.video) {
this.video.backup();
}
if (this.gallery) {
this.gallery.backup();
}
};
Post.prototype.restore = function () {
this.title = this._title;
if (this.content) {
this.content.restore();
}
if (this.map) {
this.map.restore();
}
if (this.video) {
this.video.restore();
}
if (this.gallery) {
this.gallery.restore();
}
this._title = null;
};
return Post;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.PostContent', [
'util.Values',
function (Values) {
/**
* @model PostContent
*/
var PostContent = function () {
this.id = null; /* String */
this.content = null; /* String */
this._content = null; /* String */
};
/**
* @param {Object} protocol
* @returns {PostContent}
*/
PostContent.fromProtocol = function (protocol) {
try {
var content = new PostContent();
content.id = protocol.post_id;
content.content = protocol.content;
return content;
} catch (ex) {
return null;
}
};
/*
* @returns {Object}
*/
PostContent.prototype.toProtocol = function () {
return {
post_id: Values.asValue(this.id),
content: Values.asValue(this.content)
};
};
PostContent.prototype.backup = function () {
this._content = this.content;
};
PostContent.prototype.restore = function () {
this.content = this._content;
this._content = null;
};
return PostContent;
}
]);
/**
* @author jittagornp
* create 08/10/2014
*/
pamarin.factory('model.PostGallery', [
'util.Values',
'model.PostPhoto',
'model.ProtocolMapper',
function (Values, PostPhoto, ProtocolMapper) {
/**
* @model PostGallery
*/
var PostGallery = function () {
this.id = null; /* String */
this.description = null; /* String */
this.photos = null; /* Array<model.PostPhoto> */
this._description = null; /* String */
this._photos = null; /* Array<model.PostPhoto> */
};
/**
* @param {Object} protocol
* @returns {PostGallery}
*/
PostGallery.fromProtocol = function (protocol) {
try {
var post = new PostGallery();
post.id = protocol.post_id;
post.description = protocol.description;
post.photos = ProtocolMapper.fromArray(protocol.photos, PostPhoto);
return post;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
PostGallery.prototype.toProtocol = function () {
return {
post_id: Values.asValue(this.id),
description: Values.asValue(this.description),
photos: ProtocolMapper.toArray(this.photos)
};
};
PostGallery.prototype.backup = function () {
this._description = this.description;
this._photos = angular.copy(this.photos);
};
PostGallery.prototype.restore = function () {
this.description = this._description;
this.photos = this._photos;
this._description = null;
this._photos = null;
};
return PostGallery;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.PostMap', [
'enum.MapType',
'model.MapMarker',
'util.Values',
'enum.MapMarkerType',
'model.ProtocolMapper',
function (MapType, MapMarker, Values, MapMarkerType, ProtocolMapper) {
/**
* @model PostMap
*/
var PostMap = function () {
this.id = null; /* String */
this.description = null; /* String */
this.latitude = null; /* Number */
this.longitude = null; /* Number */
this.zoomLevel = null; /* Number */
this.mapType = MapType.ROADMAP; /* enum.MapType */
this.markers = null; /* Array<model.MapMarker> */
this.staticMapUrl = null; /* String */
this._description = null; /* String */
this._latitude = null; /* Number */
this._longitude = null; /* Number */
this._zoomLevel = null; /* Number */
this._mapType = null; /* enum.MapType */
this._markers = null; /* Array<model.MapMarker> */
this._staticMapUrl = null; /* String */
};
/**
* @param {Object} protocol
* @returns {PostMap}
*/
PostMap.fromProtocol = function (protocol) {
try {
var post = new PostMap();
post.id = protocol.post_id;
post.description = protocol.description;
post.latitude = protocol.latitude;
post.longitude = protocol.longitude;
post.zoomLevel = protocol.zoom_level;
post.mapType = MapType.valueOf(protocol.map_type);
post.markers = ProtocolMapper.fromArray(protocol.markers, MapMarker);
post.staticMapUrl = protocol.static_map_url;
return post;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
PostMap.prototype.toProtocol = function () {
return {
post_id: Values.asValue(this.id),
description: Values.asValue(this.description),
latitude: Values.asValue(this.latitude),
longitude: Values.asValue(this.longitude),
zoom_level: Values.asValue(this.zoomLevel),
map_type: Values.asValue(this.mapType),
markers: ProtocolMapper.toArray(this.markers)
};
};
PostMap.prototype.backup = function () {
this._description = this.description;
this._latitude = this.latitude;
this._longitude = this.longitude;
this._zoomLevel = this.zoomLevel;
this._mapType = this.mapType;
this._markers = angular.copy(this.markers);
this._staticMapUrl = this.staticMapUrl;
};
PostMap.prototype.restore = function () {
this.description = this._description;
this.latitude = this._latitude;
this.longitude = this._longitude;
this.zoomLevel = this._zoomLevel;
this.mapType = this._mapType;
this.markers = this._markers;
this.staticMapUrl = this._staticMapUrl;
this._description = null;
this._latitude = null;
this._longitude = null;
this._zoomLevel = null;
this._mapType = null;
this._markers = null;
this._staticMapUrl = null;
};
/**
* @param {model.MapMarker} marker
*/
PostMap.prototype.addMarker = function (marker) {
if (!this.markers) {
this.markers = [];
}
marker.referenceId = this.id;
marker.referenceType = MapMarkerType.POST;
this.markers.push(marker);
};
return PostMap;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.PostPageResource', [
'model.PageResource',
'model.Post',
'model.ProtocolMapper',
function (PageResource, Post, ProtocolMapper) {
/**
* @model PostPageResource
*/
var PostPageResource = function () {
};
/*
* @param {Object} protocol
* @returns {model.PageResource}
*/
PostPageResource.fromProtocol = function (protocol) {
var page = PageResource.fromProtocol(protocol);
page.content = ProtocolMapper.fromArray(page.content, Post);
return page;
};
return PostPageResource;
}
]);
/**
* @author jittagornp
* create 08/10/2014
*/
pamarin.factory('model.PostPhoto', [
'util.Values',
function (Values) {
/**
* @model PostPhoto
*/
var PostPhoto = function () {
this.id = null; /* String */
this.postId = null; /* String */
this.displayName = null; /* String */
this.mimeType = null; /* String */
this.description = null; /* String */
this.createDate = null; /* String */
this.updateDate = null;
this._description = null; /* String */
};
/**
* @param {Object} protocol
* @returns {PostPhoto}
*/
PostPhoto.fromProtocol = function (protocol) {
try {
var post = new PostPhoto();
post.id = protocol.photo_id;
post.postId = protocol.post_id;
post.displayName = protocol.display_name;
post.mimeType = protocol.mime_type;
post.description = protocol.description;
post.createDate = protocol.create_date;
post.updateDate = protocol.update_date;
return post;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
PostPhoto.prototype.toProtocol = function () {
return {
photo_id: Values.asValue(this.id),
post_id: Values.asValue(this.postId),
display_name: Values.asValue(this.displayName),
mime_type: Values.asValue(this.mimeType),
description: Values.asValue(this.description),
create_date: Values.asValue(this.createDate),
update_date: Values.asValue(this.updateDate)
};
};
PostPhoto.prototype.backup = function () {
this._description = this.description;
};
PostPhoto.prototype.restore = function () {
this.description = this._description;
this._description = null;
};
return PostPhoto;
}
]);
/**
* @author jittagornp
* create 24/09/2015
*/
pamarin.factory('model.PostVideo', [
'util.Values',
'util.StringUtils',
'util.YoutubeUtils',
function (Values, StringUtils, YoutubeUtils) {
/**
* @model PostVideo
*/
var PostVideo = function () {
this.id = null; /* String */
this.description = null; /* String */
this.link = null;
this.videoParam = '';
this._description = null; /* String */
this._link = null; /* String */
};
/**
* @param {Object} protocol
* @returns {PostVideo}
*/
PostVideo.fromProtocol = function (protocol) {
try {
var post = new PostVideo();
post.id = protocol.post_id;
post.description = protocol.description;
post.link = protocol.link;
post.findVideoParam();
return post;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
PostVideo.prototype.toProtocol = function () {
return {
post_id: Values.asValue(this.id),
description: Values.asValue(this.description),
link: Values.asValue(this.link)
};
};
PostVideo.prototype.findVideoParam = function () {
this.videoParam = YoutubeUtils.getVideoParamsFromUrl(this.link);
return this;
};
PostVideo.prototype.isYouTube = function () {
return StringUtils.hasText(this.videoParam);
};
PostVideo.prototype.backup = function () {
this._description = this.description;
this._link = this.link;
};
PostVideo.prototype.restore = function () {
this.description = this._description;
this.link = this._link;
this._description = null;
this._link = null;
};
return PostVideo;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Presenter', [
'model.User',
'model.Follows',
'util.Values',
function (User, Follows, Values) {
/**
* @model Presenter
*/
var Presenter = function () {
this.user = null; /* model.User */
this.follows = null; /* model.Follows */
};
/**
* @param {Object} protocol
* @returns {Presenter}
*/
Presenter.fromProtocol = function (protocol) {
try {
var presenter = new Presenter();
presenter.user = User.fromProtocol(protocol.user);
presenter.follows = Follows.fromProtocol(protocol.follows);
return presenter;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Presenter.prototype.toProtocol = function () {
return {
user: Values.asValue(this.user),
follows: Values.asValue(this.follows)
};
};
return Presenter;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.ProtocolMapper', [
function () {
/**
* @model ProtocolMapper
*/
var ProtocolMapper = function () {
};
/**
* for convert object to Object protocol
*
* @param {Array} arr
* @returns {Array}
*/
ProtocolMapper.toArray = function (arr) {
var protocols = [];
if (!arr) {
return protocols;
}
angular.forEach(arr, function (obj) {
protocols.push(obj.toProtocol());
});
return protocols;
};
/**
* for convert Object protocol to object
*
* @param {Array} arr
* @param {Function} model which has static method .fromProtocol(protocol)
* @returns {Array}
*/
ProtocolMapper.fromArray = function (arr, clazz) {
var objs = [];
if (!arr) {
return objs;
}
angular.forEach(arr, function (item) {
objs.push(clazz.fromProtocol(item));
});
return objs;
};
return ProtocolMapper;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Tag', [
'model.TagLookup',
'util.Values',
function (TagLookup, Values) {
/**
* @model Tag
*/
var Tag = function () {
this.id = {
tripId: null, /* String */
lookupId: null /* String */
};
this.lookup = null; /* model.TagLookup */
this.createDate = null; /* String */
};
/**
* @param {Object} protocol
* @returns {Tag}
*/
Tag.fromProtocol = function (protocol) {
try {
var tag = new Tag();
tag.id.tripId = protocol.id.trip_id;
tag.id.lookupId = protocol.id.lookup_id;
tag.lookup = TagLookup.fromProtocol(protocol.lookup);
tag.createDate = protocol.create_date;
return tag;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Tag.prototype.toProtocol = function () {
return {
id: {
trip_id: Values.asValue(this.id, function () {
return this.id.tripId;
}, this),
lookup_id: Values.asValue(this.id, function () {
return this.id.lookupId;
}, this)
},
create_date: Values.asValue(this.createDate)
};
};
return Tag;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.TagLookup', [
'util.Values',
function (Values) {
/**
* @model TagLookup
*/
var TagLookup = function () {
this.id = null; /* String */
this.name = null; /* String */
this.description = null; /* String */
};
/*
* @param {Object} protocol
* @returns {TagLookup}
*/
TagLookup.fromProtocol = function (protocol) {
try {
var lookup = new TagLookup();
lookup.id = protocol.lookup_id;
lookup.name = protocol.name;
lookup.description = protocol.description;
return lookup;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
TagLookup.prototype.toProtocol = function () {
return {
lookup_id: Values.asValue(this.id),
name: Values.asValue(this.name)
};
};
return TagLookup;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.TagMapper', [
'model.Tag',
function (Tag) {
/**
* @model TagMapper
*/
var TagMapper = function () {
};
/**
* @param {model.TagLookup} lookup
* @param {String} tripId
* @returns {model.Tag}
*/
TagMapper.lookup2Tag = function (lookup, tripId) {
try {
var tag = new Tag();
tag.id.tripId = tripId;
tag.id.lookupId = lookup.id;
tag.lookup = lookup;
return tag;
} catch (ex) {
return null;
}
};
/**
* @param {Array<model.TagLookup>} lookups
* @param {type} tripId
* @returns {Array<model.Tag>}
*/
TagMapper.lookups2Tags = function (lookups, tripId) {
var tags = [];
angular.forEach(lookups, function (lookup) {
var tag = TagMapper.lookup2Tag(lookup, tripId);
if (tag) {
tags.push(tag);
}
});
return tags;
};
/**
* @param {model.Tag} tag
* @returns {mode.TagLookup}
*/
TagMapper.tag2Lookup = function (tag) {
if (!tag) {
return null;
}
return tag.lookup;
};
/**
* @param {Array<model.Tag>} tags
* @returns {Array<mode.TagLookup>}
*/
TagMapper.tags2Lookups = function (tags) {
var lookups = [];
angular.forEach(tags, function (tag) {
var lookup = TagMapper.tag2Lookup(tag);
if (lookup) {
lookups.push(lookup);
}
});
return lookups;
};
return TagMapper;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Tags', [
'model.ProtocolMapper',
function (ProtocolMapper) {
/**
* @model Tags
*/
var Tags = function () {
this.tags = null; /* Array<model.Tag> */
};
/**
* @param {Array<model.Tag>} tags
* @returns {Tags}
*/
Tags.fromTags = function (tags) {
var tgs = new Tags();
tgs.tags = tags;
return tgs;
};
/**
* @returns {Object}
*/
Tags.prototype.toProtocol = function () {
return {
tags: ProtocolMapper.toArray(this.tags)
};
};
return Tags;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.Trip', [
'util.Time',
'model.Tag',
'model.Link',
'model.Presenter',
'util.Values',
'enum.ArticleStatus',
'model.ProtocolMapper',
function (Time, Tag, Link, Presenter, Values, ArticleStatus, ProtocolMapper) {
/**
* @model Trip
*/
var Trip = function () {
this.id = null; /* String */
this.tripname = null; /* String */
this.name = null; /* String */
this.description = null; /* String */
this.userId = null; /* String */
this.presenter = null; /* model.Presenter */
this.tags = null; /* Array<model.Tag> */
this.createDate = null; /* String */
this.createDateDesc = null; /* String */
this.publishedDate = null; /* String */
this.publishedDateDesc = null; /* String */
this.updateDate = null; /* String */
this.updateDateDesc = null; /* String */
this.status = null; /* enum.ArticleStatus */
this.link = null; /* model.Link */
this.isOwner = null; /* Boolean */
};
/**
* @param {Object} protocol
* @returns {model.Trip}
*/
Trip.fromProtocol = function (protocol) {
try {
var trip = new Trip();
trip.id = protocol.trip_id;
trip.tripname = protocol.tripname;
trip.name = protocol.name;
trip.description = protocol.description;
trip.userId = protocol.user_id;
trip.presenter = Presenter.fromProtocol(protocol.presenter);
trip.tags = ProtocolMapper.fromArray(protocol.tags, Tag);
trip.createDate = protocol.create_date;
trip.createDateDesc = Time.fromNow(protocol.create_date);
trip.publishedDate = protocol.published_date;
trip.publishedDateDesc = Time.fromNow(protocol.published_date);
trip.updateDate = protocol.update_date;
trip.updateDateDesc = Time.fromNow(protocol.update_date);
trip.status = ArticleStatus.valueOf(protocol.status) || ArticleStatus.DRAFF;
trip.link = Link.fromProtocol(protocol.link);
trip.isOwner = protocol.is_owner || false;
return trip;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
Trip.prototype.toProtocol = function () {
return {
trip_id: Values.asValue(this.id),
tripname: Values.asValue(this.tripname),
name: Values.asValue(this.name),
user_id: Values.asValue(this.userId),
tags: Values.asValue(this.tags, ProtocolMapper.toArray(this.tags)),
create_date: Values.asValue(this.createDate),
published_date: Values.asValue(this.publishedDate),
update_date: Values.asValue(this.updateDate),
status: Values.asValue(this.status),
link: Values.asValue(this.link),
is_owner: Values.asValue(this.isOwner)
};
};
return Trip;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.TripCard', [
'model.Trip',
'model.Likes',
function (Trip, Likes) {
/**
* @model TripCard
*/
var TripCard = function () {
this.trip = null; /* model.Trip */
this.likes = null; /* model.Likes */
this.numberOfComments = null; /* Number */
};
/**
* @param {Object} protocol
* @returns {UserCard}
*/
TripCard.fromProtocol = function (protocol) {
try {
var card = new TripCard();
card.trip = Trip.fromProtocol(protocol.trip);
card.likes = Likes.fromProtocol(protocol.likes);
card.numberOfComments = protocol.number_of_comments || 0;
return card;
} catch (ex) {
return null;
}
};
return TripCard;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.TripCardPageResource', [
'model.PageResource',
'model.TripCard',
'model.ProtocolMapper',
function (PageResource, TripCard, ProtocolMapper) {
/**
* @model TripCardPageResource
*/
var TripCardPageResource = function () {
};
/*
* @param {Object} protocol
* @returns {model.PageResource}
*/
TripCardPageResource.fromProtocol = function (protocol) {
var page = PageResource.fromProtocol(protocol);
page.content = ProtocolMapper.fromArray(page.content, TripCard);
return page;
};
return TripCardPageResource;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.TripPageContent', [
'util.Time',
'model.Trip',
'model.Likes',
'model.Comment',
'SecurityContext',
'model.PostPageResource',
'model.CommentPageResource',
'algorithm.SequencialDiv2Add',
function (Time, Trip, Likes, Comment, securityContext, PostPageResource, CommentPageResource, SequencialDiv2Add) {
/**
* @model TripPageContent
*/
var TripPageContent = function () {
this.trip = null; /* model.Trip */
this.numberOfPosts = null; /* Number */
this.postPage = null; /* model.PostPageResource */
this.likes = null; /* model.Likes */
this.numberOfComments = null; /* Number */
this.commentPage = null; /* model.CommentPageResource */
this.comment = null; /* model.Comment */
};
/**
* @param {object} protocol
* @param {Array<Post>} content
*/
function translate2PostPage(protocol, content) {
content.numberOfPosts = protocol.number_of_posts || 0;
content.postPage = PostPageResource.fromProtocol(protocol.post_page);
content.postPage.number = content.postPage.number || 0;
content.postPage.hasNextPage = content.postPage.hasNextPage || false;
angular.forEach(content.postPage.content, function (post) {
post.reference = content.trip;
});
}
/**
* @param {object} protocol
* @param {Array<comment>} content
*/
function translate2CommentPage(protocol, content) {
content.numberOfComments = protocol.number_of_comments || 0;
content.commentPage = CommentPageResource.fromProtocol(protocol.comment_page);
content.commentPage.number = content.commentPage.number || 0;
content.commentPage.hasNextPage = content.commentPage.hasNextPage || false;
angular.forEach(content.commentPage.content, function (comment) {
comment.reference = content.trip;
});
}
/**
* @param {Object} protocol
* @returns {TripPageContent}
*/
TripPageContent.fromProtocol = function (protocol) {
try {
var content = new TripPageContent();
content.trip = Trip.fromProtocol(protocol.trip);
translate2PostPage(protocol, content);
translate2CommentPage(protocol, content);
content.likes = Likes.fromProtocol(protocol.likes);
return content;
} catch (ex) {
return null;
}
};
/**
* @param {model.Post} post
* @returns {model.Post}
*/
TripPageContent.prototype.setupPost = function (post) {
post.reference = this.trip;
post.referenceId = this.trip.id;
return post;
};
/**
* @param {model.Post} post
* @param {Number} index
*/
TripPageContent.prototype.replacePost = function (post, index) {
this.trip.updateDateDesc = Time.fromNow(post.updateDate);
this.postPage.content.splice(index, 1, this.setupPost(post));
};
/**
* @param {model.Post} post
*/
TripPageContent.prototype.addPost = function (post) {
this.postPage.content.push(this.setupPost(post));
this.numberOfPosts = this.numberOfPosts + 1;
};
/**
* @param {model.Post} post
* @param {Number} index
*/
TripPageContent.prototype.insertPost = function (post, index) {
SequencialDiv2Add.fromArray(this.postPage.content)
.byStep(1000)
.toIndex(index)
.add(this.setupPost(post));
this.numberOfPosts = this.numberOfPosts + 1;
};
/**
* @param {model.Post} post
* @returns {Number}
*/
TripPageContent.prototype.indexOfPost = function (post) {
return this.postPage.content.indexOf(post);
};
/**
* @param {model.Post} post
*/
TripPageContent.prototype.removePost = function (post) {
this.numberOfPosts = this.numberOfPosts - 1;
this.postPage.content.splice(this.indexOfPost(post), 1);
};
/*
* @param {PageResource} page
*/
TripPageContent.prototype.addPostPage = function (page) {
this.postPage.number = this.postPage.number + 1;
this.postPage.hasNextPage = page.hasNextPage;
angular.forEach(page.content, function (post) {
this.addPost(post);
}, this);
};
/**
* @param {Array<model.Tag>} tags
*/
TripPageContent.prototype.setTags = function (tags) {
if (tags.length) {
this.trip.updateDateDesc = Time.fromNow(tags[0].createDate);
}
this.trip.tags = tags;
};
/**
* @returns {model.Comment}
*/
TripPageContent.prototype.newComment = function () {
if (this.trip) {
var cmnt = new Comment();
cmnt.referenceId = this.trip.id;
cmnt.reference = this.trip;
cmnt.user = securityContext.user();
cmnt.userId = cmnt.user.id;
this.comment = cmnt;
return this.comment;
}
return null;
};
/**
* @param {model.Comment} comment
*/
TripPageContent.prototype.addComment = function (comment) {
this.numberOfComments = this.numberOfComments + 1;
this.commentPage.content.splice(0, 0, comment);
this.comment = this.newComment();
};
/**
* @param {model.Comment} comment
* @returns {Number}
*/
TripPageContent.prototype.indexOfComment = function (comment) {
return this.commentPage.content.indexOf(comment);
};
/**
* @param {model.Comment} comment
* @param {Number} index
*/
TripPageContent.prototype.replaceComment = function (comment, index) {
this.commentPage.content.splice(index, 1, comment);
};
/**
* @param {model.Comment} comment
*/
TripPageContent.prototype.removeComment = function (comment) {
this.numberOfComments = this.numberOfComments - 1;
this.commentPage.content.splice(this.indexOfComment(comment), 1);
};
/*
* @param {PageResource} page
*/
TripPageContent.prototype.addCommentPage = function (page) {
this.commentPage.number = this.commentPage.number + 1;
this.commentPage.hasNextPage = page.hasNextPage;
angular.forEach(page.content, function (comment) {
this.commentPage.content.push(comment);
}, this);
};
return TripPageContent;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.TripPageResource', [
'model.Trip',
'model.PageResource',
'model.ProtocolMapper',
function (Trip, PageResource, ProtocolMapper) {
/**
* @model TripPageResource
*/
var TripPageResource = function () {
};
/**
* @param {Object} protocol
* @returns {PageResource}
*/
TripPageResource.fromProtocol = function (protocol) {
try {
var page = PageResource.fromProtocol(protocol);
page.content = ProtocolMapper.fromArray(page.content, Trip);
return page;
} catch (ex) {
return null;
}
};
return TripPageResource;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.User', [
'messages',
'model.Link',
'enum.Enumerate',
'model.Authority',
'util.Values',
'model.ProtocolMapper',
function (messages, Link, Enumerate, Authority, Values, ProtocolMapper) {
/**
* @model User
*/
var User = function () {
this.id = null; /* String */
this.username = null; /* String */
this.firstName = null; /* String */
this.lastName = null; /* String */
this.name = null; /* String */
this.email = null; /* String */
this.gender = null; /* User.Gener */
this.locale = null; /*String */
this.timezone = null; /* Number */
this.authorities = null; /* Array<model.Authority> */
this.picture = null; /* String */
this.social = null; /* User.Social */
this.socialId = null; /* String */
this.createDate = null; /* String */
this.updateDate = null; /* String */
this.aboutMe = null; /* String */
this.link = null; /* model.Link */
this.isOwner = null; /* Boolean */
};
/**
* @enum User.Gender
*/
User.Gender = Enumerate([
{
name: 'UNKNOWN',
description: messages.UNKNOWN
},
{
name: 'MALE',
description: messages.MALE
},
{
name: 'FEMALE',
description: messages.FEMALE
}
]);
/**
* @enum User.Social
*/
User.Social = Enumerate([
'FACEBOOK',
'GOOGLE_PLUS',
'TWITTER'
]);
/**
* @param {Object} protocol
* @returns {User}
*/
User.fromProtocol = function (protocol) {
try {
var user = new User();
user.id = protocol.user_id;
user.username = protocol.username;
user.firstName = protocol.first_name;
user.lastName = protocol.last_name;
user.name = protocol.name;
user.email = protocol.email;
user.gender = User.Gender.valueOf(protocol.gender);
user.locale = protocol.locale;
user.timezone = protocol.timezone;
user.authorities = ProtocolMapper.fromArray(protocol.authorities, Authority);
user.picture = protocol.picture;
user.social = User.Social.valueOf(protocol.social);
user.socialId = protocol.social_id;
user.createDate = protocol.create_date;
user.updateDate = protocol.update_date;
user.aboutMe = protocol.about_me;
user.link = Link.fromProtocol(protocol.link);
user.isOwner = protocol.is_owner || false;
return user;
} catch (ex) {
return null;
}
};
/**
* @returns {Object}
*/
User.prototype.toProtocol = function () {
return {
user_id: Values.asValue(this.id),
username: Values.asValue(this.username),
first_name: Values.asValue(this.firstName),
last_name: Values.asValue(this.lastName),
email: Values.asValue(this.email),
gender: Values.asValue(this.gender),
locale: Values.asValue(this.locale),
timezone: Values.asValue(this.timezone),
authorities: ProtocolMapper.toArray(this.authorities),
picture: Values.asValue(this.picture),
social: Values.asValue(this.social),
social_id: Values.asValue(this.socialId),
create_date: Values.asValue(this.createDate),
update_date: Values.asValue(this.updateDate),
about_me: Values.asValue(this.aboutMe)
};
};
return User;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.UserCard', [
'model.User',
function (User) {
/**
* @model UserCard
*/
var UserCard = function () {
this.user = null; /* model.User */
this.numberOfTrips = null; /* Number */
this.followed = null; /* Boolean */
};
/**
* @param {Object} protocol
* @returns {UserCard}
*/
UserCard.fromProtocol = function (protocol) {
try {
var card = new UserCard();
card.user = User.fromProtocol(protocol.user);
card.numberOfTrips = protocol.number_of_trips || 0;
card.followed = protocol.followed || false;
return card;
} catch (ex) {
return null;
}
};
return UserCard;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.UserCardPageResource', [
'model.PageResource',
'model.UserCard',
'model.ProtocolMapper',
function (PageResource, UserCard, ProtocolMapper) {
/**
* @model UserCardPageResource
*/
var UserCardPageResource = function () {
};
/*
* @param {Object} protocol
* @returns {model.PageResource}
*/
UserCardPageResource.fromProtocol = function (protocol) {
var page = PageResource.fromProtocol(protocol);
page.content = ProtocolMapper.fromArray(page.content, UserCard);
return page;
};
return UserCardPageResource;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('model.UserPageContent', [
'model.UserCard',
'model.TripCardPageResource',
'model.UserCardPageResource',
function (UserCard, TripCardPageResource, UserCardPageResource) {
/**
* @model UserPageContent
*/
var UserPageContent = function () {
this.userCard = null; /* model.UserCard */
this.tripCardPage = null; /* model.TripCardPageResource */
this.userCardPage = null; /* model.UserCardPageResource */
this.numberOfTrips = null; /* Number */
this.numberOfTripLikeds = null; /* Number */
this.numberOfFollowers = null; /* Number */
this.numberOfFollowings = null; /* Number */
};
/**
* @param {Object} protocol
* @returns {UserPageContent}
*/
UserPageContent.fromProtocol = function (protocol) {
try {
var content = new UserPageContent();
if (protocol.user_card) {
content.userCard = UserCard.fromProtocol(protocol.user_card);
}
if (protocol.trip_card_page) {
content.tripCardPage = TripCardPageResource.fromProtocol(protocol.trip_card_page);
}
if (protocol.user_card_page) {
content.userCardPage = UserCardPageResource.fromProtocol(protocol.user_card_page);
}
content.numberOfTrips = protocol.number_of_trips || 0;
content.numberOfTripLikeds = protocol.number_of_trip_likeds || 0;
content.numberOfFollowers = protocol.number_of_followers || 0;
content.numberOfFollowings = protocol.number_of_followings || 0;
return content;
} catch (ex) {
return null;
}
};
/**
* @param {PageResource} page
*/
UserPageContent.prototype.addTripCardPage = function (page) {
this.tripCardPage.number = page.number;
this.tripCardPage.hasNextPage = page.hasNextPage;
angular.forEach(page.content, function (card) {
this.tripCardPage.content.push(card);
}, this);
};
/**
* @param {PageResource} page
*/
UserPageContent.prototype.addUserCardPage = function (page) {
this.userCardPage.number = page.number;
this.userCardPage.hasNextPage = page.hasNextPage;
angular.forEach(page.content, function (card) {
this.userCardPage.content.push(card);
}, this);
};
return UserPageContent;
}
]);
/**
* @author jittagornp
* create 06/09/2015
*/
pamarin.factory('dto.TripSettingsDto', [
'util.Values',
function (Values) {
/**
* @dto TripSettingsDto
*/
var TripSettingsDto = function () {
this.tripId = null; /* String */
this.name = null; /* String */
this.tripname = null; /* String */
};
/**
* @returns {Object}
*/
TripSettingsDto.prototype.toProtocol = function () {
return {
trip_id: Values.asValue(this.tripId),
name: Values.asValue(this.name),
tripname: Values.asValue(this.tripname)
};
};
/**
* @param {Object} protocol
* @returns {TripSettingsDto}
*/
TripSettingsDto.fromProtocol = function (protocol) {
try {
var dto = new TripSettingsDto();
dto.tripId = protocol.trip_id;
dto.tripname = protocol.tripname;
dto.name = protocol.name;
return dto;
} catch (ex) {
return null;
}
};
return TripSettingsDto;
}
]);
/**
* @author jittagornp
* create 05/09/2015
*/
pamarin.factory('dto.WriteTripDto', [
'util.Values',
function (Values) {
/**
* @dto WriteTripDto
*/
var WriteTripDto = function () {
this.name = null; /* String */
};
/**
* @returns {Object}
*/
WriteTripDto.prototype.toProtocol = function () {
return {
name: Values.asValue(this.name)
};
};
return WriteTripDto;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.GMarkerUtils', [
function () {
/**
* @util GMarkerUtils
*/
var GMarkerUtils = function () {
};
/**
* @param {google.maps.Marker} gmarker
* @returns {google.maps.LatLng}
*/
GMarkerUtils.toLatLng = function (gmarker) {
return gmarker.getPosition();
};
/**
* @param {Array<google.maps.Marker>} gmarkers
* @returns {Array<google.maps.LatLng>}
*/
GMarkerUtils.toLatLngs = function (gmarkers) {
var latLngs = [];
angular.forEach(
gmarkers,
function (gmarker) {
latLngs.push(GMarkerUtils.toLatLng(gmarker));
}
);
return latLngs;
};
return GMarkerUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.GPlaceUtils', [
function () {
/**
* @util GPlaceUtils
*/
var GPlaceUtils = function () {
};
/**
* @param {google.maps.Place} place
* @returns {google.maps.LatLng}
*/
GPlaceUtils.toLatLng = function (place) {
return place.geometry.location;
};
/**
* @param {Array<google.maps.Place>} places
* @returns {Array<google.maps.LatLng>}
*/
GPlaceUtils.toLatLngs = function (places) {
var latLngs = [];
angular.forEach(
places,
function (place) {
latLngs.push(GPlaceUtils.toLatLng(place));
}
);
return latLngs;
};
return GPlaceUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.GoogleMapUtils', [
'util.GpsUtils',
'util.MathUtils',
'util.GMarkerUtils',
function (GpsUtils, MathUtils, GMarkerUtils) {
/**
* @util GoogleMapUtils
*/
var GoogleMapUtils = function () {
};
/**
* @param {google.maps.LatLng} position
* @returns {Object}
*/
function toGps(position) {
return {
latitude: position.lat(),
longitude: position.lng()
};
}
/**
* @param {Number} distance meter
* @returns {Number}
*/
GoogleMapUtils.calculateZoomLevel = function (distance) {
var DISTANCE_ZOOM_LEVEL0 = 73728000;
var MIN_ZOOM_LEVEL = 0;
var MAX_ZOOM_LEVEL = 21;
var result = DISTANCE_ZOOM_LEVEL0;
var level = 0;
while ((result /= 2.0) > distance) {
level = level + 1;
}
if (level < MIN_ZOOM_LEVEL) {
return MIN_ZOOM_LEVEL;
}
if (level > MAX_ZOOM_LEVEL) {
return MAX_ZOOM_LEVEL;
}
return level - 1;
};
/**
* @param {google.maps.LatLng} center
* @param {Array<google.maps.LatLng>} latLngs
* @returns {Number}
*/
GoogleMapUtils.findMaxDistance = function (center, latLngs) {
var distance = 0;
angular.forEach(
latLngs,
function (latLng) {
var dst = GpsUtils.findDistance(toGps(center), toGps(latLng));
if (dst > distance) {
distance = dst;
}
}
);
return distance;
};
/**
* @param {google.maps.LatLng} center
* @param {Array<google.maps.LatLng>} latLngs
* @returns {Number}
*/
GoogleMapUtils.findLatLngOfMinDistance = function (center, latLngs) {
var distance = Number.MAX_VALUE;
var currentLatLng = null;
angular.forEach(
latLngs,
function (latLng) {
var dst = GpsUtils.findDistance(toGps(center), toGps(latLng));
if (dst < distance) {
distance = dst;
currentLatLng = latLng;
}
}
);
return currentLatLng;
};
/**
* @param {Array<google.maps.Marker>} gmarkers
* @returns {Object}
*/
function findMaxMin(gmarkers) {
var latitudes = [];
var longitudes = [];
angular.forEach(
gmarkers,
function (gmarker) {
var position = gmarker.getPosition();
latitudes.push(position.lat());
longitudes.push(position.lng());
}
);
return{
minLat: MathUtils.findMin(latitudes),
maxLat: MathUtils.findMax(latitudes),
minLng: MathUtils.findMin(longitudes),
maxLng: MathUtils.findMax(longitudes)
};
}
/**
* @param {Array<google.maps.Marker>} gmarkers
* @returns {google.maps.LatLng}
*/
GoogleMapUtils.calculateFocus = function (gmarkers) {
var result = findMaxMin(gmarkers);
var center = new google.maps.LatLng(
(result.minLat + result.maxLat) / 2,
(result.minLng + result.maxLng) / 2
);
var latLngs = GMarkerUtils.toLatLngs(gmarkers);
var distance = GoogleMapUtils.findMaxDistance(center, latLngs);
var zoom = GoogleMapUtils.calculateZoomLevel(distance);
return {
center: center,
zoom: zoom
};
};
return GoogleMapUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.GpsUtils', [
function () {
/**
* code for compute distance of GPS 2 points
*
* @author redcorw
* create 01/12/2013
* link http://na5cent.blogspot.com/2011/07/gps-2-javascript.html
*/
var BETWEEN_DEGREE = 15;
var THOUSAND_METER = 1000;
/**
* define surface distance per 1 degree change
*/
var SURFACE_DISTANCE_PER_ONE_DEGREE = [
{latitude: 110.574, longitude: 111.320}, //0 degree
{latitude: 110.649, longitude: 107.551}, //15 degree
{latitude: 110.852, longitude: 96.486}, //30 degree
{latitude: 111.132, longitude: 78.847}, //45 degree
{latitude: 111.412, longitude: 55.800}, //60 degree
{latitude: 111.618, longitude: 28.902}, //75 degree
{latitude: 111.694, longitude: 0.000} //90 degree
];
function getSurfaceDistance(gps) {
return SURFACE_DISTANCE_PER_ONE_DEGREE[parseInt(gps.latitude / BETWEEN_DEGREE)]; //depend on latitude
}
function getLatitudeDistance(gps) {
return getSurfaceDistance(gps).latitude * THOUSAND_METER;
}
function getLongitudeDistance(gps) {
return getSurfaceDistance(gps).longitude * THOUSAND_METER;
}
/**
* @util GpsUtils
*/
var GpsUtils = function () {
};
GpsUtils.findDistance = function (gps1, gps2) {
var latitudeDistance1 = getLatitudeDistance(gps1); //a1
var latitudeDistance2 = getLatitudeDistance(gps2); //a2
var longitudeDistance1 = getLongitudeDistance(gps1); //b1
var longitudeDistance2 = getLongitudeDistance(gps2); //b2
// (X2 * a2 - X1 * a1) ^ 2
var power1 = Math.pow((gps2.latitude * latitudeDistance2) - (gps1.latitude * latitudeDistance1), 2);
// (Y2 * b2 - Y1 * b1) ^ 2
var power2 = Math.pow((gps2.longitude * longitudeDistance2) - (gps1.longitude * longitudeDistance1), 2);
return Math.sqrt(power1 + power2);
};
return GpsUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.Http', [
'$http',
'util.RequestUtils',
function ($http, RequestUtils) {
/**
* @util Http
*/
var Http = function () {
};
var request = function (url, method, data, contentType) {
return {
method: method,
url: url,
headers: {
'Content-Type': contentType
},
data: data
};
};
/**
* @param {String} url
* @param {Object} data_opt
* @returns {$http}
*/
Http.get = function (url, data_opt) {
return $http(request(
url + (data_opt ? ('?' + RequestUtils.toRequestString(data_opt)) : ''),
'get',
null,
'application/json'
));
};
/**
* @param {String} url
* @param {Object} data_opt
* @returns {$http}
*/
Http.post = function (url, data_opt) {
return $http(request(
url,
'post',
JSON.stringify(data_opt),
'application/json'
));
};
/**
* @param {String} url
* @param {Object} data_opt
* @returns {$http}
*/
Http.put = function (url, data_opt) {
return $http(request(
url,
'put',
JSON.stringify(data_opt),
'application/json'
));
};
/**
* @param {String} url
* @param {Object} data_opt
* @returns {$http}
*/
Http.delete = function (url, data_opt) {
return $http(request(
url,
'delete',
JSON.stringify(data_opt),
'application/json'
));
};
/**
* @param {String} url
* @param {Object} data_opt
* @returns {$http}
*/
Http.postForm = function (url, data_opt) {
return $http(request(
url,
'post',
RequestUtils.toRequestString(data_opt),
'application/x-www-form-urlencoded'
));
};
return Http;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.MathUtils', [
function () {
/**
* @util MathUtils
*/
var MathUtils = function () {
};
/**
* @param {Number} arr
* @returns {Number}
*/
MathUtils.findMax = function (arr) {
return Math.max.apply(Math, arr);
};
/**
* @param {Number} arr
* @returns {Number}
*/
MathUtils.findMin = function (arr) {
return Math.min.apply(Math, arr);
};
return MathUtils;
}
]);
/**
* @author jittagornp
* create 29/09/2015
*/
pamarin.factory('util.MessageDisplay', [
'util.StringTokenizer',
function (StringTokenizer) {
/**
* @util MessageDisplay
*/
var MessageDisplay = function () {
};
/**
* message display size less than or equal
*/
MessageDisplay.SIZE = 120;
/**
* @param {String} str
* @returns {String}
*/
MessageDisplay.substring = function (str) {
return StringTokenizer.substring(str, MessageDisplay.SIZE);
};
return MessageDisplay;
}
]);
/**
* @author jittagornp
* create 29/09/2015
*/
pamarin.factory('util.Messages', [
function () {
/**
* @util Messages
*/
var Messages = function () {
};
/**
* @param {String} msg
* @param {Object} params
*
* @returns {String}
*/
Messages.replace = function (msg, params) {
return msg.replace(/\$\{(.*?)\}/g, function (name) {
return (params || {})[name.replace(/[(\$\{)\}]/g, '')] || name;
});
};
return Messages;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.PageUtils', [
'model.PageRequest',
function (PageRequest) {
/**
* @util PageUtils
*/
var PageUtils = function () {
};
/**
* @param {PageResource} page
* @param {Function} callback
*/
PageUtils.nextPage = function (page, callback) {
if (page.hasNextPage) {
callback(new PageRequest(page.number + 1, page.size));
}
};
return PageUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.RequestUtils', [
function () {
/**
* @util RequestUtils
*/
var RequestUtils = function () {
};
/**
* @param {Object} data
* @returns {String}
*/
RequestUtils.toRequestString = function (data) {
var key, result = [];
for (key in data) {
if (data.hasOwnProperty(key)) {
result.push(encodeURIComponent(key) + "=" + encodeURIComponent(data[key]));
}
}
return result.join("&");
};
return RequestUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.ResponseMapper', [
'messages',
'model.PageResource',
'model.ProtocolMapper',
'component.AlertDialog',
'validation.Validations',
function (messages, PageResource, ProtocolMapper, AlertDialog, Validations) {
/**
* @util ResponseMapper
*/
var ResponseMapper = function (Http) {
this.Http = Http;
this.model = null;
this._filter = null;
};
/**
* @param {util.Http} Http
* @returns {ResponseMapper}
*/
ResponseMapper.fromHttp = function (Http) {
return new ResponseMapper(Http);
};
/**
* @param {@model} model
* @returns {ResponseMapper}
*/
ResponseMapper.prototype.map2Model = function (model) {
this.model = model;
if (!angular.isFunction(model)) {
throw new Error('invalid model type.');
}
return this;
};
/**
* @param {Function} callback
* @returns {ResponseMapper}
*/
ResponseMapper.prototype.filter = function (callback) {
this._filter = callback;
return this;
};
function operateWhenError(protocol) {
if (protocol.error.fields) { //http 400
Validations.showError(protocol.error.fields);
return;
}
AlertDialog.create()
.setHeader(messages['dialog.warning.TITLE'])
.setMessage(protocol.error.user_message)
.open();
}
function translateData(protocol) {
Validations.clearError();
if (protocol.error) {
operateWhenError(protocol);
return;
}
return protocol.payload;
}
/**
* @param {Function} callback
*/
ResponseMapper.prototype.returnPage = function (callback) {
var self = this;
this.Http.success(function (protocol) {
protocol = translateData(protocol);
if (protocol) {
protocol = PageResource.fromProtocol(protocol);
protocol.content = ProtocolMapper.fromArray(protocol.content, self.model);
if (self._filter) {
callback(self._filter(protocol));
} else {
callback(protocol);
}
}
});
};
/**
* @param {Function} callback
*/
ResponseMapper.prototype.returnOne = function (callback) {
var self = this;
this.Http.success(function (protocol) {
protocol = translateData(protocol);
if (protocol) {
if (self.model && angular.isFunction(self.model.fromProtocol)) {
protocol = self.model.fromProtocol(protocol);
}
if (self._filter) {
callback(self._filter(protocol));
} else {
callback(protocol);
}
}
});
};
/**
* @param {Function} callback
*/
ResponseMapper.prototype.returnList = function (callback) {
var self = this;
this.Http.success(function (protocol) {
protocol = translateData(protocol);
if (protocol) {
protocol = ProtocolMapper.fromArray(protocol, self.model);
if (self._filter) {
callback(self._filter(protocol));
} else {
callback(protocol);
}
}
});
};
return ResponseMapper;
}
]);
/**
* @author jittagornp
* create 08/09/2015
*/
pamarin.factory('util.ResponseUtils', [
function () {
/**
* @util ResponseUtils
*/
var ResponseUtils = function () {
};
/**
* @param {Object} reponse
* @returns {Boolean}
*/
ResponseUtils.isBadRequest = function (reponse) {
return reponse.status_code === 400;
};
return ResponseUtils;
}
]);
/**
* @author jittagornp
* create 27/09/2015
*/
pamarin.factory('util.StringTokenizer', [
'util.StringUtils',
function (StringUtils) {
/**
* @util StringTokenizer
*/
var StringTokenizer = function () {
};
function array2String(arr) {
return arr.map(function (str) {
return StringUtils.hasText(str) ? str : '';
}).join(' ');
}
/**
* @param {String} str
* @param {Number} size
* @returns {String}
*/
StringTokenizer.substring = function (str, size) {
if (angular.isArray(str)) {
str = array2String(str);
}
if (!StringUtils.hasText(str)) {
return '';
}
str = str.replace('\n', ' ');
if (str.length <= size) {
return str.trim();
}
var splited = split(str, size);
if (splited.length < (size / 2)) {
return str.substring(0, size).trim() + '...';
}
return splited.trim() + '...';
};
function split(str, size) {
var split = str.split(' ');
var builder = [];
var length = 0;
angular.forEach(split, function (txt) {
length = length + txt.length + 1;
if (length < size) {
builder.push(txt);
builder.push(' ');
}
});
return builder.join('');
}
return StringTokenizer;
}
]);
/**
* @author jittagornp
* create 05/09/2015
*/
pamarin.factory('util.StringUtils', [
function () {
/**
* @author StringUtils
*/
var StringUtils = function () {
};
function isNotString(str) {
return str !== null
&& typeof str !== 'undefined'
&& typeof str !== 'string';
}
/**
* @param {String} str
* @returns {Boolean}
*/
StringUtils.hasText = function (str) {
if (isNotString(str)) {
throw new Error('require string');
}
if (!str) {
return false;
}
return str.length > 0;
};
return StringUtils;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('util.Time', [
'config',
'moment',
function (config, moment) {
var pattern = config.dateTimePattern;
/**
* @util {Time}
*/
var Time = function () {
};
/**
* @param {String} date
* @returns {String}
*/
Time.fromNow = function (date) {
if (!date) {
return null;
}
var mmnt = moment(date, pattern.parser);
var now = moment();
//since 1 year up
if (now.diff(mmnt, 'year') > 0) {
return mmnt.format(pattern.fromNowLong);
}
//since 2 day up
if (now.diff(mmnt, 'day') > 1) {
return mmnt.format(pattern.fromNowShort);
}
//since 1 day up
if (now.diff(mmnt, 'day') > 0) {
return mmnt.format(pattern.fromNowYesterday);
}
if (now.diff(mmnt, 'hour') > 6) {
if (now.day() === mmnt.day()) {
return mmnt.format(pattern.fromNowTimeOnly);
} else {
return mmnt.format(pattern.fromNowYesterday);
}
}
return mmnt.fromNow();
};
return Time;
}
]);
/**
* @author jittagornp
* create 20/08/2015
*/
pamarin.factory('util.Values', [
function () {
/**
* @util Values
*/
var Values = function () {
};
function isBoolean(value) {
return typeof value === 'boolean';
}
function isNaN(value) {
return toString(value) === toString(Number.NaN);
}
function toString(value) {
return '' + value;
}
function isModel(value) {
return angular.isObject(value)
&& typeof value['toProtocol'] !== 'undefined';
}
/**
* @param {Any} value
* @param {Function} callback
* @param {Object} context_opt
* @returns {Any}
*/
Values.asValue = function (value, callback, context_opt) {
if (Values.isNotDefined(value)) {
return null;
}
if (isModel(value)) {
return value.toProtocol() || null;
}
if (angular.isFunction(callback)) {
var result = callback.call(context_opt);
if (Values.isDefined(result)) {
return result;
}
} else {
if (Values.isDefined(callback)) {
return callback;
}
}
return value;
};
/**
* @param {Any} variable
* @returns {Boolean}
*/
Values.isDefined = function (variable) {
if (isNaN(variable)) {
return false;
}
if (angular.isNumber(variable)) {
return true;
}
if (isBoolean(variable)) {
return true;
}
if (angular.isArray(variable)) {
return !!variable.length;
}
if (angular.isString(variable)) {
return !!variable.length;
}
if (angular.isObject(variable)) {
for (var prop in variable) {
return true;
}
return false;
}
return !!variable;
};
/**
* @param {Any} variable
* @returns {Boolean}
*/
Values.isNotDefined = function (variable) {
return !Values.isDefined(variable);
};
return Values;
}
]);
/**
* @author jittagornp
* create 27/09/2015
*/
pamarin.factory('util.YoutubeUtils', [
'youtubeEmbedUtils',
function (youtubeEmbedUtils) {
/**
* @author YoutubeUtils
*/
var YoutubeUtils = function () {
};
/**
* @param {String} url
* @returns {String}
*/
YoutubeUtils.getVideoParamsFromUrl = function (url) {
var index = url.indexOf('v=');
if (index === -1) {
return '';
}
return youtubeEmbedUtils.getIdFromURL(url);
};
return YoutubeUtils;
}
]);
/**
* @author jittagornp
* create 29/09/2015
*/
pamarin.factory('algorithm.SequencialDiv2Add', [
'util.Values',
function (Values) {
/**
* @algorithm SequencialDiv2Add
*/
var SequencialDiv2Add = function (arr) {
this.arr = arr || [];
this.step = 1000;
this.index;
};
/**
* @param {Array} arr
* @returns {SequencialDiv2Add}
*/
SequencialDiv2Add.fromArray = function (arr) {
return new SequencialDiv2Add(arr);
};
/**
* @param {Number} step
* @returns {SequencialDiv2Add}
*/
SequencialDiv2Add.prototype.byStep = function (step) {
this.step = step;
return this;
};
/**
* @param {Number} toIndex
* @returns {SequencialDiv2Add}
*/
SequencialDiv2Add.prototype.toIndex = function (index) {
this.index = index;
return this;
};
function add(obj) {
obj.sequence = this.step;
this.arr.push(obj);
}
function addFirst(obj) {
obj.sequence = this.arr[0].sequence - this.step;
this.arr.splice(0, 0, obj);
}
function addLast(obj, before) {
obj.sequence = before.sequence + this.step;
this.arr.splice(this.index, 0, obj);
}
function addBetween(obj, before, after) {
obj.sequence = (before.sequence + after.sequence) / 2.0;
this.arr.splice(this.index, 0, obj);
}
/**
* @returns {Boolean}
*/
SequencialDiv2Add.prototype.isEmpty = function () {
return !this.arr.length;
};
/**
* @param {Object} obj
* @returns {Array}
*/
SequencialDiv2Add.prototype.add = function (obj) {
if (Values.isDefined(obj.sequence)) {
throw new Error('don\'t define sequence');
}
if (Values.isNotDefined(this.index)) {
this.index = this.arr.length;
}
if (this.isEmpty()) {
add.call(this, obj);
return this.arr;
}
if (this.index === 0) {
addFirst.call(this, obj);
return this.arr;
}
var before = this.arr[this.index - 1];
var after = this.arr[this.index];
if (after) {
addBetween.call(this, obj, before, after);
return this.arr;
}
addLast.call(this, obj, before);
return this.arr;
};
return SequencialDiv2Add;
}
]);
/**
* @author jittagornp
* create 12/09/2015
*/
pamarin.service('AccountService', [
'config',
'util.Http',
'model.User',
'util.ResponseMapper',
function (config, Http, User, ResponseMapper) {
var serviceUrl = {
update: config.apiBase + '/users/account/:userId'
};
/**
* @param {model.User} user
* @param {Function} callback
*/
this.save = function (user, callback) {
console.log(user.toProtocol());
ResponseMapper.fromHttp(Http.put(
serviceUrl.update.replace(':userId', user.id),
user.toProtocol()
))
.map2Model(User)
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('LoginService', [
'util.Http',
'config',
'util.ResponseMapper',
function (Http, config, ResponseMapper) {
var serviceUrl = {
loginFacebook: config.apiBase + '/login/facebook'
};
/**
* @param {Object} ftoken
* @param {Function} callback
*/
this.loginFacebook = function (ftoken, callback) {
ResponseMapper.fromHttp(Http.post(serviceUrl.loginFacebook, ftoken))
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('PageContext', [
function () {
this.title = jQuery('title').text();
/**
* @param {model.PageData} data
*/
this.data = function (data) {
this.title = data.title;
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TagLookupService', [
'config',
'util.Http',
'model.TagLookup',
'util.ResponseMapper',
function (config, Http, TagLookup, ResponseMapper) {
var serviceUrl = {
findAll: config.apiBase + '/taglookups'
};
/**
* @param {Function} callback
*/
this.findAll = function (callback) {
ResponseMapper.fromHttp(Http.get(serviceUrl.findAll))
.map2Model(TagLookup)
.returnList(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TagService', [
'config',
'util.Http',
'model.Tag',
'model.Tags',
'util.ResponseMapper',
function (config, Http, Tag, Tags, ResponseMapper) {
var serviceUrl = {
update: config.apiBase + '/trips/:tripId/tags'
};
/**
* @param {String} tripId
* @param {Array<model.Tag>} tags
* @param {Function} callback
*/
this.save = function (tripId, tags, callback) {
ResponseMapper.fromHttp(Http.put(
serviceUrl.update
.replace(":tripId", tripId),
Tags.fromTags(tags).toProtocol()
))
.map2Model(Tag)
.returnList(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TripCardService', [
'config',
'util.Http',
'model.TripCard',
'util.ResponseMapper',
function (config, Http, TripCard, ResponseMapper) {
var serviceUrl = {
findLastest: config.apiBase + '/trips/lastest',
findOfUserFollowing: config.apiBase + '/trips/followings'
};
/**
* @param {Pageable} pageable
* @param {Function} callback
*/
this.findLastest = function (pageable, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.findLastest
+ '?' + pageable
))
.map2Model(TripCard)
.returnPage(callback);
};
/**
* @param {Pageable} pageable
* @param {Function} callback
*/
this.findOfUserFollowing = function (pageable, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.findOfUserFollowing
+ '?' + pageable
))
.map2Model(TripCard)
.returnPage(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TripCommentService', [
'config',
'util.Http',
'model.Comment',
'util.ResponseMapper',
function (config, Http, Comment, ResponseMapper) {
var serviceUrl = {
findAll: config.apiBase + '/trips/:tripId/comments',
insert: config.apiBase + '/trips/:tripId/comments',
update: config.apiBase + '/trips/:tripId/comments/:commentId',
delete: config.apiBase + '/trips/:tripId/comments/:commentId'
};
/**
* @param {String} tripId
* @param {model.PageRequest} pageable
* @param {Function} callback
*/
this.loadByTripId = function (tripId, pageable, callback) {
var url = serviceUrl.findAll
.replace(':tripId', tripId)
+ '?' + pageable;
ResponseMapper.fromHttp(Http.get(url))
.map2Model(Comment)
.returnPage(callback);
};
/**
* @param {model.Comment} comment
* @param {Function} callback
*/
this.delete = function (comment, callback) {
var url = serviceUrl.delete
.replace(':tripId', comment.referenceId)
.replace(':commentId', comment.id);
ResponseMapper.fromHttp(Http.delete(url))
.returnOne(callback);
};
/**
* @param {model.Comment} comment
* @param {Function} callback
*/
this.save = function (comment, callback) {
var http;
if (comment.id) {
http = Http.put(
serviceUrl.update
.replace(':tripId', comment.referenceId)
.replace(':commentId', comment.id),
comment.toProtocol()
);
} else {
http = Http.post(
serviceUrl.insert
.replace(':tripId', comment.referenceId),
comment.toProtocol()
);
}
ResponseMapper.fromHttp(http)
.map2Model(Comment)
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TripLikeService', [
'config',
'util.Http',
'model.Likes',
'util.ResponseMapper',
function (config, Http, Likes, ResponseMapper) {
var serviceUrl = {
toggleLike: config.apiBase + '/trips/:tripId/togglelike'
};
/**
* @param {String} tripId
* @param {Function} callback
* @param {Boolean} sample_opt [optional]
*/
this.toggleLike = function (tripId, callback, sample_opt) {
ResponseMapper.fromHttp(Http.post(
serviceUrl.toggleLike
.replace(':tripId', tripId)
+ '?sample=' + (sample_opt || 'false')
))
.map2Model(Likes)
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TripPostService', [
'config',
'util.Http',
'model.Post',
'util.ResponseMapper',
function (config, Http, Post, ResponseMapper) {
var serviceUrl = {
findAll: config.apiBase + '/trips/:tripId/posts',
insert: config.apiBase + '/trips/:tripId/posts',
update: config.apiBase + '/trips/:tripId/posts/:postId',
delete: config.apiBase + '/trips/:tripId/posts/:postId'
};
/**
* @param {model.Trip} trip
* @param {model.PageRequest} pageable
* @param {Function} callback
*/
this.findByTrip = function (trip, pageable, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.findAll
.replace(':tripId', trip.id)
+ '?' + pageable
))
.map2Model(Post)
.returnPage(callback);
};
/**
* @param {model.Post} post
* @param {Function} callback
*/
this.delete = function (post, callback) {
ResponseMapper.fromHttp(Http.delete(
serviceUrl.delete
.replace(':tripId', post.referenceId)
.replace(':postId', post.id)
))
.returnOne(callback);
};
/**
* @param {model.Post} post
* @param {Function} callback
*/
this.save = function (post, callback) {
if (post.id) {
ResponseMapper.fromHttp(Http.put(
serviceUrl.update
.replace(':tripId', post.referenceId)
.replace(':postId', post.id),
post.toProtocol()
))
.map2Model(Post)
.returnOne(callback);
} else {
ResponseMapper.fromHttp(Http.post(
serviceUrl.insert
.replace(':tripId', post.referenceId),
post.toProtocol()
))
.map2Model(Post)
.returnOne(callback);
}
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TripService', [
'config',
'util.Http',
'model.Trip',
'PageContext',
'model.PageData',
'enum.ArticleStatus',
'util.ResponseMapper',
'model.TripPageContent',
function (config, Http, Trip, pageContext, PageData, ArticleStatus, ResponseMapper, TripPageContent) {
var serviceUrl = {
insert: config.apiBase + '/trips',
delete: config.apiBase + '/trips/:tripId',
toggleLike: config.apiBase + '/trips/:tripId/togglelike',
toggleStatus: config.apiBase + '/trips/:tripId/togglestatus',
findPageData: config.apiBase + '/pagedata/users/:username/trips/:tripname'
};
/**
* @param {String} username
* @param {String} tripname
* @param {Function} callback
*/
this.loadPageDataByUsernameAndTripname = function (username, tripname, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.findPageData
.replace(':username', username)
.replace(':tripname', tripname)
))
.map2Model(PageData)
.filter(function (data) {
data.content = TripPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
/**
* @param {dto.WriteTrip} writeTrip
* @param {Function} callback
*/
this.save = function (writeTrip, callback) {
ResponseMapper.fromHttp(Http.post(serviceUrl.insert, writeTrip.toProtocol()))
.map2Model(Trip)
.returnOne(callback);
};
/**
* @param {String} tripId
* @param {Function} callback
*/
this.toggleStatus = function (tripId, callback) {
ResponseMapper.fromHttp(Http.post(
serviceUrl.toggleStatus
.replace(':tripId', tripId)
))
.map2Model(ArticleStatus)
.returnOne(callback);
};
/**
* @param {String} tripId
* @param {Function} callback
*/
this.delete = function (tripId, callback) {
ResponseMapper.fromHttp(Http.delete(
serviceUrl.delete.replace(':tripId', tripId)
))
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('TripSettingsService', [
'config',
'util.Http',
'util.ResponseMapper',
function (config, Http, ResponseMapper) {
var serviceUrl = {
save: config.apiBase + '/trips/:tripId/settings'
};
/**
* @param {dto.TripSettingsDto} settings
* @param {Function} callback
*/
this.save = function (settings, callback) {
ResponseMapper.fromHttp(Http.post(
serviceUrl.save
.replace(':tripId', settings.tripId)
, settings.toProtocol()))
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserFollowService', [
'config',
'util.Http',
'model.Follows',
'model.UserCard',
'util.ResponseMapper',
function (config, Http, Follows, UserCard, ResponseMapper) {
var serviceUrl = {
toggleFollowByUserId: config.apiBase + '/users/:userId/togglefollow',
loadFollowersByUsername: config.apiBase + '/users/:username/followers',
loadFollowingsByUsername: config.apiBase + '/users/:username/followings'
};
/**
* @param {String} userId
* @param {Function} callback
* @param {Boolean} count_opt [optional]
* @param {Boolean} sample_opt [optional]
*/
this.toggleFollow = function (userId, callback, count_opt, sample_opt) {
ResponseMapper.fromHttp(Http.post(
serviceUrl.toggleFollowByUserId
.replace(':userId', userId)
+ '?count=' + (count_opt || false) + '&sample=' + (sample_opt || false)
))
.map2Model(Follows)
.returnOne(callback);
};
/**
* @param {String} username
* @param {model.PageRequest} pageable
* @param {Function} callback
*/
this.loadFollowersByUsername = function (username, pageable, callback) {
ResponseMapper.fromHttp(Http.post(
serviceUrl.loadFollowersByUsername
.replace(':username', username)
+ '?' + pageable
))
.map2Model(UserCard)
.returnPage(callback);
};
/**
* @param {String} username
* @param {model.PageRequest} pageable
* @param {Function} callback
*/
this.loadFollowingsByUsername = function (username, pageable, callback) {
ResponseMapper.fromHttp(Http.post(
serviceUrl.loadFollowingsByUsername
.replace(':username', username)
+ '?' + pageable
))
.map2Model(UserCard)
.returnPage(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserService', [
'config',
'util.Http',
'util.ResponseMapper',
function (config, Http, ResponseMapper) {
var serviceUrl = {
hasUsername: config.apiBase + '/users/:username/has'
};
/**
* @param {String} username
* @param {Function} callback
*/
this.hasUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.hasUsername
.replace(':username', username)
))
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserTripService', [
'config',
'util.Http',
'model.TripCard',
'util.ResponseMapper',
function (config, Http, TripCard, ResponseMapper) {
var serviceUrl = {
loadByUsername: config.apiBase + '/users/:username/tripcards',
loadLikeByUsername: config.apiBase + '/users/:username/tripcards/like'
};
/**
* @param {String} username
* @param {model.PageRequest} pageable
* @param {Function} callback
*/
this.loadByUsername = function (username, pageable, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadByUsername
.replace(':username', username)
+ '?' + pageable
))
.map2Model(TripCard)
.returnPage(callback);
};
/**
* @param {String} username
* @param {model.PageRequest} pageable
* @param {Function} callback
*/
this.loadLikeByUsername = function (username, pageable, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadLikeByUsername
.replace(':username', username)
+ '?' + pageable
))
.map2Model(TripCard)
.returnPage(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('HomePageService', [
'config',
'util.Http',
'PageContext',
'model.PageData',
'util.ResponseMapper',
'model.HomePageContent',
function (config, Http, pageContext, PageData, ResponseMapper, HomePageContent) {
var serviceUrl = {
load: config.apiBase + '/pagedata/home',
loadTripLastest: config.apiBase + '/pagedata/trips/lastest',
loadTripLastestTab: config.apiBase + '/pagedata/tab/trips/lastest',
loadTripFollowing: config.apiBase + '/pagedata/trips/followings',
loadTripFollowingTab: config.apiBase + '/pagedata/tab/trips/followings'
};
//----------------------------------------------------------------------
/**
* @param {Function} callback
*/
this.load = function (callback) {
ResponseMapper.fromHttp(Http.get(serviceUrl.load))
.map2Model(PageData)
.filter(function (data) {
data.content = HomePageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {Function} callback
*/
this.loadTripLastest = function (callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadTripLastest
))
.map2Model(PageData)
.filter(function (data) {
data.content = HomePageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {Function} callback
*/
this.loadTripLastestTab = function (callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadTripLastestTab
))
.map2Model(PageData)
.filter(function (data) {
data.content = HomePageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {Function} callback
*/
this.loadTripFollowing = function (callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadTripFollowing
))
.map2Model(PageData)
.filter(function (data) {
data.content = HomePageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {Function} callback
*/
this.loadTripFollowingTab = function (callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadTripFollowingTab
))
.map2Model(PageData)
.filter(function (data) {
data.content = HomePageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserFollowPageService', [
'config',
'util.Http',
'PageContext',
'model.PageData',
'util.ResponseMapper',
'model.UserPageContent',
function (config, Http, pageContext, PageData, ResponseMapper, UserPageContent) {
var serviceUrl = {
loadFollowerByUsername: config.apiBase + '/pagedata/users/:username/followers',
loadFollowingUsername: config.apiBase + '/pagedata/users/:username/followings',
loadFollowerTabByUsername: config.apiBase + '/pagedata/tab/users/:username/followers',
loadFollowingTabUsername: config.apiBase + '/pagedata/tab/users/:username/followings'
};
//----------------------------------------------------------------------
/**
* @param {String} username
* @param {Function} callback
*/
this.loadFollowerByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadFollowerByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {String} username
* @param {Function} callback
*/
this.loadFollowingByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadFollowingUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {String} username
* @param {Function} callback
*/
this.loadFollowerTabByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadFollowerTabByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
//----------------------------------------------------------------------
/**
* @param {String} username
* @param {Function} callback
*/
this.loadFollowingTabByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadFollowingTabUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserPageService', [
'config',
'util.Http',
'PageContext',
'model.PageData',
'model.UserPageContent',
'model.AccountPageContent',
'util.ResponseMapper',
function (config, Http, pageContext, PageData, UserPageContent, AccountPageContent, ResponseMapper) {
var serviceUrl = {
find: config.apiBase + '/pagedata/users',
findByUsername: config.apiBase + '/pagedata/users/:username'
};
/**
* @param {Function} callback
*/
this.load = function (callback) {
ResponseMapper.fromHttp(Http.get(serviceUrl.find))
.map2Model(PageData)
.filter(function (data) {
data.content = AccountPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
/**
* @param {String} username
* @param {Function} callback
*/
this.loadByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.findByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserTripPageService', [
'config',
'util.Http',
'PageContext',
'model.PageData',
'util.ResponseMapper',
'model.UserPageContent',
function (config, Http, pageContext, PageData, ResponseMapper, UserPageContent) {
var serviceUrl = {
loadByUsername: config.apiBase + '/pagedata/users/:username/tripcards',
loadLikeByUsername: config.apiBase + '/pagedata/users/:username/tripcards/like'
};
/**
* @param {String} username
* @param {Function} callback
*/
this.loadByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
/**
* @param {String} username
* @param {Function} callback
*/
this.loadLikeByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadLikeByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('UserTripTabService', [
'config',
'util.Http',
'PageContext',
'model.PageData',
'util.ResponseMapper',
'model.UserPageContent',
function (config, Http, pageContext, PageData, ResponseMapper, UserPageContent) {
var serviceUrl = {
loadByUsername: config.apiBase + '/pagedata/tab/users/:username/tripcards',
loadLikeByUsername: config.apiBase + '/pagedata/tab/users/:username/tripcards/like'
};
/**
* @param {String} username
* @param {Function} callback
*/
this.loadByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
/**
* @param {String} username
* @param {Function} callback
*/
this.loadLikeByUsername = function (username, callback) {
ResponseMapper.fromHttp(Http.get(
serviceUrl.loadLikeByUsername
.replace(':username', username)
))
.map2Model(PageData)
.filter(function (data) {
data.content = UserPageContent.fromProtocol(data.content);
pageContext.data(data);
return data.content;
})
.returnOne(callback);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('AuthenToken', [
'ipCookie',
function (cookie) {
/**
* @security AuthenToken
*/
var AuthenToken = function () {
};
AuthenToken.KEY_NAME = 'auth_token';
AuthenToken.prototype.get = function () {
return cookie(AuthenToken.KEY_NAME);
};
AuthenToken.prototype.set = function (token) {
cookie(AuthenToken.KEY_NAME, token, {
path: '/'
});
};
AuthenToken.prototype.clear = function () {
cookie.remove(AuthenToken.KEY_NAME, {
path: '/'
});
};
return AuthenToken;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.service('SecurityContext', [
'principal',
'$state',
'model.User',
'AuthenToken',
function (principal, $state, User, AuthenToken) {
var ANONYMOUS = 'anonymous';
var authenToken = new AuthenToken();
this.principal = User.fromProtocol(principal);
this.invalidToken = function () {
authenToken.clear();
location.reload(true);
};
this.regisToken = function (token) {
authenToken.set(token);
};
this.user = function (user) {
if (user instanceof User) {
this.principal = user;
}
return this.principal;
};
this.anonymous = function () {
return this.user().id === ANONYMOUS;
};
this.toProfile = function () {
$state.go('users', {
username: this.user().username
}, {
reload: true
});
};
if (this.anonymous()) {
authenToken.clear();
}
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('lazy.LazyLoad', [
'model.PageRequest',
function (PageRequest) {
/**
* @lazy LazyLoad
*/
var LazyLoad = function () {
this.content = [];
this.totalElements = 0;
this.load(this.pageNumber, this.pageSize);
};
/**
* @constant
*/
LazyLoad.DEFAULT_PAGE_NUMBER = 1;
LazyLoad.DEFAULT_PAGE_SIZE = 25;
LazyLoad.constructor = LazyLoad;
/**
* @abstract
*/
LazyLoad.prototype.onLoad = function (pageable, callback) {
};
LazyLoad.prototype.getIdParam = function () {
return "id";
};
LazyLoad.prototype.load = function (pageNumber, pageSize) {
var that = this;
pageNumber = pageNumber || LazyLoad.DEFAULT_PAGE_NUMBER;
pageSize = pageSize || LazyLoad.DEFAULT_PAGE_SIZE;
var request = new PageRequest(pageNumber - 1, pageSize, this.sorts);
this.onLoad(request, function (page) {
that.content = page.content || [];
that.totalElements = page.totalElements || 0;
});
};
LazyLoad.prototype.remove = function (obj) {
angular.forEach(this.content, function (item, index) {
if (item[this.getIdParam()] === obj[this.getIdParam()]) {
this.content.splice(index, 1);
this.totalElements = this.totalElements - 1;
return false;
}
}, this);
}
LazyLoad.prototype.getData = function (id) {
var obj = null;
angular.forEach(this.content, function (item) {
if (item[this.getIdParam()] === id) {
obj = item;
return false;
}
}, this);
return obj;
};
return LazyLoad;
}
]);
/**
* @author jittagornp
* create 02/10/2015
*/
pamarin.factory('state.DirtyState', [
'util.StringUtils',
function (StringUtils) {
/**
* @state DirtyState
*/
var DirtyState = function () {
};
function find$Element() {
return jQuery('.ng-dirty');
}
/**
* @returns {Boolean}
*/
DirtyState.isDirty = function () {
var $el = find$Element();
if ($el.hasClass('ng-hide')) {
return false;
}
if ($el.parents('.ng-hide').length) {
return false;
}
return StringUtils.hasText($el.val());
};
DirtyState.clearDirty = function () {
find$Element().removeClass('ng-dirty');
};
return DirtyState;
}
]);
/**
* @author jittagornp
* create 03/10/2015
*/
pamarin.factory('state.State', [
'$state',
function ($state) {
/**
* @state State
*/
var State = function () {
};
State.reload = function () {
$state.go($state.current.name, $state.params, {
reload: true
});
};
return State;
}
]);
/**
* @author jittagornp
* create 27/08/2015
*/
pamarin.factory('component.AlertDialog', [
'component.Dialog',
function (Dialog) {
/**
* @component AlertDialog extends Dialog
*/
var AlertDialog = function () {
this.header = null;
this.message = null;
Dialog.call(this, 'pr_alert_dialog');
this.className = 'pr-alert-dialog';
};
/**
* @returns {AlertDialog}
*/
AlertDialog.create = function () {
return new AlertDialog();
};
angular.extend(AlertDialog.prototype, Dialog.prototype);
/**
* @param {String} header
* @returns {AlertDialog}
*/
AlertDialog.prototype.setHeader = function (header) {
this.header = header;
return this;
};
/**
* @param {String} message
* @returns {AlertDialog}
*/
AlertDialog.prototype.setMessage = function (message) {
this.message = message;
return this;
};
/**
* @override Dialog
*/
AlertDialog.prototype.open = function () {
this.data = this.data || {};
this.data.header = this.header;
this.data.message = this.message;
return Dialog.prototype.open.call(this);
};
return AlertDialog;
}
]);
/**
* @author jittagornp
* create 27/08/2015
*/
pamarin.factory('component.ConfirmDialog', [
'messages',
'component.Dialog',
function (messages, Dialog) {
/**
* @component ConfirmDialog extends Dialog
*/
var ConfirmDialog = function () {
this.header = null;
this.message = null;
this.confirmButtonLabel = messages.YES;
this.cancelButtonLabel = messages.NO;
this.preConfirmCallback = null;
this.preCancelCallback = null;
Dialog.call(this, 'pr_confirm_dialog');
this.className = 'pr-confirm-dialog';
};
/**
* @returns {ConfirmDialog}
*/
ConfirmDialog.create = function () {
return new ConfirmDialog();
};
angular.extend(ConfirmDialog.prototype, Dialog.prototype);
/**
* @param {String} header
* @returns {ConfirmDialog}
*/
ConfirmDialog.prototype.setHeader = function (header) {
this.header = header;
return this;
};
/**
* @param {String} message
* @returns {ConfirmDialog}
*/
ConfirmDialog.prototype.setMessage = function (message) {
this.message = message;
return this;
};
/**
* @param {String} label
* @returns {ConfirmDialog}
*/
ConfirmDialog.prototype.setConfirmButtonLabel = function (label) {
this.confirmButtonLabel = label;
return this;
};
/**
* @param {String} label
* @returns {ConfirmDialog}
*/
ConfirmDialog.prototype.setCancelButtonLabel = function (label) {
this.cancelButtonLabel = label;
return this;
};
/**
* @override Dialog
*/
ConfirmDialog.prototype.open = function () {
this.data = this.data || {};
this.data.header = this.header;
this.data.message = this.message;
this.data.confirmButtonLabel = this.confirmButtonLabel;
this.data.cancelButtonLabel = this.cancelButtonLabel;
var self = this;
Dialog.prototype.onPreClose.call(this, function (data) {
if (data === 'OK') {
self.preConfirmCallback && self.preConfirmCallback();
} else {
self.preCancelCallback && self.preCancelCallback();
}
});
return Dialog.prototype.open.call(this);
};
/**
* @param {Function} callback
* @returns {ConfirmDialog}
*/
ConfirmDialog.prototype.onPreConfirm = function (callback) {
this.preConfirmCallback = callback;
return this;
};
/**
* @param {Function} callback
* @returns {ConfirmDialog}
*/
ConfirmDialog.prototype.onPreCancel = function (callback) {
this.preCancelCallback = callback;
return this;
};
return ConfirmDialog;
}
]);
/**
* @author jittagornp
* create 26/08/2015
*/
pamarin.factory('component.Dialog', [
'ngDialog',
function (dialog) {
/**
* @component Dialog
* @param {String} template
*/
var Dialog = function (template) {
this.template = template;
this.data = null;
this.className = null;
this.preCloseCallback = null;
};
/**
* @param {String} template
* @returns {Dialog}
*/
Dialog.fromTemplate = function (template) {
return new Dialog(template);
};
/**
* @param {Object} data
* @returns {Dialog}
*/
Dialog.prototype.setData = function (data) {
this.data = data;
return this;
};
/**
* @param {String} className
* @returns {Dialog}
*/
Dialog.prototype.setClassName = function (className) {
this.className = className;
return this;
};
/**
* @param {Function} callback
* @returns {Dialog}
*/
Dialog.prototype.onPreClose = function (callback) {
this.preCloseCallback = callback;
return this;
};
Dialog.prototype.open = function () {
return dialog.open({
template: this.template,
className: 'ngdialog-theme-default ' + (this.className ? this.className : ''),
data: this.data,
preCloseCallback: this.preCloseCallback
});
};
return Dialog;
}
]);
/**
* @author jittagornp
* create 18/09/2015
*/
pamarin.factory('component.Notification', [
'Notification',
function (Noti) {
/**
* @component Notification
*/
var Notification = function () {
this.title = null;
this.message = null;
};
/**
* @returns {Notification}
*/
Notification.create = function () {
return new Notification();
};
/**
* @param {String} title
* @returns {Notification}
*/
Notification.prototype.setTitle = function (title) {
this.title = title;
return this;
};
/**
* @param {String} message
* @returns {Notification}
*/
Notification.prototype.setMessage = function (message) {
this.message = message;
return this;
};
Notification.prototype.show = function () {
Noti({
title: this.title,
message: this.message
});
};
return Notification;
}
]);
/**
* @author jittagornp
* create 24/08/2015
*/
pamarin.factory('validation.Validations', [
function () {
/**
* @util Validations
*/
var Validations = function () {
};
function clear(selector){
jQuery(selector).html('')
.parent()
.removeClass('has-error');
}
Validations.clearError = function () {
clear('[data-validate]');
clear('[data-validate-type]');
};
/**
* @param {Array} errors
*/
Validations.showError = function (errors) {
Validations.clearError();
angular.forEach(errors, function (err) {
var $small;
if (err.field_name) {
$small = jQuery('[data-validate="' + err.field_name + '"]');
} else {
$small = jQuery('[data-validate-type="' + err.type_name + '"]');
}
$small.html(err.user_message)
.addClass('pr-validate-message')
.parents('.pr-input-form')
.addClass('pr-has-error');
});
};
return Validations;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('AboutCtrl', [
'$scope',
'component.Dialog',
function ($scope, Dialog) {
$scope.showDialog = function () {
Dialog.fromTemplate('pr_about_dialog')
.setClassName('pr-about-dialog')
.open();
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('AccountCtrl', [
'$scope',
'initData',
'messages',
'AccountService',
'SecurityContext',
'component.Notification',
function ($scope, initData, messages, service, securityContext, Notification) {
if (initData) {
$scope.data = initData;
}
function notify() {
Notification.create()
.setTitle(messages['notification.saveAccount.TITLE'])
.setMessage(messages['notification.saveAccount.MESSAGE'])
.show();
}
$scope.saveAccount = function () {
service.save(
$scope.data.user,
function (user) {
$scope.data.user = user;
securityContext.user(user);
notify();
}
);
};
}
]);
/**
* @author jittagornp
* create 08/09/2015
*/
pamarin.controller('AlertDialogCtrl', [
'$scope',
function ($scope) {
$scope.data = $scope.ngDialogData;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('CommentCtrl', [
'$scope',
'messages',
'util.PageUtils',
'TripCommentService',
'util.MessageDisplay',
'component.ConfirmDialog',
function ($scope, messages, PageUtils, commentService, MessageDisplay, ConfirmDialog) {
/**
* @param {model.Comment} comment
*/
function deleteComment(comment) {
commentService.delete(
comment,
function (status) {
if (status) {
$scope.data.removeComment(comment);
}
}
);
}
/**
* @param {model.Comment} comment
*/
$scope.openConfirmDeleteCommentDialog = function (comment) {
ConfirmDialog.create()
.setHeader(messages['dialog.confirmDeleteComment.TITLE'])
.setMessage(MessageDisplay.substring(comment.message))
.onPreConfirm(function () {
deleteComment(comment);
})
.open();
};
$scope.postComment = function () {
if ($scope.data.comment.message) {
commentService.save(
$scope.data.comment,
function (comment) {
$scope.data.addComment(comment);
}
);
}
};
/**
* @param {model.Comment} comment
*/
$scope.editComment = function (comment) {
if (comment.message) {
var index = $scope.data.indexOfComment(comment);
commentService.save(
comment,
function (comment) {
comment._editing = false;
$scope.data.replaceComment(comment, index);
}
);
}
};
/**
* @param {model.Comment} comment
*/
$scope.cancelComment = function (comment) {
comment.message = comment.backupMessage;
};
$scope.cancelNewComment = function () {
if ($scope.data.comment.message) {
$scope.data.comment.message = '';
}
};
$scope.loadMoreComments = function () {
PageUtils.nextPage(
$scope.data.commentPage,
function (request) {
commentService.loadByTripId(
$scope.data.trip.id,
request,
function (page) {
$scope.data.addCommentPage(page);
}
);
}
);
};
if ($scope.data) {
try {
$scope.data.newComment();
} catch (ex) {
/* swallow */
}
}
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('ConfirmDialogCtrl', [
'$scope',
function ($scope) {
$scope.data = $scope.ngDialogData;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('HomeCtrl', [
'$state',
'$scope',
'initData',
'util.PageUtils',
'TripCardService',
function ($state, $scope, initData, PageUtils, tripCardService) {
if (initData) {
$scope.data = initData;
$scope.data.routerState = $state.current.name;
}
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.tripCardPage,
function (request) {
tripCardService.findLastest(
request,
function (page) {
$scope.data.addTripCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('controller.HomePage', [
'HomePageService',
function (homePageService) {
var homeState = {
TRIPS_LASTEST: 'home.triplastest',
TRIPS_FOLLOWINGS: 'home.tripofuserfollowing'
};
/**
* @controller HomePage
*/
var HomePage = function () {
};
/**
* @param {Function} callback
*/
function tripsLastest(callback) {
homePageService.loadTripLastest(callback);
}
/**
* @param {Function} callback
*/
function tripsFollowings(callback) {
homePageService.loadTripFollowing(callback);
}
/**
* @param {Function} callback
*/
function defaults(callback) {
homePageService.load(callback);
}
/**
* @param {Object} param { stateName }
* @param {Function} callback
*/
HomePage.prototype.loadData = function (param, callback) {
if (homeState.TRIPS_LASTEST === param.stateName) {
tripsLastest.call(this, callback);
} else if (homeState.TRIPS_FOLLOWINGS === param.stateName) {
tripsFollowings.call(this, callback);
} else {
defaults.call(this, callback);
}
};
return HomePage;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('LoginCtrl', [
'$scope',
'LoginService',
'SecurityContext',
function ($scope, service, securityContext) {
function connected(response) {
return response.status === 'connected';
}
$scope.loginFacebook = function () {
Facebook.getLoginStatus(function (response) {
if (connected(response)) {
service.loginFacebook(
response.authResponse.accessToken,
function (token) {
securityContext.regisToken(token);
location.reload(true);
}
);
}
});
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('PageCtrl', [
'$scope',
'PageContext',
'SecurityContext',
function ($scope, pageContext, securityContext) {
$scope.pageContext = pageContext;
$scope.securityContext = securityContext;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('PostMapCtrl', [
'$scope',
'enum.MapType',
'uiGmapIsReady',
'model.MapMarker',
'util.GPlaceUtils',
'uiGmapGoogleMapApi',
'util.GoogleMapUtils',
function ($scope, MapType, gmapIsReady, MapMarker, GPlaceUtils, googleMapApi, GoogleMapUtils) {
var GOOGLE_MAP_WIDTH = 300;
var DEFAULT_LATITUDE = 13;
var DEFAULT_LONGITUDE = 100;
var DEFAULT_ZOOM_LEVEL = 5;
var _gmap = null;
var _latLng = null;
init();
/**
* @param {model.PostMap} postMap
* @returns {Object}
*/
function covert2Map(postMap) {
return {
center: {
latitude: postMap.latitude === null ? DEFAULT_LATITUDE : postMap.latitude,
longitude: postMap.longitude === null ? DEFAULT_LONGITUDE : postMap.longitude
},
zoom: postMap.zoomLevel === null ? DEFAULT_ZOOM_LEVEL : postMap.zoomLevel,
options: {
mapTypeId: postMap.mapType.name.toLowerCase()
//scrollwheel: false,
}
};
}
function cleanAllMarkers() {
angular.forEach(
$scope.gmarkers,
function (gmarker) {
gmarker.setMap(null);
}
);
}
function init() {
$scope.post = $scope.ngDialogData;
$scope.map = covert2Map($scope.post.map);
if ($scope.gmarkers) {
cleanAllMarkers();
}
$scope.gmarkers = [];
$scope.autoMapFocus = true;
}
function pushMarkers(gmap) {
angular.forEach(
$scope.post.map.markers,
function (marker) {
$scope.gmarkers.push(convert2GMarker(gmap, marker));
}
);
}
function findNearbyPlaceLocation(places) {
if (_latLng) {
var latLngs = GPlaceUtils.toLatLngs(places);
return GoogleMapUtils.findLatLngOfMinDistance(_latLng, latLngs);
} else {
return places[0].geometry.location;
}
}
function bindSearchBox() {
var input = document.getElementById('pr_googlemap_search_input');
var searchBox = new google.maps.places.SearchBox(input);
google.maps.event.addListener(
searchBox,
'places_changed',
function () {
var places = searchBox.getPlaces();
if (places.length) {
_gmap.panTo(findNearbyPlaceLocation(places));
}
}
);
}
gmapIsReady.promise(1).then(function (instances) {
instances.forEach(function (inst) {
pushMarkers(_gmap = inst.map);
bindSearchBox();
});
});
function bindGMarkerDragend(gmap, gmarker) {
google.maps.event.addListener(
gmarker,
'dragend',
function (event) {
gmarker.marker.latitude = event.latLng.lat();
gmarker.marker.longitude = event.latLng.lng();
focusCenter(gmap);
}
);
}
function focusCenter(gmap) {
if ($scope.autoMapFocus && $scope.gmarkers.length) {
var focus = GoogleMapUtils.calculateFocus($scope.gmarkers, GOOGLE_MAP_WIDTH);
gmap.panTo(focus.center);
if ($scope.gmarkers.length > 1) {
gmap.setZoom(focus.zoom);
}
}
}
function convert2GMarker(gmap, marker) {
var gmarker = new google.maps.Marker({
map: gmap,
draggable: true,
position: new google.maps.LatLng(marker.latitude, marker.longitude)
});
marker.gmarker = gmarker;
gmarker.marker = marker;
(bindGMarkerDragend)(gmap, gmarker);
return gmarker;
}
$scope.mapEvents = {
/**/
maptypeid_changed: function (gmap) {
var mapTypeId = gmap.getMapTypeId().toUpperCase();
$scope.post.map.mapType = MapType.valueOf(mapTypeId);
},
/**/
zoom_changed: function (gmap) {
$scope.post.map.zoomLevel = gmap.getZoom();
},
/**/
center_changed: function (gmap) {
var center = gmap.getCenter();
$scope.post.map.latitude = center.lat();
$scope.post.map.longitude = center.lng();
},
/**/
click: function (gmap, etype, args) {
var position = args[0].latLng;
var marker = MapMarker.fromLatitudeLongitude(position.lat(), position.lng());
$scope.post.map.addMarker(marker);
$scope.gmarkers.push(convert2GMarker(gmap, marker));
focusCenter(gmap);
}
};
/**
* @param {google.maps.Marker} gmarker
*/
$scope.onMouseenterMarker = function (gmarker) {
gmarker.setAnimation(google.maps.Animation.BOUNCE);
};
/**
* @param {google.maps.Marker} gmarker
*/
$scope.onMouseleaveMarker = function (gmarker) {
gmarker.setAnimation(null);
};
/**
* @param {google.maps.Marker} gmarker
*/
$scope.removeMarker = function (gmarker) {
var gmap = gmarker.getMap();
gmarker.setMap(null);
var marker = gmarker.marker;
var gindex = $scope.gmarkers.indexOf(gmarker);
$scope.gmarkers.splice(gindex, 1);
var index = $scope.post.map.markers.indexOf(marker);
$scope.post.map.markers.splice(index, 1);
focusCenter(gmap);
};
/**
* @param {google.maps.Marker} gmarker
*/
$scope.editMarker = function (gmarker) {
gmarker.marker._editing = true;
};
/**
* @param {google.maps.Marker} gmarker
*/
$scope.cancelMarker = function (gmarker) {
gmarker.marker._editing = false;
};
/**
* @param {google.maps.Marker} gmarker
*/
$scope.saveMarker = function (gmarker) {
gmarker.marker._editing = false;
};
$scope.reset = function () {
$scope.post.restore();
$scope.post.backup();
init();
pushMarkers(_gmap);
};
$scope.detectUserLocation = function () {
if (!navigator.geolocation) {
alert('Browser doesn\'t support Geolocation.');
}
var success = function (position) {
_latLng = new google.maps.LatLng(
position.coords.latitude,
position.coords.longitude
);
_gmap.setCenter(_latLng);
};
var error = function () {
alert('Get Geolocation Fail.');
};
navigator.geolocation.getCurrentPosition(success, error);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('SearchCtrl', [
'$scope',
'$state',
function ($scope, $state) {
$scope.keyword = '';
$scope.search = function () {
$state.go('search', {
keyword: encodeURIComponent($scope.keyword)
});
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TagCtrl', [
'data',
'$scope',
'TagService',
'model.TagMapper',
'TagLookupService',
function (data, $scope, service, TagMapper, lookupService) {
$scope.selected = {
lookups: []
};
var initData = $scope.ngDialogData;
if (data.taglookups) {
$scope.lookups = data.taglookups;
translate(initData.selecteds, data.taglookups);
} else {
lookupService.findAll(function (lookups) {
data.taglookups = $scope.lookups = lookups;
translate(initData.selecteds, data.taglookups);
});
}
$scope.unselectAll = function () {
$scope.selected.lookups = [];
};
function translate(selecteds, lookups) {
angular.forEach(lookups, function (lookup) {
angular.forEach(selecteds, function (std) {
if (lookup.id === std.id) {
$scope.selected.lookups.push(lookup);
}
});
});
}
$scope.saveTag = function () {
var tags = TagMapper.lookups2Tags($scope.selected.lookups, initData.tripId);
service.save(
initData.tripId,
tags,
function (tags) {
$scope.closeThisDialog(tags);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('ToolbarCtrl', [
'$scope',
'component.Dialog',
function ($scope, Dialog) {
$scope.writeTrip = function () {
Dialog.fromTemplate('pr_writetrip_dialog')
.setClassName('pr-writetrip-dialog')
.open();
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripCardCtrl', [
'$scope',
'TripLikeService',
function ($scope, likeService) {
$scope.toggleLike = function (card) {
likeService.toggleLike(
card.trip.id,
function (likes) {
card.likes = likes;
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripCoverCtrl', [
'$scope',
'config',
'ngDialog',
function ($scope, config, dialog) {
$scope.openTripCoverDialog = function () {
dialog.open({
template: config.host + '/dialog/tripcover.html',
className: 'ngdialog-theme-default pr-tripsettings-dialog'
});
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripCtrl', [
'$state',
'$scope',
'messages',
'initData',
'TripService',
'TripLikeService',
'model.TagMapper',
'component.Dialog',
'UserFollowService',
'component.Notification',
function ($state, $scope, messages, initData, service, likeService, TagMapper, Dialog, followService, Notification) {
if (initData) {
$scope.data = initData;
}
function notify() {
Notification.create()
.setTitle(messages['notification.selectTag.TITLE'])
.setMessage(messages['notification.selectTag.MESSAGE'])
.show();
}
$scope.openTagLookupsDialog = function () {
var selecteds = TagMapper.tags2Lookups($scope.data.trip.tags);
Dialog.fromTemplate('pr_tag_lookup_dialog')
.setClassName('pr-taglookup-dialog')
.setData({
tripId: $scope.data.trip.id,
selecteds: selecteds
})
.onPreClose(function (tags) {
if (angular.isArray(tags)) {
$scope.data.setTags(tags);
notify();
}
})
.open();
};
/**
* @param {model.Trip} trip
*/
function replaceState(trip) {
$state.go('trips', {
username: trip.presenter.user.username,
tripname: trip.tripname
}, {
location: 'replace',
reload: true
});
}
function validateState(data) {
var trip = $scope.data.trip;
var oldTripname = trip.tripname;
trip.tripname = data.tripname;
trip.name = data.name;
if (oldTripname !== data.tripname) {
replaceState(trip);
}
}
$scope.openTripSettingsDailog = function () {
Dialog.fromTemplate('pr_tripsettings_dialog')
.setClassName('pr-tripsettings-dialog')
.setData({
tripId: $scope.data.trip.id,
name: $scope.data.trip.name,
tripname: $scope.data.trip.tripname
})
.onPreClose(function (data) {
if (angular.isObject(data)) {
validateState(data);
}
})
.open();
};
$scope.toggleStatus = function () {
service.toggleStatus(
$scope.data.trip.id,
function (status) {
$scope.data.trip.status = status;
}
);
};
$scope.toggleLike = function () {
likeService.toggleLike(
$scope.data.trip.id,
function (likes) {
$scope.data.likes = likes;
}, true);
};
$scope.toggleFollow = function () {
followService.toggleFollow(
$scope.data.trip.presenter.user.id,
function (follows) {
$scope.data.trip.presenter.follows = follows;
}, true);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripFollowingCtrl', [
'$state',
'$scope',
'initData',
'util.PageUtils',
'TripCardService',
function ($state, $scope, initData, PageUtils, service) {
if (initData) {
$scope.data.routerState = $state.current.name;
$scope.data.tripCardPage = initData.tripCardPage;
}
/**
* @override
*/
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.tripCardPage,
function (request) {
service.findOfUserFollowing(
request,
function (page) {
$scope.data.addTripCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripLastestCtrl', [
'$state',
'$scope',
'initData',
'util.PageUtils',
'TripCardService',
function ($state, $scope, initData, PageUtils, service) {
if (initData) {
$scope.data.routerState = $state.current.name;
$scope.data.tripCardPage = initData.tripCardPage;
}
/**
* @override
*/
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.tripCardPage,
function (request) {
service.findLastest(
request,
function (page) {
$scope.data.addTripCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripPostCtrl', [
'$scope',
'config',
'messages',
'model.Post',
'enum.PostType',
'util.Messages',
'util.PageUtils',
'TripPostService',
'component.Dialog',
'util.MessageDisplay',
'component.ConfirmDialog',
function ($scope, config, messages, Post, PostType, Messages, PageUtils, tripPostService, Dialog, MessageDisplay, ConfirmDialog) {
/**
* @param {model.Post} post
*/
$scope.editPost = function (post) {
post._editing = true;
post.backup();
};
/**
* @param {model.Post} post
*/
$scope.cancelPost = function (post) {
if (post.id) {
post._editing = false;
post.restore();
} else {
$scope.data.removePost(post);
}
};
/**
* @param {String} type
*/
$scope.addPost = function (type) {
$scope.data.insertPost(Post.fromType(type), 0);
};
/**
* @param {Number} index
* @param {String} type
*/
$scope.insertPost = function (index, type) {
$scope.data.insertPost(Post.fromType(type), index);
};
function canSave(post) {
if (PostType.VIDEO.is(post.type)) {
return post.video.isYouTube();
}
return true;
}
/**
* @param {model.Post} post
*/
$scope.savePost = function (post) {
if (!canSave(post)) {
return;
}
var index = $scope.data.indexOfPost(post);
tripPostService.save(
post,
function (post) {
$scope.data.replacePost(post, index);
}
);
};
/**
* @param {model.Post} post
*/
function deletePost(post) {
tripPostService.delete(
post,
function (status) {
if (status) {
$scope.data.removePost(post);
}
}
);
}
function deleteMessage(post) {
if (PostType.CONTENT.is(post.type)) {
return MessageDisplay.substring([
post.title,
post.content.content
]);
}
if (PostType.MAP.is(post.type)) {
return Messages.replace(messages['dialog.confirmDeletePost.map.MESSAGE'], {
lat: post.map.latitude,
lng: post.map.longitude
});
}
if (PostType.VIDEO.is(post.type)) {
return Messages.replace(messages['dialog.confirmDeletePost.video.MESSAGE'], {
link: post.video.link
});
}
return null;
}
/**
* @param {model.Post} post
*/
$scope.openConfirmDeleteDialog = function (post) {
ConfirmDialog.create()
.setHeader(messages['dialog.comfirmDeletePost.TITLE'])
.setMessage(deleteMessage(post))
.onPreConfirm(function () {
deletePost(post);
})
.open();
};
$scope.loadMorePosts = function () {
PageUtils.nextPage(
$scope.data.postPage,
function (request) {
tripPostService.findByTrip(
$scope.data.trip,
request,
function (page) {
$scope.data.addPostPage(page);
}
);
}
);
};
/**
* @param {model.Post} post
*/
$scope.openPostMapDialog = function (post) {
Dialog.fromTemplate(config.host + '/dialog/postmap.html')
.setClassName('pr-postmap-dialog')
.setData(post)
.open();
};
$scope.postTypes = PostType.values;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripPostMapCtrl', [
'$scope',
'model.MapMarker',
function ($scope, MapMarker) {
/**
* @param {model.Post} post
*/
$scope.addMapMarker = function (post) {
if (!post.map.markers) {
post.map.markers = [];
}
post.map.markers.push(new MapMarker());
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('TripSettingsCtrl', [
'$state',
'$scope',
'messages',
'TripService',
'$stateParams',
'util.Messages',
'dto.TripSettingsDto',
'TripSettingsService',
'component.Notification',
'component.ConfirmDialog',
function ($state, $scope, messages, tripService, $stateParams, Messages, TripSettingsDto, settingsService, Notification, ConfirmDialog) {
$scope.settings = toSettings($scope.ngDialogData);
/**
* @param {Object} data
* @returns {dto.TripSettingsDto}
*/
function toSettings(data) {
var settings = new TripSettingsDto();
settings.tripId = data.tripId;
settings.name = data.name;
settings.tripname = data.tripname;
return settings;
}
function notifySave() {
Notification.create()
.setTitle(messages['notification.tripSettings.TITLE'])
.setMessage(messages['notification.tripSettings.MESSAGE'])
.show();
}
$scope.saveSettings = function () {
settingsService.save(
$scope.settings,
function (settings) {
$scope.closeThisDialog(settings);
notifySave();
}
);
};
function notifyDelete(tripName) {
Notification.create()
.setTitle(messages['notification.deleteTrip.TITLE'])
.setMessage(Messages.replace(messages['notification.deleteTrip.MESSAGE'], {
tripName: tripName
}))
.show();
}
function deleteTrip(tripName) {
tripService.delete(
$scope.settings.tripId,
function (status) {
if (status) {
$state.go('users', {
username: $stateParams.username
},
{
location: 'replace',
reload: true
});
notifyDelete(tripName);
}
}
);
}
$scope.openConfirmDeleteTripDialog = function () {
$scope.closeThisDialog();
ConfirmDialog.create()
.setHeader(messages['dialog.confirmDeleteTrip.TITLE'])
.setMessage($scope.ngDialogData.name)
.onPreConfirm(function () {
deleteTrip($scope.ngDialogData.name);
})
.open();
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('UserCardCtrl', [
'$scope',
'UserFollowService',
function ($scope, userFollowService) {
/**
* @param {model.UserCard} card
*/
$scope.toggleFollow = function (card) {
userFollowService.toggleFollow(
card.user.id,
function (follows) {
card.followed = follows.followed;
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('UserCtrl', [
'$state',
'$scope',
'initData',
'$stateParams',
'util.PageUtils',
'UserTripService',
'UserFollowService',
function ($state, $scope, initData, $stateParams, PageUtils, userTripService, userFollowService) {
if (initData) {
$scope.data = initData;
$scope.data.routerState = $state.current.name;
}
$scope.toggleFollow = function () {
userFollowService.toggleFollow(
$scope.data.userCard.user.id,
function (follows) {
$scope.data.userCard.followed = follows.followed;
$scope.data.numberOfFollowers = follows.total;
}
);
};
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.tripCardPage,
function (request) {
userTripService.loadByUsername(
$stateParams.username,
request,
function (page) {
$scope.data.addTripCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('UserFollowerCtrl', [
'$state',
'$scope',
'initData',
'$stateParams',
'util.PageUtils',
'UserFollowService',
function ($state, $scope, initData, $stateParams, PageUtils, service) {
if (initData) {
$scope.data.routerState = $state.current.name;
$scope.data.userCardPage = initData.userCardPage;
}
/**
* @override from UserCtrl
*/
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.userCardPage,
function (request) {
service.loadFollowersByUsername(
$stateParams.username,
request,
function (page) {
$scope.data.addUserCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('UserFollowingCtrl', [
'$state',
'$scope',
'initData',
'$stateParams',
'util.PageUtils',
'UserFollowService',
function ($state, $scope, initData, $stateParams, PageUtils, service) {
if (initData) {
$scope.data.routerState = $state.current.name;
$scope.data.userCardPage = initData.userCardPage;
}
/**
* @override from UserCtrl
*/
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.userCardPage,
function (request) {
service.loadFollowingsByUsername(
$stateParams.username,
request,
function (page) {
$scope.data.addUserCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.factory('controller.UserPage', [
'UserPageService',
'UserTripPageService',
'UserFollowPageService',
function (userPageService, userTripPageService, userFollowPageService) {
var userState = {
TRIPS: 'users.trips',
TRIPS_LIKE: 'users.tripslike',
FOLLOWERS: 'users.followers',
FOLLOWINGS: 'users.followings'
};
/**
* @controller UserPage
*/
var UserPage = function () {
};
/**
* @param {String} username
* @param {Function} callback
*/
function trips(username, callback) {
userTripPageService.loadByUsername(
username,
callback
);
}
/**
* @param {String} username
* @param {Function} callback
*/
function tripsLike(username, callback) {
userTripPageService.loadLikeByUsername(
username,
callback
);
}
/**
* @param {String} username
* @param {Function} callback
*/
function followers(username, callback) {
userFollowPageService.loadFollowerByUsername(
username,
callback
);
}
/**
* @param {String} username
* @param {Function} callback
*/
function followings(username, callback) {
userFollowPageService.loadFollowingByUsername(
username,
callback
);
}
/**
* @param {String} username
* @param {Function} callback
*/
function defaults(username, callback) {
userPageService.loadByUsername(
username,
callback
);
}
/**
* @param {Object} param { username, stateName },
* @param {Function} callback
*/
UserPage.prototype.loadData = function (param, callback) {
if (userState.TRIPS === param.stateName) {
trips.call(this, param.username, callback);
} else if (userState.TRIPS_LIKE === param.stateName) {
tripsLike.call(this, param.username, callback);
} else if (userState.FOLLOWERS === param.stateName) {
followers.call(this, param.username, callback);
} else if (userState.FOLLOWINGS === param.stateName) {
followings.call(this, param.username, callback);
} else {
defaults.call(this, param.username, callback);
}
};
return UserPage;
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('UserTripCtrl', [
'$state',
'$scope',
'initData',
'$stateParams',
'util.PageUtils',
'UserTripService',
function ($state, $scope, initData, $stateParams, PageUtils, service) {
if (initData) {
$scope.data.routerState = $state.current.name;
$scope.data.tripCardPage = initData.tripCardPage;
}
/**
* @override from UserCtrl
*/
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.tripCardPage,
function (request) {
service.loadByUsername(
$stateParams.username,
request,
function (page) {
$scope.data.addTripCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('UserTripLikeCtrl', [
'$state',
'$scope',
'initData',
'$stateParams',
'util.PageUtils',
'UserTripService',
function ($state, $scope, initData, $stateParams, PageUtils, service) {
if (initData) {
$scope.data.routerState = $state.current.name;
$scope.data.tripCardPage = initData.tripCardPage;
}
/**
* @override from UserCtrl
*/
$scope.loadMore = function () {
PageUtils.nextPage(
$scope.data.tripCardPage,
function (request) {
service.loadLikeByUsername(
$stateParams.username,
request,
function (page) {
$scope.data.addTripCardPage(page);
}
);
}
);
};
}
]);
/**
* @author jittagornp
* create 22/08/2015
*/
pamarin.controller('WriteTripCtrl', [
'$scope',
'$state',
'messages',
'TripService',
'dto.WriteTripDto',
'component.Notification',
function ($scope, $state, messages, service, WriteTripDto, Notification) {
function go2NewTripState(trip) {
$state.go('trips', {
username: trip.presenter.user.username,
tripname: trip.tripname
});
}
function createDto() {
$scope.writeTrip = new WriteTripDto();
}
function notify() {
Notification.create()
.setTitle(messages['notification.writeTrip.TITLE'])
.setMessage(messages['notification.writeTrip.MESSAGE'])
.show();
}
createDto();
$scope.startWrite = function () {
service.save(
$scope.writeTrip,
function (trip) {
$scope.closeThisDialog();
go2NewTripState(trip);
notify();
}
);
};
}
]);
/*
* Pamarin © 2015
*/
(function ($) {
$(function () {
$('.pr-prerender').remove();
});
})(jQuery);
(function ($) {
function getPadding(pos) {
var padding = this.css('padding-' + pos);
if (!padding) {
return 0;
}
return parseInt(padding.replace('px', ''), 10);
}
$.fn.hasScrollBar = function () {
var h = this.height()
+ getPadding.call(this, 'top')
+ getPadding.call(this, 'bottom');
return this.get(0).scrollHeight > h;
};
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment