/*!
* JQuery A+ plugin
* Version 0.8.4
* @requires jQuery v1.5.0 or later
*
* Copyright (c) 2012-2014 Andrea Vallorani, andrea.vallorani@gmail.com
* Released under the MIT license
*/
(function (factory) {
if( typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module depending on jQuery.
define(['jquery'], factory);
} else{
// No AMD. Register plugin with global jQuery object.
factory(jQuery);
}
}(function($) {
/*jshint debug:true, noarg:true, noempty:true, eqeqeq:true, bitwise:true, undef:true, unused:true, browser:true, devel:true, jquery:true, indent:4*/
$.fn.Aplus = function(options){
var IsAnchor = function(url){
return (url && url.toString().charAt(0)==='#') ? true : false;
};
var HideTitle = function(el){
el=$(el.target);
if(el.is('[title]') && el.is('.'+x+'confirm,.'+x+'dialog,.'+x+'disabled')){
el.data('title',el.attr('title')).removeAttr('title');
}
};
var GetTitle = function(el){
if(el.data('title')) return el.data('title');
else if(el.is('[title]')) return el.attr('title');
else return null;
};
options = $.extend(true,{
prefix: '',
win: {width:400,height:400,scrollbars:0,toolbar:0,check:true},
confirm: 'Are you sure you want to open the link?',
confirmType: false,
disabledMsg: 'alert',
scroll: {speed:300,offsetY:0},
notify: {life:10,type:null},
dialog: {dialogClass:'htmlplus-dialog'},
ajax: {loadMsg:'
'}
},options);
var x=options.prefix;
this.each(function(){
var $this = $(this);
if(!$this.is('a')){
$this.delegate('a[class]','click',parser);
$this.delegate('a[class]','mouseenter',HideTitle);
}
else if($this.is('[class]')){
HideTitle(this);
$this.click(parser);
}
});
function parser(e){
var a=$(this);
if(a.hasClass(x+'disabled')){
if(GetTitle(a) && options.disabledMsg==='alert') alert(GetTitle(a));
return false;
}
if(a.hasClass(x+'print')){
window.setTimeout(window.print,0);
return false;
}
if(!a.is('[href]')) return;
var url=a.attr('href');
var confirmed=a.data('confirmed');
if(confirmed) a.data('confirmed',false);
else if(a.hasClass(x+'confirm')){
var msg=options.confirm;
var mask=a.classPre(x+'confirm-mask');
if(!mask){
if(IsAnchor(url)) mask=url;
else if(IsAnchor(GetTitle(a))) mask=GetTitle(a);
}
else mask='#'+mask;
if(mask && $(mask).length){
msg=$(mask).html();
if(GetTitle(a)){
msg=msg.replace(/\[title\]/g,GetTitle(a));
}
msg=msg.replace(/\[href]/g,url);
msg=msg.replace(/\[text]/g,a.text());
}
else if(GetTitle(a)) msg=GetTitle(a);
if(options.confirmType!==false){
switch(options.confirmType){
case 'dialog':
if(!jQuery.ui) return false;
$("
").html(msg).dialog({
modal:true,
resizable:false,
dialogClass:'htmlplus-dialog',
buttons:{
Ok:function(){
if($(this).children('form').length===0){
a.data('confirmed',true).click();
}
else $(this).children('form').submit();
$(this).dialog("close");
},
Cancel:function(){
$(this).dialog("close");
}
}
});
break;
default:
if(typeof options.confirmType==='function'){
options.confirmType(a,msg,function(){
if($(mask+' form').length) $('form',this).submit();
else a.data('confirmed',true).click();
});
}
}
}
else if(confirm(msg)){
a.unbind('click',parser).click(parser).data('confirmed',true);
return (a.triggerHandler('click')) ? true : false;
}
return false;
}
if(a.hasClass('ajax')){
var ajaxSett=$.extend({},options.ajax,a.classPre(x+'ajax',1));
if(typeof(ajaxSett.to)!=='undefined' && ajaxSett.to){
if(typeof(a.attr('id'))==='undefined') a.attr('id',(new Date()).getTime());
var aId = a.attr('id');
ajaxSett.to = '#'+ajaxSett.to;
ajaxSett.from = (typeof(ajaxSett.from)==='undefined' || !ajaxSett.from) ? null : '#'+ajaxSett.from;
var to=$(ajaxSett.to);
var localCache=to.children('div[data-rel="'+aId+'"]');
var toH=to.height();
var lastVis = to.children(':visible');
to.children().hide();
if(localCache.length){
localCache.show();
}
else{
var container=$('');
container.html(''+ajaxSett.loadMsg+'
').appendTo(to);
$.ajax({url:url,dataType:'html'}).done(function(data){
data = $(''+data.replace(/^[\s\S]*
|<\/body>[\s\S]*$/g, '')+'');
if(ajaxSett.from){
var search = data.find(ajaxSett.from);
if(search.length){
container.html(search.html());
if(lastVis.is(':not(div[data-rel])')) lastVis.remove();
}
else{
lastVis.show();
container.remove();
a.trigger("ajaxMismatch.aplus",{response:data.html()});
}
}
else container.html(data.html());
to.trigger("ajaxToComplete.aplus",{obj:container});
a.trigger("ajaxComplete.aplus",{response:data.html()});
}).fail(function(tS,eT){
lastVis.show();
container.remove();
a.trigger("ajaxError.aplus",{textStatus:tS,errorThrown:eT});
});
}
}
else{
$.ajax({url:url,dataType:'html'}).done(function(data){
a.trigger("ajaxComplete.aplus",{response:data});
}).fail(function(tS,eT){
a.trigger("ajaxError.aplus",{textStatus:tS,errorThrown:eT});
});
}
return false;
}
else if(a.hasClass(x+'dialog')){
if(jQuery.ui){
var dSett=$.extend({},options.dialog,a.classPre(x+'dialog',1));
if(!IsAnchor(url)){
var frame;
if(a.hasClass(x+'dialog-ajax')){
frame=$('');
frame.load(url);
}
else{
frame=$('');
dSett.open=function(){
frame.css('width',$(this).parent().width());
};
}
dSett.dragStart=dSett.resizeStart=function(){
frame.hide();
};
dSett.dragStop=dSett.resizeStop=function(){
frame.show();
};
url=frame;
}
else url=$(url);
if(GetTitle(a)) dSett.title=GetTitle(a);
var wP=$(window).width();
var hP=$(window).height();
if(dSett.full){
dSett.width=wP-15;
dSett.height=hP;
dSett.position = [3,3];
if(typeof dSett.draggable==='undefined') dSett.draggable=false;
}
else{
if(dSett.w) dSett.width = dSett.w;
if(dSett.h) dSett.height = dSett.h;
if(dSett.l && dSett.t) dSett.position = [dSett.l,dSett.t];
if(dSett.width){
var w=dSett.width;
if(w.toString().charAt(w.length-1)==='p'){
w=parseInt(w,10)*(wP/100);
}
dSett.width=Math.min(w,wP);
}
if(dSett.height){
var h=dSett.height;
if(h.toString().charAt(h.length-1)==='p'){
h=parseInt(h,10)*(hP/100);
}
dSett.height=Math.min(h,hP);
}
}
url.dialog(dSett);
}
else alert('jqueryUI required!');
return false;
}
else if(a.hasClass(x+'win')){
e.preventDefault();
if(!a.data('win-id')){
a.data('win-id','win_'+((a.is('[id]')) ? a.attr('id') : new Date().getTime()));
}
var winID=a.data('win-id');
var wSett='';
var aSett=$.extend({},options.win,a.classPre(x+'win',1));
if(aSett.check) a.addClass(x+'disabled');
var wPage=$(window).width();
var hPage=$(window).height();
if(aSett.fullpage){
aSett.width=wPage;
aSett.height=hPage;
delete aSett.fullpage;
}
else if(aSett.fullscreen){
aSett.width=screen.width;
aSett.height=screen.height;
delete aSett.fullscreen;
}
else{
var winW=aSett.width;
var winH=aSett.height;
if(winW.toString().charAt(winW.length-1)==='p'){
winW=parseInt(winW,10)*(wPage/100);
}
if(winH.toString().charAt(winH.length-1)==='p'){
winH=parseInt(winH,10)*(hPage/100);
}
aSett.width=Math.min(winW,wPage);
aSett.height=Math.min(winH,hPage);
if(aSett.center){
var screenX, screenY;
if(navigator.userAgent.match(/msie/i)){
screenX=window.screenLeft;
screenY=window.screenTop;
}
else{
screenX=window.screenX;
screenY=window.screenY;
}
aSett.left = (wPage/2)-(aSett.width/2)+screenX;
aSett.top = (hPage/2)-(aSett.height/2)+screenY;
delete aSett.center;
}
}
$.each(aSett,function(i,v){
wSett+=','+i+'='+v;
});
wSett=wSett.substr(1);
var myWin=window.open('',winID,wSett);
if(myWin.location.href==='about:blank'){
myWin.location.href = url;
}
myWin.focus();
$(myWin.document).ready(function(){
if(aSett.check) a.removeClass(x+'disabled');
});
return false;
}
else if(a.hasClass(x+'scroll')){
if(!IsAnchor(url)) return true;
var scroll=$.extend({},options.scroll,a.classPre(x+'scroll',1));
$('html,body').animate({scrollTop:$(url).offset().top+scroll.offsetY},scroll.speed);
return false;
}
else if(a.hasClass(x+'notify')){
if(IsAnchor(url)) return false;
$.get(url,function(response){
var nSett=$.extend({},options.notify,a.classPre(x+'notify',1));
switch(nSett.type){
case 'jGrowl':
if($.jGrowl){
var conf={};
if(nSett.life) conf.life=nSett.life*1000;
else conf.sticky=true;
$.jGrowl(response,conf);
}
break;
case 'growlUI':
if($.growlUI){
var life = (nSett.life) ? nSett.life*1000 : undefined;
$.growlUI('',response,life);
}
break;
default:
alert(response);
}
});
return false;
}
else if(!IsAnchor(url)){
var target=null;
if(a.hasClass(x+'blank')) target='_blank';
else if(a.hasClass(x+'parent')) target='_parent';
else if(a.classPre(x+'frame')) target=a.classPre(x+'frame');
else if(a.hasClass(x+'self') || confirmed) target='_self';
if(target){
window.open(url,target);
return false;
}
}
}
};
$.fn.classPre = function(prefix,all){
var classes=this.attr('class').split(' ');
prefix+='-';
var l=prefix.toString().length;
var value=(all) ? {} : false;
$.each(classes,function(i,v){
if(v.slice(0,l)===prefix){
if(all){
var t = v.slice(l).split('-',2);
if(typeof t[1]==='undefined' || t[1]===null) t[1]=1;
else if(!isNaN(t[1])) t[1]=parseInt(t[1],10);
else if(t[1]==='true') t[1]=true;
else if(t[1]==='false') t[1]=false;
value[t[0]]=t[1];
}
else{
value = v.slice(l);
return;
}
}
});
return value;
};
}));