// info_text_viewer.js: scrollbar demo, written by r0lZ September 2003
// Modified by Neonphytismo,
// Dude, your original goal can be achieved more simply, without emptying a whole magazine into the code:)
// ==PREPROCESSOR==
// @import "%fb2k_profile_path%\skins\foobaroid\Scrollbar\scrollbar.js"
// ==/PREPROCESSOR==

var _EnableDrag_ = true;
var _EnableWheel_ = true;
var _EnableKeyBoard_ = true;
var _DisposeUselessScrollbar_ = true;
var _AutoHideScrollbar_ = false;
var _ScrollbarAtLeftSide_ = false;
var _DrawBorder_ = false;

function RGBA(r, g, b, a) {return ((a << 24) | (r << 16) | (g << 8) | (b));}
function RGB(r, g, b) {return (0xff000000 | (r << 16) | (g << 8) | (b));}
function StringFormat(h_align,v_align,trimming,flags) {
    return ((h_align << 28) | (v_align << 24) | (trimming << 20) | flags);
}

var FP = fb.FoobarPath+"skins\\foobaroid\\Scrollbar\\"
var SI = [gdi.Image(FP+"up.png"),gdi.Image(FP+"down.png"),gdi.Image(FP+"slider.png")];;

DT_TOP = 0x00000000;
DT_LEFT = 0x00000000;
DT_CENTER = 0x00000001;
DT_RIGHT = 0x00000002;
DT_VCENTER = 0x00000004;
DT_BOTTOM = 0x00000008;
DT_END_ELLIPSIS = 0x00008000;
DT_SINGLELINE = 0x00000020;
DT_WORD_ELLIPSIS = 0x00040000;


MF_SEPARATOR = 0x00000800;
MF_ENABLED = 0x00000000;
MF_GRAYED = 0x00000001;
MF_DISABLED = 0x00000002;
MF_UNCHECKED = 0x00000000;
MF_CHECKED = 0x00000008;
MF_STRING = 0x00000000;
MF_POPUP = 0x00000010;

var tFormatK = DT_RIGHT | DT_VCENTER | DT_TOP | DT_SINGLELINE | DT_WORD_ELLIPSIS;
var tFormatV = StringFormat(0, 0, 0, 0x80000000);
var tFontV = gdi.Font("Meiryo", 12, 0);
var tFontK = gdi.Font("Segoe UI", 12, 1)
var tColor = RGB(0,0,0);
var tColor2 = 0xFFFFA500;//orange
var tf_Title,g_metadb;


var ww,wh;
function on_size(){
    ww = window.Width;
    wh = window.Height;
VPSize.w = window.Width;    // Size of the viewport
VPSize.h = window.Height;
InitViewport(false);
refresh_TF_info();
on_item_focus_change();
}

///////TF related part.///////
function on_playback_stop(reason){
if(reason==0){
refresh_TF_info();
window.Repaint();
}
}

function on_playback_new_track(info) {
on_item_focus_change();
refresh_TF_info();
}

function on_item_focus_change() {
if (g_metadb) window.UnwatchMetadb();
if (fb.IsPlaying || fb.IsPaused) g_metadb = fb.GetNowPlaying();
if (g_metadb) {
on_metadb_changed();
window.WatchMetadb(g_metadb);
}
}

function on_metadb_changed() {
window.Repaint();
}

var TFOriArr = [
"$caps2($trim($if2(%title%,'N/A')))",
"$caps2($trim($if2(%artist%,'N/A')))",
"$caps2($trim($if2(%album%,'N/A')))",
"$caps2($trim($if2(%album artist%,'N/A')))",
"$if2(%tracknumber%,'N/A')",
"$if2(%date%,'N/A')",
"$if2(%genre%,'N/A')",
"$if(%comment%,$fix_eol(%comment%),...)",
//////////////////////////////////////
"%codec%$if2(' ('%codec_profile%')',)",

"$put(desc,)$if($stricmp(%__codec%,MP3),$put(desc,'MPEG-1 Audio Layer 3'),)$if($stricmp(%__codec%,AAC),$put(desc,'Advanced Audio Coding'),)$if($stricmp(%__codec%,FLAC),$put(desc,'Free Lossless Audio Codec'),)$if($stricmp(%__codec%,ATSC A/52),$put(desc,'Dolby Digital AC3'),)$if($stricmp(%__codec%,Vorbis),$put(desc,$caps($ext(%_filename_ext%))' File'),)$if($stricmp(%__codec%,PCM),$put(desc,'Wave'),)$if($or($stricmp($ext(%_filename_ext%),mka),$stricmp($ext(%_filename_ext%),mkv)),$put(desc,'Matroska'),)$if($stricmp($cut(%__codec%,6),Monkey),$put(desc,'Lossless Audio Compressor'),)$if($stricmp(%__codec%,Musepack),$put(desc,'MPEGPlus/MP+'),)$if($stricmp(%__codec%,MP2),$put(desc,'MPEG-1 Audio Layer 2'),)$if($stricmp(%__codec%,CDDA),$put(desc,'CD Digital Audio'),)$if($stricmp(%__codec%,wma),$put(desc,'Windows Media Audio'),)$if($stricmp($get(desc),),$put(desc,$upper($ext(%_filename_ext% file))),)",

"%bitrate% 'KBPS'",
"%samplerate%' Hz'",
"$if($stricmp($codec(),MP3),$get(space2)$caps(%__mp3_stereo_mode%),$if(%__channels%,$ifgreater(%__channels%,1,Stereo,Mono),$if($strcmp(%__channels%,4),4 Ch,$sub(%__channels%,1)'.1' Ch)))",
"$if2(%length%, N/A)",
///////////////////////////////////////////
];

var TFNameArr = [
"Title","Artist","Album","Album Artist","Track No.","Date","Genre","Comment",
"Codec Profile","Codec","Bitrate","Samplerate","Channel","Length"
];
var nGroup = [];
for (var i=0;i< TFOriArr.length;i++){
nGroup[i] = new nItem(i);
}



function refresh_TF_info() {
if(fb.IsPlaying || fb.IsPaused){
for (var i=0;i<TFOriArr.length;i++){
nGroup[i].Value = fb.TitleFormat(TFOriArr[i]).Eval(true);
}
} else {
for (var i=0;i<TFOriArr.length;i++){
nGroup[i].Value ="";
}
}
}

var VerticalPadding = 10;
// nItem Object 
var NameX,TFX;
var NameWidth = 90;

function nItem(idx){
this.Key = TFNameArr[idx];
//this.Value = TF4Display[idx];

this.CalcPos = function(gr){
if (_DisposeUselessScrollbar_) {
TFWidth = VPSize.w-28;
TFX = 4;
} else {
TFWidth = VPSize.w-40;
TFX = _ScrollbarAtLeftSide_ ? 20 : 4;
}
this.Pos = GetStringInfo(gr, this.Value, tFontV, NameWidth, 0, TFWidth-NameWidth, window.Height, tFormatV);
//this.Pos.height += !this.Pos.height ? 18:0;
}

	this.draw = function(gr){
		gr.GdiDrawText(this.Key, tFontK, tColor2, NameX, this.Pos.y-deltaY, NameWidth, this.Pos.height, tFormatK);	
		gr.DrawString(this.Value, tFontV, tColor, NameWidth+TFX, this.Pos.y-deltaY, TFWidth-NameWidth, this.Pos.height, tFormatV);
        gr.DrawLine(0,this.Pos.y+this.Pos.height+VerticalPadding/2-deltaY,window.Width-20,this.Pos.y+this.Pos.height+VerticalPadding/2-deltaY,1,RGBA(70,70,70,70));
	}
}

function CalcLayOut(gr){
for (var i=0;i<nGroup.length;i++){
nGroup[i].CalcPos(gr);
}
nGroup[0].Pos.y = VerticalPadding;
for (var i=1;i<nGroup.length;i++) {
nGroup[i].Pos.y = nGroup[i-1].Pos.y + nGroup[i-1].Pos.height+VerticalPadding;
}
SumHeight = nGroup[nGroup.length-1].Pos.y+nGroup[nGroup.length-1].Pos.height;
}

function DrawGroup(gr){
for (var i=0;i<nGroup.length;i++){
nGroup[i].draw(gr);
}
}

function on_paint(gr) {
    gr.SetTextRenderingHint(5);
    CalcLayOut(gr);
    DrawGroup(gr);
    gr.FillSolidRect(0,SumHeight,ww,wh,RGB(255,255,255));
    gr.DrawLine(NameWidth+2,0,NameWidth+2,window.height,1,RGBA(70,70,70,70));
if(!fb.IsPaused&&!fb.IsPlaying)gr.FillSolidRect(0,0,ww,wh,RGB(255,255,255));
    PaintScrollBar(gr);
}




// Get String Information function //
function GetStringInfo(gr, AStr, AFont, AX, AY, AWidth, AHeight, Flags){
	var StringInfo;
    
	if (AWidth <=0 || AHeight <=0 || !AStr) {
StringInfo = {x : 0,y : 0,width : 0,height : 0,lines : 0,chars : 0}
    }
	else {
		/*
		var CI = gdi.CreateImage(window.Width, window.Height);	
		var g = CI.GetGraphics();		*/	
		var CI;
		if (!gr){
			CI = gdi.CreateImage(window.Width, window.Height);	
			gr = CI.GetGraphics();
		}//is this step necessary as well as efficient?
		var ms = gr.MeasureString(AStr, AFont, AX, AY, AWidth, AHeight, Flags);
		var StringInfo = {
				x : Math.ceil(ms.x),
				y : Math.ceil(ms.y),
				width : Math.ceil(ms.Width),
				height : Math.ceil(ms.Height),
				lines : ms.lines,
				chars : Math.ceil(ms.chars)		
		}
		
		if (CI){
			CI.ReleaseGraphics(gr);
			CI = null;
			CollectGarbage();			// Release memory.
		}		
	}
	return StringInfo;
}