|
(function() { |
|
'use strict'; |
|
|
|
// -------------------------------------------------------------------------------- |
|
// GLOBALS - Global variables and functions |
|
// -------------------------------------------------------------------------------- |
|
|
|
var _ = window._; |
|
var app = angular.module('app', [ 'ngAnimate','ngAria','ngMessages','ngMaterial','angularFileUpload' ]); |
|
var Promise = window.Promise; |
|
|
|
|
|
// -------------------------------------------------------------------------------- |
|
// CONTROLLER - Application controller |
|
// -------------------------------------------------------------------------------- |
|
|
|
function buildFlagsGrid( template,flags ){ |
|
var tile; |
|
return _.map( flags,function (flag){ |
|
tile = _.merge( {},template ); |
|
tile.url = tile.url + flag + '.' + tile.type; |
|
tile.title = flag.replace('_',' '); |
|
return tile; |
|
}); |
|
} |
|
|
|
app.controller('appCtrl', ['$scope', function ($scope){ |
|
var scope = this; |
|
var reader = new FileReader(); |
|
var flags = ['Afghanistan','Albania','Algeria','Andorra','Angola','Antigua','Argentina','Armenia','Australia','Malawi','Austria','Malaysia','Azerbaijan','Maldives','Bahamas','Mali','Bahrain','Malta','Bangladesh','Mauritania','Barbados','Mauritius','Belarus','Mexico','Belgium','Moldova','Belize','Monaco','Benin','Mongolia','Bermuda','Montenegro','Bhutan','Morocco','Bolivia','Mozambique','Bosnia_and_Herzegovina','Myanmar','Botswana','Namibia','Brazil','Nauru','Brunei','Nepal','Bulgaria','Netherlands','Burkina_Faso','New_Caledonia','Burundi','New_Zealand','Cambodia','Nicaragua','Cameroon','Niger','Canada','Nigeria','Cape_Verde','North_Korea','Cayman_Islands','Norway','Central_African_Republic','Oman','Chad','Pakistan','Chile','Palau','China','Palestine','Colombia','Panama','Comoros','Papua_New_Guinea','Cook_Islands','Paraguay','Costa_Rica','Peru','Croatia','Philippines','Cuba','Poland','Cyprus','Portugal','Czech_Republic','Puerto_Rico','Democratic_Republic_of_the_Congo','Qatar','Denmark','Republic_of_the_Congo','Djibouti','Romania','Dominica','Russia','Dominican_Republic','Rwanda','East_Timor','Saint_Kitts_and_Nevis','Ecuador','Saint_Lucia','Egypt','Saint_Vincent_and_the_Grenadines','El_Salvador','Samoa','England','San_Marino','Equatorial_Guinea','Sao_Tome_and_Principe','Eritrea','Saudi_Arabia','Estonia','Scotland','Ethiopia','Senegal','Fiji','Serbia','Finland','Seychelles','France','Sierra_Leone','Gabon','Singapore','Georgia','Slovakia','Germany','Slovenia','Ghana','Solomon_Islands','Greece','Somalia','Greenland','South_Africa','Grenada','South_Korea','Guam','South_Sudan','Guatemala','Spain','Guinea-Bissau','Sri_Lanka','Guinea','Sudan','Guyana','Suriname','Haiti','Swaziland','Honduras','Sweden','Hong_Kong','Switzerland','Hungary','Syria','Iceland','Taiwan','India','Tajikistan','Indonesia','Tanzania','Iran','Thailand','Iraq','Togo','Ireland','Tonga','Israel','Trinidad_and_Tobago','Italy','Tunisia','Ivorycoast','Turkey','Jamaica','Turkmenistan','Japan','Tuvalu','Jordan','Uganda','Kazakhstan','Ukraine','Kenya','United_Arab_Emirates','Kiribati','United_Kingdom','Kuwait','United_States','Kyrgyzstan','Uruguay','Laos','Uzbekistan','Latvia','Vanuatu','Lebanon','Venezuela','Lesotho','Vietnam','Liberia','Wales','Libya','Yemen','Liechtenstein','Zambia','Lithuania','Zimbabwe','Luxembourg','Macedonia','Gambia','Madagascar'] |
|
|
|
var tileTemplate = { |
|
url : 'https://dl.dropboxusercontent.com/u/106021493/', |
|
type: 'jpg' |
|
}; |
|
|
|
scope.imgblob = {}; |
|
scope.file = {}; |
|
scope.flags = buildFlagsGrid(tileTemplate, _.sortBy(flags) ); |
|
scope.flag = scope.flags[0]; |
|
scope.dropBox = function(dropped) { |
|
dropped = dropped[0]; |
|
|
|
reader.onload = function(event){ |
|
dropped.src = event.target.result; |
|
scope.loaded = dropped; |
|
$scope.$apply(); |
|
}; |
|
|
|
reader.readAsDataURL(dropped); |
|
}; |
|
|
|
scope.setFlag = function(flag){ |
|
scope.flag = flag; |
|
}; |
|
|
|
scope.saveImgblob = function(){ |
|
saveAs(scope.imgblob, "facebook-profile-picture"); |
|
}; |
|
}]); |
|
|
|
|
|
|
|
// -------------------------------------------------------------------------------- |
|
// DIRECTIVES - Application canvas directive |
|
// -------------------------------------------------------------------------------- |
|
|
|
app.directive('propic',[function (){ |
|
|
|
var template = '<div id="propics" layout="row" layout-wrap><img width="230" height="230" />' + |
|
'<div flex></div><canvas width="230" height="230"></canvas></div>'; |
|
|
|
// -------------------------------------------------------------------------------- |
|
// DIRECTIVE LINK |
|
// -------------------------------------------------------------------------------- |
|
|
|
function link( scope,element,attrs ){ |
|
var propic = element.find('img')[0]; |
|
var canvas = element.find('canvas')[0]; |
|
var ctx = canvas.getContext('2d'); |
|
var img1 = new Image(); |
|
|
|
|
|
function drawImageScaled(img){ |
|
var ratio = Math.min( canvas.width / img.width, canvas.height / img.height ); |
|
var centerX = ( canvas.width - img.width*ratio ) / 2; |
|
var centerY = ( canvas.height - img.height*ratio ) / 2; |
|
|
|
ctx.clearRect( 0,0, |
|
canvas.width, |
|
canvas.height |
|
); |
|
|
|
ctx.drawImage( img,0,0, |
|
img.width,img.height, |
|
centerX, centerY, |
|
img.width*ratio, img.height*ratio |
|
); |
|
} |
|
|
|
function drawImageStretched(img){ |
|
ctx.globalAlpha = 0.4; |
|
ctx.drawImage( img,0,0, |
|
canvas.width,canvas.height |
|
); |
|
} |
|
|
|
function drawHashtag(text){ |
|
if(text){ |
|
var gradient = ctx.createLinearGradient( 0,0,canvas.width,0 ); |
|
|
|
gradient.addColorStop("0", "rgba(255,255,255,0.9)"); |
|
gradient.addColorStop("0.5", "rgba(255,255,255,1)"); |
|
gradient.addColorStop("1.0", "rgba(255,255,255,0.9)"); |
|
|
|
ctx.globalAlpha = 1; |
|
ctx.font = "bold 16px Century Gothic"; |
|
ctx.fillStyle = gradient; |
|
ctx.textAlign = "center"; |
|
ctx.fillText('#' + text,( canvas.width / 2 ),( canvas.height - 16 ) ); |
|
} |
|
} |
|
|
|
|
|
function convertDataUrlToFile(dataurl){ |
|
var array = _.reduce( atob( dataurl.split(',')[1] ), |
|
function( result,item,key,array ){ |
|
result.push( array.charCodeAt(key) ); |
|
return result; |
|
},[]); |
|
|
|
var blob = new Blob([ new Uint8Array(array)],{ 'type':'image/jpg' }); |
|
|
|
blob.src = window.URL.createObjectURL(blob); |
|
return blob; |
|
} |
|
|
|
// -------------------------------------------------------------------------------- |
|
// DIRECTIVE EVENTS - Event listeners |
|
// -------------------------------------------------------------------------------- |
|
|
|
window.addEventListener('resize',function(){ |
|
scope.$apply(); |
|
}); |
|
|
|
img1.addEventListener('load',function(){ |
|
var img2 = new Image(); |
|
|
|
img2.addEventListener('load',function(){ |
|
drawImageScaled(img1); |
|
drawImageStretched(img2); |
|
drawHashtag(scope.hashtag); |
|
|
|
scope.imgblob = convertDataUrlToFile( canvas.toDataURL() ); |
|
scope.$apply(); |
|
}); |
|
|
|
img2.setAttribute('crossOrigin', 'anonymous'); |
|
img2.src = scope.flag.url; |
|
}); |
|
|
|
// -------------------------------------------------------------------------------- |
|
// DIRECTIVE SCOPE - Isolated scope |
|
// -------------------------------------------------------------------------------- |
|
|
|
scope.$watch('loaded',function(loaded){ |
|
if( !_.isEmpty(loaded.src) ){ |
|
propic.src = loaded.src; |
|
img1.setAttribute('crossOrigin', 'anonymous'); |
|
img1.src = loaded.src; |
|
} |
|
}); |
|
} |
|
|
|
|
|
return ({ |
|
'restrict':'A', |
|
'template':template, |
|
'scope':{ |
|
'loaded':'=', |
|
'hashtag': '=', |
|
'flag': '=', |
|
'imgblob': '=' |
|
}, |
|
'replace':true, |
|
'link':link, |
|
}); |
|
|
|
}]); |
|
}()); |