/**
* jQuery Plugin textgrad, version 0
* (c) 2007 Guillaume Andrieu, subtenante@yahoo.fr
* http://www.agencenp.net/textgrad/textgrad.html
* Licensed GPL licenses:
* http://www.gnu.org/licenses/gpl.html
*/
(function($){
/**
* SPANIZE routine
*/
$.spanizeText = function(obj,spanClass,maxGroup){
var text=$(obj).html();
var res = "";
var tag="";
var spanlength=1;
var reg = new RegExp ("^([^\\s<&]|&[a-z]*;){1,"+maxGroup+"}");
while (text.length>0){
if (tag=text.match(/^(\s|(<[^>]*>))+\s*/)){
if (tag.length>0){
text = text.substr(tag[0].length);
res+=tag[0];}}
if (tag=text.match(reg)){spanlength=tag[0].length;}
else spanlength=1;
res+=""+text.substring(0,spanlength)+"";
text=text.substring(spanlength);
}
$(obj).html(res);
};
/**
* spanize jquery function
*/
$.fn.spanize = function(spanClass,maxGroup){
$(this).each(function(){$.spanizeText(this,spanClass,maxGroup);});
};
/**
* UNSPANIZE routine
*/
$.unspanize = function(obj,spanClass){
var text=$(obj).html();
var reg = new RegExp ("<(?:span|SPAN)[^>]*"+(spanClass==''?'':' class=(?:"|\')?'+spanClass+'(?:"|\')?')+">([^<\\s]+)(?:span|SPAN)>",'g');
text=text.replace(reg,"$1");
//alert($(obj).html()+"\n\n"+text);
$(obj).html(text);
};
/**
* unspanize jquery function
*/
$.fn.unspanize = function(spanClass){
$(this).each(function(){$.unspanize(this,spanClass);});
}
$.str2color = function(str){
if (str && str.constructor == Array && str.length == 3) return str;
var res;
if (str.match(/rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)/)){
str.replace("rgb(","");str.replace(")","");
res=str.split(",");
for(i=0;i<3;i++){if (res[i]>255) res[i]=255;}
return res;}
else if (str.match(/#?[0-9a-fA-F]{6}/)){
if (str.length==7) str=str.substring(1);
res = [parseInt(str.substring(0,2),16),
parseInt(str.substring(2,4),16),
parseInt(str.substring(4,6),16)];}
else if(str.match(/#?[0-9a-fA-F]{3}/)){
if (str.length==4) str=str.substring(1);
res = [parseInt(str.substring(0,1)+str.substring(0,1),16),
parseInt(str.substring(1,2)+str.substring(1,2),16),
parseInt(str.substring(2,3)+str.substring(2,3),16)];}
else res = [0,0,0];
return res;};
/**
* DEFAULTS for textgrad
*/
$.textGrad = {};
$.textGrad.defaults = {
debut:'F00',
fin:'0FF',
maxGroup:3,
type:'',
spanClass:''
};
/**
* textgrad jquery function
*/
$.fn.textgrad=function(settings){
//+++++ FUNCTIONS
var abspos = function(jobj){
var curleft = 0;
var curtop = 0;
if (jobj.offsetParent) {
curleft += jobj.offsetLeft;
curtop += jobj.offsetTop;
var obj=jobj;
while (obj = obj.offsetParent) {
curleft += obj.offsetLeft;
curtop += obj.offsetTop;}}
return [curleft,curtop];};
var pos = function(jobj){
var res=abspos(jobj);
return [res[0]-0.5*jobj.offsetWidth,res[1]+0.5*jobj.offsetHeight];};
var boxpos = function(jobj){
var tpos = abspos(jobj);
$(jobj).prepend('p');
var res = [tpos[0]+0.5*$('span.test',jobj).get(0).offsetWidth,
tpos[1]+0.5*$('span.test',jobj).get(0).offsetHeight,
jobj.offsetWidth-0.5*$('span.test',jobj).get(0).offsetWidth,
jobj.offsetHeight-0.5*$('span.test',jobj).get(0).offsetHeight];
$('span.test',jobj).lt(1).remove();
return res;};
var spandim = function(span){
var tpos = pos(span);
var res = [tpos[0],tpos[1],0.5*span.offsetWidth,0.5*span.offsetHeight];
return res;};
var pickingrad = function(point){
if (grad.length==0) return [0,0,0];
if (grad.length==1) return grad[0]['col'];
point=100*point;
if (point<=grad[0]['pc']) {
//alert(point+" "+grad[0]['col']);
return grad[0]['col'];}
if (point>=grad[grad.length-1]['pc']) {
//alert(point+" "+grad[0]['col']);
return grad[grad.length-1]['col'];}
var mins=0;var maxs=100;var minc=[0,0,0];var maxc=[0,0,0];
var i=0;
while(point>=grad[i]['pc'] && i=0){maxs=grad[i]['pc'];maxc=grad[i]['col'];i--;}
var res=[0,0,0];
var mult = (point-mins)/(maxs-mins);
for(i=0;i<3;i++){res[i]=minc[i]+(maxc[i]-minc[i])*mult;}
//alert(minc+"\n"+maxc+"\n"+point+"\n"+mult+"\n"+res);
return res;
};
var getcolor = function(span,bp){
var sp=spandim(span);
var res=[0,0,0];
if (type=='|'){
var delta=(sp[1]-bp[1])/bp[3];
}
else if (type=='o'){
Cx=bp[0]+bp[2]/2;Cy=bp[1]+bp[3]/2;
r=Math.sqrt((Cx-sp[0])*(Cx-sp[0])+(Cy-sp[1])*(Cy-sp[1]));
R=Math.sqrt((bp[2])*(bp[2])/4+(bp[3])*(bp[3])/4);
var delta =r/R;
}
else if (type=='_' || 2.5*sp[3]>bp[3]){
var delta=(sp[0]-bp[0])/bp[2];
}
else if (type=='/'){
multx=(sp[0]-bp[0])/bp[2];
multy=(bp[3]-sp[1]+bp[1])/bp[3];
var delta = (multx+multy)/2;
}
else{
multx=(sp[0]-bp[0])/bp[2];
multy=(sp[1]-bp[1])/bp[3];
var delta = (multx+multy)/2;
}
var res = pickingrad(delta);
res = "rgb("+Math.round(res[0])+","+Math.round(res[1])+","+Math.round(res[2])+")";
//alert(sp+"\n"+bp+"\n"+$(span).text()+"\n"+res);
return res;
};
var treatgrad=function(){
for(i=0;i0) $.spanizeText(this,spanClass,maxGroup);
var blockpos=boxpos(this);
$("span"+(spanClass==''?'':'.'+spanClass),this).each(function(){$(this).css('color',getcolor(this,blockpos))});
if (opt['cb'] && opt['cb'].constructor == Function) opt['cb'].call(this);
});//EO $(this).each(...);
};//EO $.fn.textgrad
/**
* textscan jquery function
*/
$.fn.textscan = function(settings){
var opt = settings||{};
var initColor = $.str2color(opt['initColor']||"000");
var endColor = $.str2color(opt['endColor']||"F00");
var transColor= $.str2color(opt['transColor']||"FFF");
var spcl = opt['spanClass']||'animgradsp';
var direction = opt['direction']||'->';
var mg = opt['maxGroup']||2;
var spnz = opt['spanize']||1;
var unspnz = opt['unspanize']||1;
var amplitude = opt['amplitude']||20;
var step = opt['step']||5;
$(this).each(function(){
var timer;
var steps = 100+2*amplitude;
var currStep=(direction=='->'?0:100);
var grad;
var obj=this;
$(this).textgrad({spanize:spnz,maxGroup:mg,spanClass:spcl,debut:initColor,fin:initColor});
timer = window.setInterval(function() {
if(direction=='->'){
currStep+=step;
grad=[{pc:currStep-2*amplitude,col:endColor}
,{pc:currStep-amplitude,col:transColor}
,{pc:currStep,col:initColor}];}
else{
currStep-=step;
grad=[{pc:currStep,col:initColor}
,{pc:currStep+amplitude,col:transColor}
,{pc:currStep+2*amplitude,col:endColor}];}
$(obj).textgrad({spanize:-1,spanClass:spcl,colgrad:grad});
// End the process
if (currStep >= steps+1 || currStep<=-2*amplitude-1) {
if (unspnz>0){
$.unspanize(obj,spcl);}
window.clearInterval(timer);timer=null;
if (opt['cb'] && opt['cb'].constructor == Function) opt['cb'].call(obj);
}
},50);
});//EO each
};//EO textscan*/
/*EOP*/
})(jQuery);