/**
 * @module       jQuery RD Twitter Feed
 * @author       Rafael Shayvolodyan (raffa)
 * @see          https://ua.linkedin.com/in/rafael-shayvolodyan-3a297b96
 * @version      1.0.2
 */
(function(){(function(l,n,p){return function(){function g(a,b){this.options=l.extend(!0,{},this.Defaults,b);this.$element=l(a);this.initialize()}g.prototype.Defaults={username:"templatemonster",list:null,hashtag:null,hideReplies:!0,dateFormat:"%b/%d/%Y",apiPath:"bat/twitter_api/tweet.php",loadingText:"Loading...",localTemplate:{message:"This is sample tweet for local testing. Upload your project to the live hosting server for get data from twitter.com",serverMessage:"RD Twitter Feed: Please upload project to the server for enable plugin!",
  user_name:"TemplateMonster",date:"Fri Nov 06 11:20:43 +0000 2015",tweet:"Check Out NEW #Photographer Portfolio Responsive Photo - goo.gl/ECjPvq",avatar:"http://pbs.twimg.com/profile_images/611164752396419072/hJYLqLJR_normal.jpg",url:"https://twitter.com/templatemonster/status/660069673464160256",screen_name:"@templatemonster",media_url:["https://pbs.twimg.com/media/CS6HxzwUEAALx0y.jpg","http://pbs.twimg.com/media/CShUCIYUcAABb53.jpg"]},dateText:{seconds:"less 1m",minutes:"m",hours:"h",yesterday:"yd"},
  callback:!1};g.prototype.initialize=function(){var a;a=this.$element;this.options.list&&!this.options.username&&console.error("If you want to fetch tweets from a list, you must define the username of the list owner.");if(this.isLocal())a.prepend("<h6>"+this.options.localTemplate.message+"</h6>");else if(!this.isServer()){a.prepend("<h6>"+this.options.localTemplate.serverMessage+"</h6>");return}a.append('<span id="loading_tweet">'+(a.attr("data-twitter-loading")?a.attr("data-twitter-loading"):this.options.loadingText+"</span>"));this.fetch()};g.prototype.linking=function(a,b){var c,d,e,h,f,k,g,m,l;m=a.replace(/#([a-zA-Z0-9_]+)/g,'<a href="https://twitter.com/search?q=%23$1&amp;src=hash" target="_blank" title="Search for #$1">#$1</a>').replace(/@([a-zA-Z0-9_]+)/g,'<a href="https://twitter.com/$1" target="_blank" title="$1 on Twitter">@$1</a>');k=a.match(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/ig);if(null!==k)for(c=0,e=k.length;c<e;c++){f=k[c];g=b.entities.urls;d=0;for(h=g.length;d<h;d++)l=g[d], m=m.replace(f,'<a href="'+l.expanded_url+'" target="_blank">'+l.display_url+"</a> ");m=m.replace(f,"")}return m};g.prototype.dating=function(a,b){var c,d,e,h,f,k;c=a.split(" ");a=new Date(Date.parse(c[1]+" "+c[2]+", "+c[5]+" "+c[3]+" UTC"));e=((new Date).getTime()-a.getTime())/1E3;c="January February March April May June July August September October November December".split(" ");c={"%d":a.getDate(),"%m":a.getMonth()+1,"%b":c[a.getMonth()].substr(0,3),"%B":c[a.getMonth()],"%y":String(a.getFullYear()).slice(-2), "%Y":a.getFullYear()};d=b?"%Y-%m-%d":this.$element.attr("data-twitter-date-format")?this.$element.attr("data-twitter-date-format"):this.options.dateFormat;if(60>e)return this.$element.attr("data-twitter-date-seconds")?this.$element.attr("data-twitter-date-seconds"):this.options.dateText.seconds;if(60>e/60)return Math.round(e/60)+(this.$element.attr("data-twitter-date-minutes")?this.$element.attr("data-twitter-date-minutes"):this.options.dateText.minutes);if(24>e/60/60)return Math.round(e/60/60)+(this.$element.attr("data-twitter-date-hours")?this.$element.attr("data-twitter-date-hours"):this.options.dateText.hours);if(2>e/60/60/24)return this.$element.attr("data-twitter-date-yesterday")?this.$element.attr("data-twitter-date-yesterday"):this.options.dateText.yesterday;h=d.match(/%[dmbByY]/g);f=0;for(k=h.length;f<k;f++)e=h[f],d=d.replace(e,c[e]);return d};g.prototype.isLocal=function(){var a,b,c,d;d=["127.0.0.1","192.168","localhost"];b=0;for(c=d.length;b<c;b++)if(a=d[b],-1<n.location.hostname.indexOf(a))return!0;return!1};g.prototype.isServer=function(){var a;a=p.location.href;return-1<a.indexOf("http://")||-1<a.indexOf("https://")?!0:!1};g.prototype.getMedia=function(a){var b,c,d,e;if(a.extended_entities){if(a.extended_entities.media){d=[];e=a.extended_entities.media;b=0;for(c=e.length;b<c;b++)a=e[b],d.push(a.media_url);return d}}else return a.entities&&a.entities.media?a.entities.media[0].media_url:null};g.prototype.getTempData=function(a,b){var c,d,e,h,f;e=a.$element.find('[data-twitter-type="tweet"]').length;h=[];if(a.isLocal())for(d=0;0<=e?d<e:d>e;0<=e?++d:--d)c={user_name:a.options.localTemplate.user_name,date:a.dating(a.options.localTemplate.date,!1),datetime:a.dating(a.options.localTemplate.date,!0),tweet:a.linking(a.options.localTemplate.tweet),avatar:a.options.localTemplate.avatar,url:a.options.localTemplate.url,retweeted:!1,screen_name:a.linking(a.options.localTemplate.screen_name),media_url:a.options.localTemplate.media_url},h.push(c);else for(c=d=0;0<=e?d<e:d>e;c=0<=e?++d:--d){if(b[c])f=b[c];else if(b.statuses&&b.statuses[c])f=b.statuses[c];else break;c={user_name:f.user.name,date:a.dating(f.created_at,!1),datetime:a.dating(f.created_at,!0),tweet:a.linking(f.text,f),avatar:f.user.profile_image_url,url:"https://twitter.com/"+f.user.screen_name+"/status/"+f.id_str,retweeted:f.retweeted,screen_name:a.linking("@"+f.user.screen_name,f)};c.media_url=a.getMedia(f);h.push(c)}return h};g.prototype.fetch=function(){var a;a=this.$element;l.getJSON(this.options.apiPath,{username:a.attr("data-twitter-username")?a.attr("data-twitter-username"):this.options.username,list:a.attr("data-twitter-listname")?a.attr("data-twitter-listname"):this.options.list,hashtag:a.attr("data-twitter-hashtag")?a.attr("data-twitter-hashtag"):this.options.hashtag,count:a.find('[data-twitter-type="tweet"]').length,exclude_replies:this.options.hideReplies},l.proxy(function(b){a.find("#loading_tweet").fadeOut("fast");this.construct(this.getTempData(this,b))},this));"function"===typeof this.options.callback&&this.options.callback()};g.prototype.construct=function(a){var b,c,d,e,h,f;c=this;b=c.$element.find('[data-twitter-type="tweet"]');d=e=0;for(f=b.length;0<=f?e<f:e>f;d=0<=f?++e:--e)"A"===b.prop("tagName")&&this.tweetLink(b.eq(d),a[d]),h=0,b.eq(d).find("*").each(function(){c.parseAttributes(this,a[d],h);this.hasAttribute("data-media_url")&&h++}),b.css("opacity","1")};g.prototype.tweetLink=function(a,b){a.attr("href",b.url)};g.prototype.parseAttributes=function(a,b,c){var d,e,h,f,k,g,m;d=l(a);f=d.data();for(k in f)if(f.hasOwnProperty(k))for(h=f[k].split(/\s?,\s?/i),g=0,m=h.length;g<m;g++)e=h[g],"text"===e.toLowerCase()?a.innerHTML=b[k]:"media_url"===k?l.isArray(b[k])&&b[k].length>c?a.setAttribute(e,b[k][c]):null!==b[k]&&0===c?a.setAttribute(e,b[k]):d.remove():a.setAttribute(e,b[k])};l.fn.extend({RDTwitter:function(a){var b;this.each(function(){});b=l(this);if(!b.data("RDTwitter"))return b.data("RDTwitter",new g(this,a))}});return g}()})(window.jQuery,document,window);"undefined"!==typeof module&&null!==module?module.exports=window.RDTwitter:"function"===typeof define&&
define.amd&&define(["jquery"],function(){return window.RDTwitter})}).call(this);