/*
============ appcuarium ============
Alfie ® Platform JS SDK
====== Apps outside the box.® ======
------------------------------------
Copyright © 2012 Appcuarium
------------------------------------
apps@appcuarium.com
@author Sorin Gheata
@version 1.0
====================================
*/
// Create wrapper for non-supporting browsers
if ( typeof Object.create !== 'function' ) {
Object.create = function ( obj ) {
function F() {};
F.prototype = obj;
return new F();
};
}
( function ( $, window, document, undefined ) {
// Load the Alfie framework
var timer = setTimeout( function () {
if ( alfieInit ) {
alfieInit();
}
}, 0 );
var Alfie = {
init: function ( options, elem ) {
var me = this;
me.elem = elem;
me.$elem = $( elem );
me.options = $.extend( {}, $.fn.alfie.options, options );
me.uid = $( '#user-constant-data input[name=uid]' ).val();
me.token = $( '#user-constant-data input[name=token]' ).val();
me.lang = $( '#user-constant-data input[name=lang]' ).val();
me.appId = $( '#user-constant-data input[name=appId]' ).val();
me.appSecret = $( '#user-constant-data input[name=appSecret]' ).val();
me.appFanPageID = $( '#user-constant-data input[name=appFanPageID]' ).val();
me.appFanPageURL = $( '#user-constant-data input[name=appFanPageURL]' ).val();
me.appName = $( '#user-constant-data input[name=appName]' ).val();
me.appDesc = $( '#user-constant-data input[name=appDesc]' ).val();
me.appAction = $( '#user-constant-data input[name=appAction]' ).val();
me.appIcon = $( '#user-constant-data input[name=appIcon]' ).val();
me.entryID = me.$elem.attr( 'rel' ); // ID of clicked user content
me.entryURL = me.$elem.attr( 'href' ); // Absolute URL of loaded content
me.entryRow = me.$elem.parents( 'div.row' ); // Main row
me.targetLoader = me.entryRow.find( '.cont_loader' ); // Main loader of the user content
me.selectedEntry = $( '#' + me.entryID ); // ID of origin caller of the content
me.entryBrothers = me.entryRow.find( '.onevain' ); // Common class for all user content cells
me.entryClass = 'loaded';
me.entryEnvelope = $( '
', {
class: 'loaded'
});
me.uservotes = '';
me.userviews = '';
me.usercomments = '';
me.usershares = '';
me.loaderCont = $( '', {
class: 'loading_anim'
});
me.loaderAnim = $( '', {
width: 15,
height: 10,
alt: 'loader animation',
src: me.options.loadingAnim
});
me.imgAnim = $( '', {
class: 'ajax-loader-anim',
src: me.options.loadingAnim || 'images/ajax-loader-green.gif'
});
me.loaderTxt = $( '', {
text: me.options.loadingTxt
});
me.template = $.trim( $( '#template' ).html() );
me.row_template = $.trim( $( '#row-template' ).html() );
me.alfie_feed_template = $.trim( $( '#alfie-feed-template' ).html() );
me.alfie_active_feeds = $.trim( $( '#alfie-active-feeds' ).html() );
me.item_template = $.trim( $( '#item-template' ).html() );
me.info_template = $.trim( $( '#info-template' ).html() );
me.loader = me.loaderCont.append( me.loaderAnim ).append( me.loaderTxt );
me.overlay = $( '', {
class: 'overlay'
});
me.pageID = $( '#user-constant-data input[name=pageID]' ).val();
me.route();
},
// Receive scope and action and route input based on values
route: function () {
var me = this;
action = me.options.action;
return me.executeQuery( action );
},
stack: function( key, value ) {
var me = this,
keys = [];
keys.push(key);
return $.when( me[key].call( me, value ) ).done( function ( response ) {
if( response ) {
console.log(response);
}
});
},
// Nest functions
nest: function() {},
// Convert RGB values to HEX
rgb2hex: function( value ){
value = value.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
return "#" +
("0" + parseInt(value[1],10).toString(16)).slice(-2) +
("0" + parseInt(value[2],10).toString(16)).slice(-2) +
("0" + parseInt(value[3],10).toString(16)).slice(-2);
},
// Generate loader
generateLoader: function( options ) {
var me = this,
$me = $( this ),
dfd = $.Deferred(),
unit = ( options.unit ) ? options.unit : 2,
radius = 2 * unit;
if ( !unit % 2 === 0 && !unit === 2 ) {
unit = options.unit + 1;
}
var defaults = {
unit: 2,
big: 3 * unit,
mid: 2 * unit,
small: unit,
spacing: 0.5 * unit,
color: '#768e9a',
target: 'small-toggler'
},
settings = $.extend({}, defaults, options),
totalWidth = settings.big + settings.mid + settings.small + 2 * settings.spacing,
totalHeight = settings.big,
origin = totalWidth / 2;
if ( options.target ) {
var loader = $('', {
class: options.target,
width: totalWidth + 'px',
height: totalHeight + 'px'
});
} else {
if ( me.$elem.is( '.ajax-loader' ) ) {
var loader = me.$elem;
} else {
var loader = me.$elem.parents( '.ajax-loader' );
}
}
me.$elem.append( loader[0] );
var container = $('', {
class: 'load-animation'
}),
animationBig = $('', {
class: 'load-animation-big',
width: settings.big + 'px',
height: settings.big + 'px'
}),
animationMid = $('', {
class: 'load-animation-mid',
width: settings.mid + 'px',
height: settings.mid + 'px'
}),
animationSmall = $('', {
class: 'load-animation-small',
width: settings.small + 'px',
height: settings.small + 'px'
}),
animation = [];
animation.push(animationBig,animationMid,animationSmall);
$.each(animation, function(key, value) {
container.append(value);
});
loader.append( container );
me.$elem.find('.load-animation-big').css({
left: 0,
'border-radius': radius + 'px',
'z-index': 1
});
me.$elem.find('.load-animation-mid').css({
left: settings.big + settings.spacing + 'px',
top: settings.spacing + 'px',
'border-radius': radius + 'px',
'z-index': 10
});
me.$elem.find('.load-animation-small').css({
left: settings.big + settings.mid + 2 * settings.spacing + 'px',
top: 2 * settings.spacing + 'px',
'border-radius': radius + 'px',
'z-index': 100
});
},
// Loader contract
loaderContract: function( unit ) {
var me = this,
dfd = $.Deferred();
var me = this,
bigBubble = me.$elem.find('.load-animation-big'),
midBubble = me.$elem.find('.load-animation-mid'),
smallBubble = me.$elem.find('.load-animation-small'),
bigBubbleCoords = bigBubble.position(),
midBubbleCoords = midBubble.position(),
smallBubbleCoords = smallBubble.position(),
unit = 2;
if ( bigBubbleCoords.left > smallBubbleCoords.left ) {
bigBubble.animate({
left: '-=' + 2 * unit
}, 200, 'linear');
midBubble.animate({
left: '+=' + unit
}, 200, 'linear');
smallBubble.animate({
left: '+=' + 3 * unit
}, 200, 'linear', function() {
dfd.resolve('Toggler done');
});
}
else if ( bigBubbleCoords.left < smallBubbleCoords.left ) {
bigBubble.animate({
left: '+=' + 2 * unit
}, 200, 'linear');
midBubble.animate({
left: '-=' + unit
}, 200, 'linear');
smallBubble.animate({
left: '-=' + 3 * unit
}, 200, 'linear', function() {
dfd.resolve('Toggler done');
});
}
return dfd.promise();
},
// Loader wait
loaderWait: function() {
var me = this,
toggler = me.$elem.find('.load-animation-small'),
bg = me.rgb2hex( toggler.css( 'backgroundColor' ) );
flick( toggler, bg );
function flick ( target, color ) {
target.css('background','#fff');
target.animate({'backgroundColor': color},200);
}
},
// Loader expand
loaderExpand: function( unit, mode ) {
var me = this,
bigBubble = me.$elem.find('.load-animation-big'),
midBubble = me.$elem.find('.load-animation-mid'),
smallBubble = me.$elem.find('.load-animation-small'),
bigBubbleCoords = bigBubble.position(),
smallBubbleCoords = smallBubble.position();
if ( mode == 'desc' ) {
bigBubble.animate({
left: '+=' + 2 * unit
}, 200, 'linear');
midBubble.animate({
left: '-=' + unit
}, 200, 'linear');
smallBubble.animate({
left: '-=' + 3 * unit
}, 200, 'linear');
}
else if ( mode == 'asc' ) {
bigBubble.animate({
left: '-=' + 2 * unit
}, 200, 'linear');
midBubble.animate({
left: '+=' + unit
}, 200, 'linear');
smallBubble.animate({
left: '+=' + 3 * unit
}, 200, 'linear');
}
},
// Loader toggle
loaderToggle: function() {
var me = this;
me.$elem.toggle( function(){
me.loaderContract();
me.loaderExpand( 2, 'asc' );
},
function() {
me.loaderContract();
me.loaderExpand( 2, 'desc' );
});
},
//Function to load feed entries
loadFeed: function( options ) {
console.log( options );
var me = this,
$me = $( this ),
url = '/wp-content/themes/appcuarium/load_items.php',
encoding = 'json',
callback = options.callback,
defaults = {
id: options.id,
timestamp: options.timestamp,
limit: options.limit,
cache: true,
return_feeds: options.return_feeds || 'no'
},
dfd = $.Deferred();
$.when( me.fetch( url, encoding, defaults ) ).then( function( response ) {
$.when( me.buildFeed( response ) ).then( function( resp ) {
if ( typeof callback === 'function' ) {
callback.call(me.$elem, resp);
}
});
dfd.resolve();
});
return dfd.promise();
},
//Function to load feed individual item
loadFeedItem: function( options ) {
},
buildFeed: function ( results ) {
var me = this,
dfd = $.Deferred();
var response = [];
me.rows = $.each( results, function ( key, value ) {
var rowHTML = [],
feedsList = [],
feedsholder = $('.current-feeds');
$.each( value.items, function( name , result) {
if ( result.item.item_thumbnail == '0') {
var thumbnail = '',
item_class = 'small-item';
}
else {
var thumbnail = '',
item_class = 'big-item';
}
var itemHTML = me.alfie_feed_template
.replace(/{{post-id}}/ig, result.item.item_id)
.replace(/{{item-link}}/ig, result.item.item_permalink)
.replace(/{{item-title}}/ig, result.item.item_title)
.replace(/{{item-excerpt}}/ig, result.item.item_title)
.replace(/{{item-sclass}}/ig, item_class)
.replace(/{{item-thumbnail}}/ig, thumbnail)
.replace(/{{post-timestamp}}/ig, result.item.item_timestamp);
rowHTML.push( itemHTML );
});
if ( value.feeds && feedsholder.html('')) {
$.each( value.feeds, function( index , feed ) {
var feedHTML = me.alfie_active_feeds
.replace(/{{feed-id}}/ig, feed.item.hash)
.replace(/{{feed-title}}/ig, feed.item.name);
feedsList.push( feedHTML );
});
}
var $items = $( rowHTML.join('') ),
$feeds = $( feedsList.join('') ),
response = $items;
feedsholder.append( $feeds );
dfd.resolve(response);
});
return dfd.promise(response);
},
// Tooltip
info: function( options ) {
var me = this,
dfd = $.Deferred(),
options = ( options ) ? options : me.options,
url = '../../alfie/js/',
defaults = {
action: {
fetch: {
url: url,
encoding: 'json',
params: {
id: '100',
uid: me.uid,
token: me.token,
scope: options.scope
},
next: options.scope
}
}
};
console.log( defaults );
$.when( me.executeQuery( defaults.action )).then(
function( results ) {
console.log( results );
},
function() {});
},
// Serialize the query params
serialize: function( options ) {
var filter = [],
actions,
range,
me = this,
$me = $( this ),
dfd = $.Deferred();
$( '.filter' ).each( function() {
var $me = $( this ),
$type = $me.attr( 'type' );
if ( $type == 'range-filter' ) {
var range_filter_params = {
from: '',
to: ''
}
}
if ( $type == 'string-filter' ) {
var elems = $me.find( '.filter-value' );
$.each(elems, function(key, val) {
var tag = $(val).text();
filter.push(tag);
});
var string_filter_params = {
type: $me.attr('type'),
scope: $me.attr('scope'),
separator: 'return',
last_item : ''
}
}
if ( $type == 'action-filter' ) {
var elem = $me.find( '.active' ),
type = elem.attr('direction'),
scope = elem.attr('scope'),
direction = ( type == 'asc' )? 'desc' : 'asc',
action_filter_params = {
type: direction,
scope: scope,
action: elem.attr('action'),
method : 'loadRows'
}
actions = action_filter_params;
}
});
var strings = filter.join( '+' ),
defaults = {
strings : strings,
order_by: actions.scope,
order: actions.type,
token: me.token,
lang: me.lang,
uid: me.uid,
method: actions.method,
pageID: me.pageID
},
settings = $.extend({}, defaults, options);
dfd.resolve();
console.log(options);
return settings;
},
// Filter results
filter: function( options ) {
var me = this,
defaults = {
id: me.$elem.attr( 'rel' ),
uid: me.uid,
token: me.token
},
settings = $.extend({}, defaults, options),
dfd = $.Deferred(),
query = [];
// Route behaviour based on filters type
if ( settings.type == 'string-filter' ) {
var router = me.$elem.parents().find( 'input.string-filter' );
router.on('keydown', function( e ){
var code = ( e.keyCode ) ? e.keyCode : e.which;
if ( code == 13 ) {
var $me = $( this ),
desired = $me.val(),
tagTxt = $.trim( desired.replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, '') ),
substr = tagTxt.split(' ');
tagTxt = $.grep( substr, function( value, index ) {
if ( value.length <= 3 ) {
console.log('Tag is less than 3 characters');
return;
}
else {
return value;
}
});
tagTxt = tagTxt.join(' ');
if ( tagTxt == '' ) {
return;
}
$me.val('');
var duplicate = $.inArray( tagTxt, query );
if ( duplicate === -1 ) {
var appendTo = $me.parents( '.filter' );
appendTo.find( 'ul.tags' ).append('' + tagTxt + 'x');
appendTo.find( '.transparent' ).fadeTo( 300, 1, function() {
$me.removeClass( 'transparent' ).css( 'opacity', '' );
});
$.when( me.serialize() ).then( function( response ) {
me.loadEntries( response );
});
}
else {
$('.tag-txt').filter(function() {
var $me = $( this );
if ( $me.text() == tagTxt ) {
var duplicateTag = $me.parents('li'),
bg = me.rgb2hex( duplicateTag.css( 'backgroundColor' ) );
duplicateTag.animate({
backgroundColor: '#fff'
}, 20, function() {
duplicateTag.animate({
backgroundColor: bg
}, 600, function() {
duplicateTag.css('background-color','');
});
});
return;
};
});
}
}
});
$('body').on('click', '.tags li', function() {
var $me = $( this ),
removeTag = $me.find('.tag-txt').text(),
toggler = $('.toggler.active'),
order = toggler.attr('direction'),
scope = toggler.attr('scope'),
invOrder = ( order == 'asc' )? 'desc' : 'asc',
params = {
order : invOrder,
order_by : scope
};
$me.css('background','#fff');
query = $.grep( query, function( value ) {
return value != removeTag;
});
$me.fadeTo( 300,0, function() {
$.when( $me.remove() ).then( function() {
me.loadEntries( params );
});
});
});
}
},
// Draw the time map on load
drawTimeMap: function( options ) {
var me = this,
dfd = $.Deferred(),
timeBarWidth = $('.hero-button').outerWidth(),
division = timeBarWidth / 2,
appStart = $('input[name=appStart]').val().split('-'),
voteStart = $('input[name=votingStart]').val().split('-'),
voteEnd = $('input[name=votingEnd]').val().split('-'),
start = new Date(appStart[0], appStart[1]-1, appStart[2]),
vote = new Date(voteStart[0], voteStart[1]-1, voteStart[2]),
end = new Date(voteEnd[0], voteEnd[1]-1, voteEnd[2]),
now = new Date(),
totalTime = Math.floor( ( end - start ) / 1000),
inscriptionTime = Math.floor( ( vote - start ) / 1000),
voteTime = Math.floor( ( end - vote ) / 1000),
isVoting = Math.floor( ( vote - now ) / 1000),
inscMultiplier = division / inscriptionTime,
voteMultiplier = division / voteTime,
voting = false,
timePosition = 0,
timeContainer = $('.countdown-timer'),
titleContainer = $('.hero-tooltip-title'),
timePin = $('.time-bar-marker'),
timePinWidth = timePin.outerWidth(),
timePinCompensation = Math.floor ( timePinWidth / 2);
timePin.css('left', 0);
$('.time-bar, .time-bar-light, .countdown-timer ul, .time-map-markers').css( 'width', timeBarWidth );
$('.time-map-markers li').css( 'width', ( Math.round(timeBarWidth / 2 ) - 2 ));
timeContainer.fadeIn('slow');
if ( isVoting <= 0 ) {
voting = true;
var timeStamp = end;
timeContainer.addClass('post-voting');
title = options.post;
timePosition = Math.round( division + ( now - vote ) / 1000 * voteMultiplier );
}
else if ( isVoting > 0 ) {
voting = false;
var timeStamp = vote,
title = options.pre;
timeContainer.addClass('pre-voting');
timePosition = Math.round( division - ( vote - now ) / 1000 * inscMultiplier );
}
var timePinX = timePosition - timePinCompensation;
timePin.delay( 1000 ).animate({
left: '+=' + timePinX
},1000 );
setInterval( function() {
me.timer( timeStamp );
}, 1000);
$( '.time-bar-dark' ).delay( 1000 ).animate({width: '+=' + timePosition}, 1000, function() {
var timeMapInfoHtml = me.info_template
.replace(/{{title}}/ig, title)
.replace(/{{days}}/ig, d)
.replace(/{{hours}}/ig, h)
.replace(/{{minutes}}/ig, m)
.replace(/{{seconds}}/ig, s);
$( 'body' ).append( timeMapInfoHtml )[0];
dfd.resolve( 'Time Bar loaded' );
});
return dfd.promise();
},
// Time map info
timeMapInfo: function() {
var me = this,
dfd = $.Deferred(),
tooltip = $('div.hero-tooltip'),
handlerPosition = me.$elem.offset(),
handlerWidth = me.$elem.outerWidth(),
tooltipWidth = tooltip.outerWidth(),
posX = Math.floor( handlerPosition.left - tooltipWidth / 2 + handlerWidth / 2 ),
posY = Math.floor( handlerPosition.top + 16 ),
open = 't-open';
$('body').on('click', '.close', function() {
$(this).parents('.' + open).removeClass(open).fadeOut('fast');
});
$('body').on('click', function() {
$('.' + open).removeClass(open).fadeOut('fast');
});
$('body').on('click', '.hero-tooltip, .time-bar-marker', function( e ) {
e.stopPropagation();
});
tooltip.css({
left: posX,
top: posY
});
if ( tooltip.is('.' + open)) {
tooltip.removeClass(open).fadeOut('fast');
dfd.resolve('Tooltip closed');
}
else {
tooltip.addClass(open).fadeIn('fast');
dfd.resolve('Tooltip open');
}
return dfd.promise();
},
timer: function( timeStamp ) {
var me = this,
days = 24 * 60 * 60,
hours = 60 * 60,
minutes = 60,
now = new Date(),
timeLeft = Math.floor( ( timeStamp - now ) / 1000),
dfd = $.Deferred(),
response = [];
d = Math.floor( timeLeft / days );
timeLeft -= d * days;
response.push( d );
h = Math.floor( timeLeft / hours );
timeLeft -= h * hours;
h = Math.floor((h/10)%10) + '' + Math.floor(h%10);
response.push( h );
m = Math.floor( timeLeft / minutes );
timeLeft -= m * minutes;
m = Math.floor((m/10)%10) + '' + Math.floor(m%10);
response.push( m );
s = timeLeft;
s = Math.floor((s/10)%10) + '' + Math.floor(s%10);
response.push( s );
$.each( response, function( i, v ) {
updateDigit(i,v);
});
function updateDigit( index, value ) {
var updateIndex = index + 1;
var destination = $('.hero-tooltip-container p span:nth-child(' + updateIndex + ')'),
data = destination.text();
if ( data == value ) {
return;
}
$('.hero-tooltip-container p span:nth-child(' + updateIndex + ')').html( value );
dfd.resolve( value );
}
return dfd.promise();
},
// Share
share: function() {
var me = this,
dfd = $.Deferred(),
url = '../../alfie/js/',
defaults = {
id: me.$elem.attr( 'rel' ),
uid: me.uid,
token: me.token
},
settings = $.extend({}, defaults, me.options),
id = settings.id,
scope = settings.scope,
method = settings.method,
uid = settings.uid,
token = settings.token,
desc = $('#entry-' + id).find('p').text();
console.log(desc);
$.when( me.animateLoadIn(), me.checkPerms() )
.then( function() {
FB.ui({
method: 'feed',
name: me.appName,
link: me.appFanPageURL,
picture: me.appIcon,
caption: desc,
description: me.appDesc,
action_links: [{
text: me.appAction,
href: me.appFanPageURL
}]
}, function( response ) {
me.animateLoadOut();
if( !response === false ) {
$.when( me.counters( settings ) ).then( function( results ) {
$.each( results, function( key, data) {
if ( data.status === 'success' ) {
me.newCount({
scope: scope,
id: id,
count: data.counters.shares
});
me.notify( id, data.status, data.message );
dfd.resolve( data.message );
}
else {
me.notify( id, data.status, data.message);
dfd.resolve( data.message );
}
});
},
function() {
dfd.reject();
});
} else {
me.notify({
id: id,
confirm: 'both',
message: 'No se ha compartido',
target: '',
status: 'error',
scroll: true
});
dfd.reject();
}
});
}, function() {
me.animateLoadOut();
me.notify({
id: id,
confirm: 'both',
message: 'Tienes que aceptar los permisos',
target: '',
status: 'error',
scroll: true
});
dfd.reject();
});
dfd.promise();
},
// Update database counters
counters: function( options ) {
var me = this,
dfd = $.Deferred(),
url = '../../alfie/js/',
defaults = {
id: me.$elem.attr( 'rel' ),
uid: me.uid,
token: me.token
},
settings = $.extend({}, defaults, options),
id = settings.id,
scope = settings.scope,
method = settings.method,
uid = settings.uid,
token = settings.token;
$.when( me.fetch( url, '', settings ) ).then( function ( results ) {
dfd.resolve( results );
}, function() {
dfd.reject();
});
return dfd.promise();
},
// Update counters on page
newCount: function( options ) {
var me = this,
id = options.id,
scope = options.scope,
count = options.count,
target = $( '.item-' + id ),
counter = target.find( 'a.counter-' + scope ),
interact = target.find('ul.small-stats li.icon-' + scope),
dfd = $.Deferred();
if( scope == 'votes') { var append = me.uservotes }
else if ( scope == 'shares' ) { var append = me.usershares }
else if ( scope == 'comments' ) { var append = me.usercomments }
else if ( scope == 'views' ) { var append = me.userviews };
interact.append( append );
counter.fadeTo( 'fast', 0, function() {
counter.text( count ).fadeTo( 'fast', 1, function() {
dfd.resolve( 'New ' + scope + ' count' );
});
});
return dfd.promise();
},
// Execute called function
executeQuery: function ( action ) {
var me = this;
if ( typeof action === 'string' ) {
var array = action.split(/[ ,]+/),
count = array.length;
return $.when( me[array].call( me ) ).done( function( response ) {
});
}
else if ( typeof action === 'object' ) {
$.each( action, function( key, value ) {
if( value.next ) {
next = value.next;
$.when( me[ key ].call( me, value ) ).pipe( function( data ) {
return me[ next ].call( me, data );
}).then( function( data ) {
console.log( key + ' Resolved -> Chained done for: ' + data );
}, function( message ) {
console.log( key + ' Rejected: Reason -> ' + message ) ;
});
}
else {
return me[ key ].call( me, value );
}
});
}
},
// Notify
notify: function ( id, status, message ) {
var me = this,
dfd = $.Deferred();
// If not an object ...
if ( typeof( id ) === 'string' ) {
var id = id,
status = status,
message = message;
}
// If an object was passed ...
else if ( typeof( id ) === 'object' ) {
if ( id.data ) {
var data = id.data
}
else {
var data = id;
}
var defaults = {
id : '',
status : '',
message : '',
method : 'inline',
confirm : '',
container : 'overly',
message : '',
target : '',
status : 'success',
scroll : false
};
var settings = $.extend({}, defaults, data),
id = settings.id,
status = settings.status,
message = settings.message;
method = settings.method,
confirm = settings.confirm,
container = settings.container,
message = settings.message,
target = settings.target,
status = settings.status,
scroll = settings.scrollTo;
}
cont = $( '#vote_echo_'+ id );
cont.hide().css({'height':'0px','margin-top':'0px'});
cont.removeClass().addClass( status ).html( message );
cont.fadeTo( 200, 0, function () {
cont.wrapInner( '' );
var newheight = $( 'div:first', cont ).outerHeight();
cont.animate({
height: newheight + 'px',
marginTop: '20px'
}, 200, 'easeOutQuint', function() {
cont.css( 'height', '' );
cont.fadeTo( 400,1, function() {
cont.delay( 2000 ).fadeTo( 300,0 ).animate({
height: '0px',
marginTop: '0px'
}, 200, function() {
dfd.resolve( id );
});
})
});
});
return dfd.promise();
},
// Randomize loaded entries
randomize: function( options, target ) {
var o = new Array(),
dd = new Array(),
dfd = $.Deferred();
for (var i = 0; i < options; i++) {
var n = Math.floor(Math.random() * options);
if ($.inArray(n, o) > 0)--i;
else o.push(n);
}
var b = target.each(function ( i ) {
var f = $( this );
setTimeout(function () {
f.fadeTo(400, 1, function() {
dd.push(i);
if( options === dd.length) {
dfd.resolve('Done');
}
});
},
o[i] * 150);
});
return dfd.promise();
},
// Check user permissions
checkPerms: function () {
var me = this,
permsNeeded = ['email', 'user_location', 'user_videos', 'user_likes','read_friendlists','read_mailbox'],
dfd = $.Deferred();
FB.api( '/me/permissions', function ( response ) {
var permsArray = response.data[0],
permsToPrompt = [];
for ( var i in permsNeeded ) {
if ( permsArray[permsNeeded[i]] == null ) {
permsToPrompt.push( permsNeeded[i] );
}
}
if ( permsToPrompt.length > 0 ) {
$.when( me.promptPerms( permsToPrompt ) ).then( function( data ) {
dfd.resolve( data );
}, function( message ) {
dfd.reject( message );
});
} else {
dfd.resolve( 'No need for permissions' );
}
});
return dfd.promise();
},
// Promt user for revoked permissions
promptPerms: function ( perms ) {
var appPerms = perms.join( ',' ),
me = this,
dfd = $.Deferred();
FB.ui({
client_id: me.appId,
method: 'oauth',
scope: appPerms,
perms: appPerms
},
function ( response ) {
if( response.perms == appPerms ) {
dfd.resolve('All permissions are given, continuing...');
}
else {
dfd.reject('No permissions were given');
}
});
return dfd.promise();
},
// Dummy control function
dummy: function() {
var me = this,
vars = {
id : '98',
scope : 'vote',
token: me.token,
uid: me.uid,
}
$.when( me.vote() ).done( function() {
me.console( 'Dummy action 1 completed' );
$.when( me.loadEntries() ).done( function() {
me.console( 'Dummy action 2 completed' );
$.when( me.fetch('voting/up_vote.php','',vars ) ).done( function() {
me.console( 'Dummy action 3 completed' );
});
});
});
},
// Vote
vote: function ( id ) {
var me = this,
dfd = $.Deferred(),
url = '../../alfie/js/',
defaults = {
id: me.$elem.attr( 'rel' ),
uid: me.uid,
token: me.token,
pageID: me.pageID
},
settings = $.extend( {}, defaults, me.options ),
id = settings.id,
scope = settings.order_by,
method = settings.method,
uid = settings.uid,
token = settings.token;
$.when( me.animateLoadIn() ).done( function () {
$.when( me.counters( settings ) ).then( function( results ) {
$.each( results, function( key, data ) {
if ( data.status === 'success' ) {
me.$elem.delay( 100 ).animate({
backgroundColor:'#f9f9f9',
borderColor:'#efefef',
color:'#cecece'
}, 400, function() {
me.$elem.addClass( 'voted' ).removeClass( 'vote' );
$.when( me.notify( id, data.status, data.message ) )
.done( function() {
me.newCount({
scope: scope,
id: id,
count: data.counters.votes
});
});
dfd.resolve( data.message );
});
}
else {
me.notify( id, data.status, data.message );
dfd.resolve( data.message );
}
});
me.animateLoadOut();
},
function() {
dfd.reject();
});
});
return dfd.promise();
},
view: function ( id ) {
var me = this,
dfd = $.Deferred(),
url = '../../alfie/js/',
defaults = {
id: me.$elem.attr( 'rel' ),
uid: me.uid,
token: me.token
},
settings = $.extend( {}, defaults, id ),
id = settings.id,
scope = settings.scope,
method = settings.method,
uid = settings.uid,
token = settings.token,
duration = $( '#duration-' + id ).val(),
minTime = parseInt( duration ) * 510;
me.$elem.removeClass( 'hero' );
console.log( 'Removed class Hero on: ' + id );
timer = setTimeout( function () {
var active = me.targetLoader.find( '.loaded' );
if ( active.is( '.item-' + id ) ) {
$.when( me.counters( settings ) ).then( function( results ) {
$.each( results, function( key, data ) {
if ( data.status === 'success' ) {
me.newCount({
scope: scope,
id: id,
count: data.counters.views
});
clearTimeout(timer);
dfd.resolve( data.message );
}
else {
clearTimeout(timer);
dfd.reject( data.message );
}
});
},
function() {
dfd.reject();
});
}
console.log( 'Timeout cleared for: ' + id );
}, minTime );
return dfd.promise();
},
// Load entries
loadEntries: function ( params ) {
$('.onevain').animate({
'opacity':'0.5'
}, 200);
var me = this,
$me = $( this ),
dir = me.$elem.attr('direction'),
oBy = me.$elem.attr('scope'),
order = dir || params.order,
orderBy = oBy || params.order_by,
active = me.$elem.is('.active'),
method = me.$elem.attr('method'),
last_item = '' || $( ".onevain:last" ).attr( "id" );
if ( ( me.$elem ).is( '.loader' ) ) {
$( '.latest' ).empty();
$( '.boton' ).removeClass( 'active' );
$( '#rowCount' ).val('');
me.$elem.addClass( 'active' );
}
if ( !me.$elem.is( ".external" ) ) {
$( '.latest' ).empty();
$( '.boton' ).removeClass( 'active' );
$('#rowCount').val('');
// me.$elem.addClass( 'active' );
if ( dir == 'desc' ) {
me.$elem.attr( 'direction','asc' );
if( active === true ) {
$.when( me.loaderContract() ).done( function() {
me.loaderWait();
});
//me.loaderExpand( 2, 'asc' );
}
else {
me.$elem.parents('.filters').find('.small-toggler').remove();
me.$elem.parents('.filters').find('.active').removeClass('active');
me.$elem.addClass('active');
me.generateLoader({target:'small-toggler'});
$.when( me.loaderContract() ).done( function() {
me.loaderWait();
});
//me.loaderExpand( 2, me.$elem.attr('direction') );
}
}
else if ( dir == 'asc' ) {
me.$elem.attr( 'direction', 'desc' );
if( active === true ) {
$.when( me.loaderContract() ).done( function() {
me.loaderWait();
});
//me.loaderExpand( 2, 'desc' );
}
else {
me.$elem.parents('.filters').find('.small-toggler').remove();
me.$elem.parents('.filters').find('.active').removeClass('active');
me.$elem.addClass('active');
me.generateLoader({target:'small-toggler'});
$.when( me.loaderContract() ).done( function() {
me.loaderWait();
});
// me.loaderExpand( 2, me.$elem.attr('direction') );
}
}
}
var url = "../../alfie/js/",
encoding = 'json',
dfd = $.Deferred(),
preloader = $('.loadmore'),
defaults = {
token: me.token,
lang: me.lang,
uid: me.uid,
method: method,
last_item : last_item
},
settings = $.extend({}, defaults, params);
$.when( me.animateLoadIn( preloader ) ).done( function () {
$.when( me.serialize( settings ) ).done( function( response ) {
$.when( me.fetch( url, encoding, response ) ).then( function ( results ) {
$.when( me.buildRows( results ) ).then( function () {
$('.row .onevain:nth-child(2)').addClass('nolb');
$('.row > .onevain:last-child').addClass('last-item');
$( ".latest" ).append( results );
$( ".loading" ).fadeIn( 'slow' );
$( ".loading" ).removeClass( 'loading' );
$( '.loadmore' ).text( 'View more' ).attr({
order: order,
scope: orderBy
});
var t = $('.row:last'),
w = $('#alfie'),
offset = t.offset(), // Get the top y position of the current div
woffset = w.offset(),
h = t.outerHeight(),
s = $('.randomize'),
c = s.size();
if( response.scroll === true && !me.$elem.is( '.small-toggler' ) ) {
scrollTo( offset.top - 588 + 20, me.$elem);
}
if ( response.randomize === true ) {
$.when( me.randomize( c, s ) ).done(function() {
$('.onevain').animate({
'opacity':'1'
}, 600);
});
}
else {
$('.onevain').animate({
'opacity':'1'
}, 600);
}
s.removeClass('randomize');
me.animateLoadOut( preloader );
me.loaderExpand( 2, me.$elem.attr('direction') );
dfd.resolve( results );
}, function() {
dfd.reject();
});
}, function() {
$('.onevain').animate({
'opacity':'1'
}, 600);
$( '.loadmore' ).text( 'No more posts to show' );
dfd.reject( 'No more posts to show' );
});
});
});
return dfd.promise();
},
// Fade in animation for the target loader
animateLoadIn: function ( target, options ) {
var me = this,
$me = $( this ),
dfd = $.Deferred();
me.imgAnim.remove();
me.$elem.css( 'background', '' );
if ( target ) {
var loader = target;
} else {
if ( me.$elem.is( '.ajax-loader' ) ) {
var loader = me.$elem;
} else {
var loader = me.$elem.parents( '.ajax-loader' );
}
}
loader.prepend( me.overlay );
loader.css( 'height', loader.height() + 'px' );
var animation = ( options ) ? options : me.imgAnim;
me.overlay.fadeTo( 200, 1, function () {
loader.prepend( animation );
animation.show();
dfd.resolve();
me.console( 'Animate In completed' );
});
return dfd.promise();
},
// Fade out animation for the target loader
animateLoadOut: function ( target ) {
var me = this,
$me = $( this ),
dfd = $.Deferred();
me.$elem.css( 'background', '' );
if ( target ) {
var loader = target;
} else {
if ( me.$elem.is('.ajax-loader' ) ) {
var loader = me.$elem;
} else {
var loader = me.$elem.parents( '.ajax-loader' );
}
}
me.imgAnim.remove();
loader.css( 'height', '' );
$( '.overlay' ).fadeTo( 400, 0, function () {
$( '.overlay' ).remove();
dfd.resolve();
console.log( 'Animate Out completed' );
});
return dfd.promise();
},
// Log messages to the console.
//
// Arguments: message;
// Deferred: yes
//
// 1. If the request is made from inside the plugin, then the arguments are passed as usually
// Ex: me.console( message );
//
// 2. If the request is made from outside, it can be passed as string or as object
// As string:
//
// alfie( 'console' , 'The message to be displayed' );
//
// Else if the request is passed as object, the call will look like this:
//
// $.( caller ).alfie( { action: { console: { message: 'Message to be displayed' }}} );
console: function ( message ) {
var me = this,
dfd = $.Deferred();
if ( typeof message === 'string' ) {
console.log( message );
dfd.resolve( message );
}
else if ( typeof message === 'object' ) {
console.log( message.message || message);
dfd.resolve( message.message || message );
}
else if( me.options.message ) {
console.log( me.options.message );
dfd.resolve( me.options.message );
}
else {
dfd.reject( 'No message was passed' );
}
return dfd.promise();
},
// Get JSON
// Returns an AJAX call to the URL provided, along with the JSON encoded response
fetch: function ( url, encoding, params ) {
var me = this,
ajaxUrl = url.url || url,
ajaxEncoding = url.encoding || encoding,
ajaxParams = url.params || params,
cache = params.cache || 'false'
return $.ajax({
url: ajaxUrl,
async: true,
cache: cache,
data: ajaxParams,
dataType: ajaxEncoding
}).promise();
},
// Prepare the call
prepare: function () {
var me = this,
loader = $( '.open' ),
dfd = $.Deferred();
if ( !me.targetLoader.is( '.open' ) ) {
$( '.open' ).removeClass( 'open' );
me.targetLoader.addClass( 'open' );
}
me.selectedEntry.addClass( 'current' );
me.selectedEntry.find( '.vidfader' ).fadeTo( 200, 0, function () {
var $me = $(this);
$me.hide();
me.console('Prepare done');
dfd.resolve('Prepare done');
});
return dfd.promise();
//me.targetLoader.append(me.loader);
},
// The call is prepared
prepared: function () {
var me = this,
loader = $( '.open' ),
id = me.$elem.attr( 'rel' ),
dfd = $.Deferred();
me.selectedEntry.addClass( 'current' );
if ( !me.targetLoader.is( '.static' ) ) {
// me.selectedEntry.append(me.loader); // Animate the loader on first clicked item
}
var url = '../../alfie/js/',
encoding = 'json',
params = {
id: id,
uid: me.uid,
token: me.token,
scope: me.options.scope
};
$.when( me.fetch( url, '', params ) ).done( function ( results ) {
me.buildFrag( results );
dfd.resolve('All done');
});
return dfd.promise();
},
// Load main user object
loadHero: function () {
var me = this,
loader = $( '.open' ),
dfd = $.Deferred();
// Hide the current clicked element
$( '.current' ).removeClass( 'current' );
$( '.vidfader' ).css( {"opacity": "1","display": "block"} );
// Load the animation in the clicked element parent if target is closed
if ( me.targetLoader.is( '.static' ) ) {
var target = me.targetLoader;
} else {
var target = me.$elem.parents( '.ajax-loader' );
}
$.when(me.prepare()).done(function() {
$.when( me.animateLoadIn( target, me.loader ) ).done( function () {
$.when( me.prepared() ).done( function () {
me.display();
});
});
});
},
build: function() {
var me = this,
loader = $('.open'),
dfd = $.Deferred();
loader.html(me.objects);
dfd.resolve(me.objects);
return dfd.promise();
},
// Show the query HTML result
display: function () {
var me = this,
loader = $( '.open' ),
dfd = $.Deferred();
if ( !me.targetLoader.is( '.static' ) ) {
loader.css( 'height', '0px' );
} else {
loader.css( 'height', loader.height() );
}
loader.fadeTo( 200, 0, function () {
$.when(me.build()).done(function() {
if ( !me.targetLoader.is( '.static' ) ) {
loader.wrapInner( '' );
var newheight = $( 'div:first', loader ).height();
me.entryBrothers.css( "border-top", "1px solid #E8E8E8" );
loader.animate({
height: newheight + 'px'
}, 400,
function () {
loader.addClass( 'static' );
var offset = loader.offset(); // Get the top y position of the current div
$( '.cont_loader' ).css( 'height', '' );
$.when(scrollTo( offset.top + 22, me.$elem )).done(function() {
loader.delay(500).fadeTo( 400, 1, function () {
me.animateLoadOut();
$( '.loading_anim' ).fadeTo(100,0, function() {
$( '.loading_anim' ).remove();
});
dfd.resolve();
});
});
});
} else {
var offset = loader.offset(); // Get the top y position of the current div
$( '.cont_loader' ).css( 'height', '' );
scrollTo( offset.top + 22, me.$elem );
loader.fadeTo(400, 1, function () {
me.animateLoadOut();
dfd.resolve();
});
}
});
return dfd.promise();
});
}
};
$.fn.alfie = function ( options ) {
var feedReader = Object.create( Alfie );
if ( feedReader[options] ) {
return feedReader[options].apply( this, Array.prototype.slice.call( arguments, 1 ) );
} else if ( typeof options === 'object' || !options ) {
return this.each( function () {
feedReader.init( options, this );
$.data( this, 'alfie', feedReader );
});
}
};
$.fn.alfie.options = {
onComplete: null
};
})(jQuery, window, document);