﻿// MugTug v0.1
// AJAX Typography Schemer
// Design/Programming by Ulyses
// © 2006 TypeMill.com

function $(v) { return(document.getElementById(v)); }
function $S(v) { return(document.getElementById(v).style); }
function $T(v,i) { return((i?$(i):document).getElementsByTagName(v)); }
function $C(o,v) { var z=[], rx=new RegExp('\\b'+v+'\\b'), d=o.getElementsByTagName("*"); for(var i=0; i<d.length; i++) { if(rx.test(d[i].className)) z.push(d[i]); } return(z); }
function absPos(e) { var r={x:e.offsetLeft,y:e.offsetTop}; if(e.offsetParent) { var v=absPos(e.offsetParent); r.x+=v.x; r.y+=v.y; } return(r); }  
function browser(v) { return(Math.max(navigator.userAgent.toLowerCase().indexOf(v),0)); }
function cookieStab(f,v) { document.cookie=f+"="+v+"; path=/"; }
function cookieGrab(v) { var b=v+"=",d=document.cookie.split(';'); for(var i=0; i<d.length; i++) { var c=d[i]; while(c.charAt(0)==' ') c=c.substring(1,c.length); if(c.indexOf(b)==0) return(c.substring(b.length,c.length)); } }
function contains(a,b) { return(a.indexOf(b)!=-1?true:false); }
function isset(v) { return((typeof(v)=='undefined' || v.length==0)?false:true); }
function sexyTOG() { document.onclick=function(){ $S('sexyBG').display='none'; $S('sexyBOX').display='none'; document.onclick=function(){}; }; }
function sexyBOX(v,b) { setTimeout("sexyTOG()",100); $S('sexyBG').height=XYwin(0)+'px'; $S('sexyBG').display='block'; $('sexyBOX').innerHTML=v+'<div class="sexyX">(click outside box to close)'+"<\/div>"; $S('sexyBOX').left=Math.round((XYwin(1)-b)/2)+'px'; $S('sexyBOX').width=b+'px'; $S('sexyBOX').display='block'; }
function toggle(i,t,xy) { var v=$S(i); v.display=t?t:(v.display=='none'?'block':'none'); if(xy) { v.left=xy[0]; v.top=xy[1]; } }
function XY(e,v) { var z=browser('msie')?Array(event.clientX+document.body.scrollLeft,event.clientY+document.body.scrollTop):Array(e.pageX,e.pageY); return(v==3?z:z[zero(v)]); }
function XYwin(v) { var z=browser('msie')?Array(document.body.clientHeight,document.body.clientWidth):Array(window.innerHeight,window.innerWidth); return(isset(v)?z[v]:z); }
function zero(v) { v=parseInt(v); return(!isNaN(v)?v:0); }
function zindex(d) { d.style.zIndex=zINDEX++; }

/* REQUESTS */

function getFontList(r,v) { var z='';

    if(!r) { var o=$('uFonts'); if(typeof(o.GetVariable)!='undefined') { r=o.GetVariable('/:user_fonts'); } }

    if(r) { if(typeof(r)!='object') r=r.split(','); for(var i in r) { z+='<option style="font-family: '+r[i]+'; height: 17px;">'+r[i]+"<\/option>"; } }
 
    $(v?v:'youFont').innerHTML=z;

}

function mkSave(v) {

	if(!v) sexyBOX('<div style="FLOAT: left; CURSOR: pointer;" onclick="mkSave(\'del\')"><img src="media/cookie-128x128.png" style="width: 90px;"><br>DEL.ICIO.US'+"<\/div>"+'<div style="FLOAT: left; CURSOR: pointer;" onclick="mkSave(\'url\')"><img src="media/www-128x128.png" style="width: 90px;"><br>URL'+"<\/div>"+'<div style="FLOAT: left; CURSOR: pointer;" onclick="mkSave(\'css\')"><img src="media/style-sheet-128x128.png" style="width: 90px;"><br>CSS'+"<\/div><br style=\"clear:both\">",'300');
	else if(v=='css') sexyBOX('Here is your CSS:');
	else if(v=='url') sexyBOX('Here is your URL:'); 
	else if(v=='del') sexyBOX(''); 

}

function mkJack(v) { if(v.indexOf('LoadJack')!=-1) { var b=v.indexOf('LoadJack'); return(v.substr(b+9)?v.substr(b+9):null); } return false; }

/* ADJUSTMENTS */

function mkTime(v) { var z=new Date().getTime(v); return(z); }
function codeKey(e) { var k=(browser('msie') || browser('opera'))?e.kCode:e.which; return(Array(k,String.fromCharCode(k).toUpperCase())); }
function ghostKey(e,s) { var k=codeKey(e); if(!(contains("0123456789",k[1]) || (s && contains("ABCDEF",k[1])) || k[0]==0 || k[0]==8 || e.altKey || e.ctrlKey || e.metaKey)) return false; }
function runKey(s,e) { var k=codeKey(e); if((k[0]==38 || k[0]==40) && !stopKEY[1]) { stopKEY=Array('',mkTime()); stopKey(s,k[0]); } else setTimeout("mkStyle('"+s+"')",50); }
function stopKey(s,k) { if(!stopKEY[0]) { mkStyle(s,(k==40?-1:1)*(mkTime()-stopKEY[1]>1000?3:1),1); setTimeout("stopKey('"+s+"','"+k+"')",50); } }

/* BUILD */

function mkFace(v,n) { var z='', z1='', z2='';

	var r={'R':'regular','B':'bold','I':'italic','BI':'bold italic','S':'small-caps regular','SB':'small-caps bold','SI':'small-caps italic','SBI':'small-caps bold italic','U':'uppercase regular','UB':'uppercase bold','UI':'uppercase italic','UBI':'uppercase bold italic'};
	
	var s={'R':'Normal Typeface','B':'Bold Typeface, HTML is <b> or <strong>, CSS is FONT-WEIGHT: bold;','I':'Italic Typeface, HTML is <i>, CSS is FONT-STYLE: italic;','U':'Uppercase Typeface, CSS is TEXT-TRANSFORM: uppercase;','S':'Small-caps Typeface, CSS is FONT-VARIANT: small-caps;'};

	for(var i=1; i<=n; i++) { z1+='<td class="td'+i+'" onclick="colCurr('+i+')" valign="top">'+v+"<\/td>\n";
	
		z2+='<div onclick="colCurr(this)"'+(i==(cVAL=(cVAL>n?n:cVAL))?' id="colSel"':'')+'>'+i+"<\/div>\n";
		
	} $('columns').innerHTML=z2;

	for(var i in r) { var e=r[i].split(' '), b='', c='';
	
		for(var ii in e) { ii=e[ii].substr(0,1).toUpperCase(); b+='<div class="icon'+ii+'" title="'+s[ii]+'">'+ii+"<\/div><br>"; c+=' '+ii; }

		z+='<tr class="'+c.substr(1)+'"><td class="west" valign="top">'+b+"<\/td>"+z1+"<\/tr>\n";
		
	}

	return(z);

}

/* IMAGES */

function iconClick(t) { t.id=(t.id==t.className)?'':t.className; }

function iconMK(t) {

	function z(r) { for(var i in r) {  if($('icon'+r[i])) iconClick($('icon'+r[i])); } }
	
	z(['Left','Center','Right','Justify']);
	z(['Over','Under','Strike']);
	
	iconClick(t);

}

/* PLUGIN */

function cords(W) {

	var W2=W/2, rad=(hsv[0]/360)*(Math.PI*2), hyp=(hsv[1]+(100-hsv[2]))/100*(W2/2);

	$S('mCur').left=Math.round(Math.abs(Math.round(Math.sin(rad)*hyp)+W2+3))+'px';
	$S('mCur').top=Math.round(Math.abs(Math.round(Math.cos(rad)*hyp)-W2-21))+'px';

}

function coreXY(o,e,xy,z,fu) {

	function point(a,b,e) { eZ=XY(e,3); commit([eZ[0]+a,eZ[1]+b]); }
	function M(v,a,z) { return(Math.max(!isNaN(z)?z:0,!isNaN(a)?Math.min(a,v):v)); }

	function commit(v) { if(fu) fu(v);
	
		if(o=='mCur') { var W=parseInt($S('mSpec').width), W2=W/2, W3=W2/2; 

			var x=v[0]-W2-3, y=W-v[1]-W2+21, SV=Math.sqrt(Math.pow(x,2)+Math.pow(y,2)), hue=Math.atan2(x,y)/(Math.PI*2);

			hsv=[hue>0?(hue*360):((hue*360)+360), SV<W3?(SV/W3)*100:100, SV>=W3?Math.max(0,1-((SV-W3)/(W2-W3)))*100:100];

			$('mHEX').innerHTML=hsv2hex(hsv);
			$(colSwitch?'background':'color').value=$('mHEX').innerHTML;
			$S(colSwitch?'background':'color').background='#'+$('mHEX').innerHTML;
			mkStyle(colSwitch?'background':'color');
			
			cords(W);

		}
		else if(o=='mSize') { var b=Math.max(Math.max(v[0],v[1])+oH,75); cords(b);

			$S('mini').height=(b+28)+'px'; $S('mini').width=(b+20)+'px';
			$S('mSpec').height=b+'px'; $S('mSpec').width=b+'px';

		}
		else {
		
			if(xy) v=[M(v[0],xy[0],xy[2]), M(v[1],xy[1],xy[3])]; // XY LIMIT

			if(!xy || xy[0]) d.left=v[0]+'px'; if(!xy || xy[1]) d.top=v[1]+'px';

		}
	}

	if(stop) { stop=''; var d=$S(o), eZ=XY(e,3); if(!z) zindex($(o));

		if(o in {'sizeCurr':1,'mCur':1,'leadingCurr':1,'trackingCurr':1,'spacingCurr':1}) { var ab=absPos($(o).parentNode); point(-(ab['x']-xy[2]),-(ab['y']-xy[3]),e); }
		
		if(o=='mSize') { var oH=parseInt($S('mSpec').height), oX=-XY(e), oY=-XY(e,1); } else { var oX=parseInt(d.left)-eZ[0], oY=parseInt(d.top)-eZ[1]; }

		document.onmousemove=function(e){ if(!stop) point(oX,oY,e); };
		document.onmouseup=function(){ stop=1; if(win[o]) winCP(o,['block',zero(d.left)-winX,zero(d.top)]); document.onmousemove=''; document.onmouseup=''; };

	}
}

/* WINDOWS */

var win={};

function feedMill() {

	win={'mini':['block',321,110], 'adjust':['block',770,61], 'manager':['block',100,99]};

    if(r=cookieGrab('windows')) winMK(r); else winMK(winCP());

}

function tog(v,s,r) { if($(v)) { var o=$S(v),w=win[v]; s=(s&&isNaN(s))?s:(o.display=='block'?'none':'block');

	if(r && isNaN(r)) { o.left=r[0]+'px'; o.top=r[1]+'px'; } else if(w && o.display!=s) { winCP(v,[s,zero(o.left),r?win[v][2]:zero(o.top)]); }

	if(w) zindex($(v)); o.display=s; 

} }

function winCP(o,r) { var z=''; if(r) win[o]=r;

	for(var i in win) { z+=i+','+win[i][0]+','+win[i][1]+','+win[i][2]+':'; }

    if(r) cookieStab('windows',z); else return(z);

}

function winMK(r) { for(var i in r=r.split(':')) { if(r[i]) { var v=r[i].split(',');

	win[v[0]]=[v[1],v[2],v[3]]; tog(v[0],v[1],[parseInt(v[2])+winX,v[3]]);
    
} } }

/* FX */

function fadeOp(v,id,s,top) { var ob=$S(id), b=v/100; ob.opacity=b; ob.top=top+'px'; ob.MozOpacity=b; ob.KhtmlOpacity=b; ob.filter="alpha(opacity="+v+")"; }

function fade(id,ln,s) { var top=zero(parseInt($S(id).top));

    function opacity(oStart,oEnd,ln) { var speed=Math.round(ln/100),timer=0;
    
        if(oStart>oEnd) { for(i=oStart; i>=oEnd; i--) { setTimeout("fadeOp("+i+",'"+id+"','','"+(top--)+"')",timer*speed); timer++; } setTimeout("toggle('"+id+"','none')",timer*speed); }
        else if(oStart<oEnd) { toggle(id,'block'); for(i=oStart; i<=oEnd; i++) { setTimeout("fadeOp("+i+",'"+id+"','"+1+"','"+(top++)+"')",timer*speed); timer++; } }
  
    }

    if(!$S(id).opacity || $S(id).opacity!=s) if(s==0) opacity(100,0,ln); else if($S(id).opacity) opacity(0,100,ln);

}

/* CONVERSIONS */

function toHex(v) { v=Math.round(Math.min(Math.max(0,v),255)); return("0123456789ABCDEF".charAt((v-v%16)/16)+"0123456789ABCDEF".charAt(v%16)); }
function hex2rgb(r) { return({0:parseInt(r.substr(0,2),16),1:parseInt(r.substr(2,2),16),2:parseInt(r.substr(4,2),16)}); }
function rgb2hex(r) { return(toHex(r[0])+toHex(r[1])+toHex(r[2])); }
function hsv2hex(h) { return(rgb2hex(hsv2rgb(h))); }

function rgb2hsv(r) { // easyrgb.com/math.php?MATH=M20#text20

	var max=Math.max(r[0],r[1],r[2]),delta=max-Math.min(r[0],r[1],r[2]),H,S,V;
	
	if(max!=0) { S=Math.round(delta/max*100);

		if(r[0]==max) H=(r[1]-r[2])/delta; else if(r[1]==max) H=2+(r[2]-r[0])/delta; else if(r[2]==max) H=4+(r[0]-r[1])/delta;

		var H=Math.min(Math.round(H*60),360); if(H<0) H+=360;

	}

	return([H?H:0,S?S:0,Math.round((max/255)*100)]);

}

function hsv2rgb(r) { // easyrgb.com/math.php?MATH=M21#text21

    var R,B,G,S=r[1]/100,V=r[2]/100,H=r[0]/360;

    if(S>0) { if(H>=1) H=0;

        H=6*H; F=H-Math.floor(H);
        A=Math.round(255*V*(1.0-S));
        B=Math.round(255*V*(1.0-(S*F)));
        C=Math.round(255*V*(1.0-(S*(1.0-F))));
        V=Math.round(255*V); 

        switch(Math.floor(H)) {

            case 0: R=V; G=C; B=A; break;
            case 1: R=B; G=V; B=A; break;
            case 2: R=A; G=V; B=C; break;
            case 3: R=A; G=B; B=V; break;
            case 4: R=C; G=A; B=V; break;
            case 5: R=V; G=A; B=B; break;

        }

        return([R?R:0,G?G:0,B?B:0]);

    }
    else return([(V=Math.round(V*255)),V,V]);

}

/* GLOBALS */

var zINDEX=1000, hsv=[0,0,100];

function resize() { winX=zero((XYwin()[1]-zero($S('everything').width))/2); for(var i in win) { $S(i).left=(parseInt(win[i][1])+winX)+'px'; } }

if(window.addEventListener) window.addEventListener("resize",resize,false);

window.onscroll=resize;