<?php
/***********************
* pdf/UltimateScaleFinder.php
*------------------
* produce pdf of scale information in response to Flash UltimateScaleFinder app
*------------------
* 1.02 (joe h) 2010-Sep-31 (actual "date" reported) original version
* 1.03 (cheth) 2011-Jan-23 publish
* 1.04 (cheth) 2011-Jan-28 correct spelling of phrygian
*******************/

### get $pub_path path to public directory
include("../path.cfg.php");
require_once($inc_path . 'connect.inc');
# hide annoying deprecated errors
#error_reporting(error_reporting() & ~E_DEPRECATED);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
### get $pub_path path to Joe's dev directory

/********************************************
* Ultimate Scaler Finder
*   Required software: PDFlib/PDFlib+PDI/PPS 7
*   Joe Hurley
********************************************/

# -- Load Post Variables -- #
$st = $_REQUEST['st']; // ScaleType. Leave as "REQUEST" for better support with flash.
$rn = $_REQUEST['rn']; // RootNote Leave as "REQUEST" for better support with flash.
$imagePath = 'images'; // Image Path (Relative)
$scalePath = 'scales'; // Scale Path (Relative)
$date = getdate(); // Get Year For Copyright, Can't print until PDF builds.
$copyright = "COPYRIGHT &copy; ".$date['year']." GUITARTRICKS.COM";
$noteText = '(Displayed in the key of      )';

# -- IMPORTANT! Font Path -- #
//// You will need to enter the path of the font files "Eurostib.TTF" & "Eurosti.TTF".
//// Since most PDFlib installs use a relative path from the PHP extensions folder, I would stick to absolute paths.
//// This first loads the fonts using the default winansi character encoding. However after loading, it's converts to Unicode
$fontpath1 = $pub_path . 'pdf/fonts/Eurostib.TTF'; // Bold
$fontpath2 = $pub_path . 'pdf/fonts/Eurosti.TTF'; // Regular


# -- Sanitize Post/Get Variables -- #
if($st!="major"&&$st!="minor"&&$st!="pentatonic-major"&&$st!="pentatonic-minor"&&$st!="blues-scales"&&$st!="dorian"&&$st!="phrygian"&&$st!="lydian"&&$st!="mixolydian"&&$st!="locrian"&&$st!="harmonic-minor"&&$st!="phrygian-dominant"&&$st!="dorian-blues-scale"&&$st!="harmonic-major"&&$st!="jazz-minor"&&$st!="lydian-dominant"&&$st!="super-locrian"&&$st!="wholetone"&&$st!="half-whole-diminished"&&$st!="whole-half-diminished"){
	$e="Incorrect Scale Type";
	die($e);
}
$noteref="";
if($rn!="A"&&$rn!="Asharp"&&$rn!="B"&&$rn!="Bsharp"&&$rn!="C"&&$rn!="Csharp"&&$rn!="D"&&$rn!="Dsharp"&&$rn!="Esharp"&&$rn!="E"&&$rn!="F"&&$rn!="Fsharp"&&$rn!="G"&&$rn!="Gsharp"&&$rn!="Aflat"&&$rn!="Bflat"&&$rn!="Cflat"&&$rn!="Dflat"&&$rn!="Eflat"&&$rn!="Fflat"&&$rn!="Gflat"){
	$e="Incorrect Root Note";
	die($e);
}
if($st==""||$rn==""){
	$e="PDFlib exception occurred.\n<br />Scale Type, Root Note and Layout variables must be loaded";
	die($e);
}

# -- Load current scale type data -- #
include('scales/'.$st.'.php'); // Scale Includes
switch ($rn) {
	case "A" : $note = "A";  break;
	case "B" : $note = "B";  break;
	case "C" : $note = "C";  break;
	case "D" : $note = "D";  break;
	case "E" : $note = "E";  break;
	case "F" : $note = "F";  break;
	case "G" : $note = "G";  break;
	//// Auto correcting the (flat & sharp) notes to math the key ////
	case "Cflat" : if(empty($nl[$rn][0])){$rn="B";$note="B";} else {$note="C";$noteref="b";} break;
	case "Csharp" :if(empty($nl[$rn][0])){$rn="Dflat";$note="D";$noteref="b";} else {$note="C";$noteref="#";} break;
	case "Dflat" : if(empty($nl[$rn][0])){$rn="Csharp";$note="C";$noteref="#";} else {$note="D";$noteref="b";} break;
	case "Dsharp" : if(empty($nl[$rn][0])){$rn="Eflat";$note="E";$noteref="b";} else {$note="D";$noteref="#";} break;
	case "Eflat" : if(empty($nl[$rn][0])){$rn="Dsharp";$note="D";$noteref="#";} else {$note="E";$noteref="b";} break;
	case "Esharp" : if(empty($nl[$rn][0])){$rn="F";$note="F";} else {$note="E";$noteref="#";} break;
	case "Fflat" : if(empty($nl[$rn][0])){$rn="E";$note="E";} else {$note="F";$noteref="b";} break;
	case "Fsharp" : if(empty($nl[$rn][0])){$rn="Gflat";$note="G";$noteref="b";} else {$note="F";$noteref="#";} break;
	case "Gflat" : if(empty($nl[$rn][0])){$rn="Fsharp";$note="F";$noteref="#";} else {$note="G";$noteref="b";} break;
	case "Gsharp" : if(empty($nl[$rn][0])){$rn="Aflat";$note="A";$noteref="b";} else {$note="G";$noteref="#";} break;
	case "Aflat" : if(empty($nl[$rn][0])){$rn="Gsharp";$note="G";$noteref="#";} else {$note="A";$noteref="b";} break;
	case "Asharp" : if(empty($nl[$rn][0])){$rn="B";$note="B";} else {$note="A";$noteref="#";} break;
	case "Bflat" : if(empty($nl[$rn][0])){$rn="Asharp";$note="A";$noteref="#";} else {$note="B";$noteref="b";} break;
	case "Bsharp" : if(empty($nl[$rn][0])){$rn="C";$note="C";} else {$note="B";$noteref="#";} break;
}

    # -- File Loader -- #
function read_file($fname) {
	$fp = fopen($fname, "r");
	$data = fread ($fp, filesize($fname));
	fclose($fp);
	return $data;
}

# -- This is just used as a back up if PDFlib can't find the scale images -- #
$searchpath = $imagePath;

# -- Start Document -- #
$optlist = "viewerpreferences={hidewindowui=false fitwindow=false} ";//pagelayout=singlepage
try {
$p = new PDFlib();

$p->set_option("license=LA00102-010021-145288-65GJH2-KFEY27");
$p->set_option("SearchPath=$searchpath");
$p->set_option("errorpolicy=return");
if ($p->begin_document("", $optlist) == 0) {
	die("Error: " .  $p->get_errmsg());
}
$p->set_info("Creator", "Joe Hurley - GuitarTricks.com");
$p->set_info("Title", "Ultimate Scale Finder - GuitarTricks.com");

$Header = read_file("images/BG.png");$p->create_pvf("/pvf/BG", $Header, "");$Header = $p->load_image("auto", "/pvf/BG", "");
$Logo = read_file("images/logo.png");$p->create_pvf("/pvf/Logo", $Logo, "");$Logo = $p->load_image("auto", "/pvf/Logo", "");
$ChordBody1 = read_file("images/ChordBody.png");$p->create_pvf("/pvf/ChordBody1", $ChordBody1, "");$ChordBody1 = $p->load_image("auto", "/pvf/ChordBody1", "");
$ChordBody2 = read_file("images/ChordBody.png");$p->create_pvf("/pvf/ChordBody2", $ChordBody2, "");$ChordBody2 = $p->load_image("auto", "/pvf/ChordBody2", "");
$ChordBody3 = read_file("images/ChordBody.png");$p->create_pvf("/pvf/ChordBody3", $ChordBody3, "");$ChordBody3 = $p->load_image("auto", "/pvf/ChordBody3", "");
$ChordBody4 = read_file("images/ChordBody.png");$p->create_pvf("/pvf/ChordBody4", $ChordBody4, "");$ChordBody4 = $p->load_image("auto", "/pvf/ChordBody4", "");
$ChordBody5 = read_file("images/ChordBody.png");$p->create_pvf("/pvf/ChordBody5", $ChordBody5, "");$ChordBody5 = $p->load_image("auto", "/pvf/ChordBody5", "");
$ChordBodyOpen = read_file("images/ChordBodyOpen.png");$p->create_pvf("/pvf/ChordBodyOpen", $ChordBodyOpen, "");$ChordBodyOpen= $p->load_image("auto", "/pvf/ChordBodyOpen", "");
$bottom = read_file("images/bottom.png");$p->create_pvf("/pvf/bottom", $bottom, "");$bottom = $p->load_image("auto", "/pvf/bottom", "");
$DotOn = read_file("images/DotOn.png");$p->create_pvf("/pvf/DotOn", $DotOn, "");$DotOn = $p->load_image("auto", "/pvf/DotOn", "");
$DotOff = read_file("images/DotOff.png");$p->create_pvf("/pvf/DotOff", $DotOff, "");$DotOff = $p->load_image("auto", "/pvf/DotOff", "");
$DotO["O"] = read_file("images/DotOff.png");$p->create_pvf("/pvf/DotOO", $DotO["O"], "");$DotO["O"] = $p->load_image("auto", "/pvf/DotOO", "");
$DotO["R"] = read_file("images/DotOn.png");$p->create_pvf("/pvf/DotOR", $DotO["R"], "");$DotO["R"] = $p->load_image("auto", "/pvf/DotOR", "");

# -- Load Eurostile Fonts -- #
$p->set_option("FontOutline={Eurostib=$fontpath1}");
$font = $p->load_font("Eurostib", "winansi", "embedding");
if ($font == 0) {
	die("Error: " . $p->get_errmsg());
}
$p->set_option("FontOutline={Eurosti=$fontpath2}");
$font2 = $p->load_font("Eurosti", "winansi", "embedding");
if ($font2 == 0) {
	die("Error: " . $p->get_errmsg());
}

# -- Main images -- #
$sc = "scale=0.5";
$sclogo = "scale=0.5 matchbox={name=gt2}";
$p->begin_page_ext(0, 0, "width=a4.width height=a4.height");
$p->fit_image($Header, 0.5, 1.5, $sc);
$p->fit_image($bottom, 0.5, 0, $sc);


# -- Fret Numbers -- #
$pf1 = $PatternFrets[0]-1;
$pf2 = $PatternFrets[1]-1;
$pf3 = $PatternFrets[2]-1;
$pf4 = $PatternFrets[3]-1;
$pf5 = $PatternFrets[4]-1;

for ($i = 0; $i <= 11; $i++) {
	$pf1++;$pf2++;$pf3++;$pf4++;$pf5++;
	if($pf1 == 12){$pf1 = 0;}if($pf2 == 12){$pf2 = 0;}if($pf3 == 12){$pf3 = 0;}if($pf4 == 12){$pf4 = 0;}if($pf5 == 12){$pf5 = 0;} // Set 12th fret to open pattern
	$PatternFretsb[$i] = array($pf1,$pf2,$pf3,$pf4,$pf5);
}
switch ($rn) {
	case "A" :
	$Frets = $PatternFretsb[0];  break;
	case "Asharp" :
	case "Bflat" :
	$Frets = $PatternFretsb[1];  break;
	case "B" :
	case "Cflat" :
	$Frets = $PatternFretsb[2];  break;
	case "C" :
	$Frets = $PatternFretsb[3];  break;
	case "Csharp" :
	case "Dflat" :
	$Frets = $PatternFretsb[4];  break;
	case "D" :
	$Frets = $PatternFretsb[5];  break;
	case "Dsharp" :
	case "Eflat" :
	$Frets = $PatternFretsb[6];  break;
	case "E" :
	case "Fflat" :
	$Frets = $PatternFretsb[7];  break;
	case "F" :
	$Frets = $PatternFretsb[8];  break;
	case "Fsharp" :
	case "Gflat" :
	$Frets = $PatternFretsb[9];  break;
	case "G" :
	$Frets = $PatternFretsb[10];  break;
	case "Gsharp" :
	case "Aflat" :
	$Frets = $PatternFretsb[11];  break;
}
$FretPattern1 = $Frets[0];
$FretPattern2 = $Frets[1];
$FretPattern3 = $Frets[2];
$FretPattern4 = $Frets[3];
$FretPattern5 = $Frets[4];
if ($Frets[0]!=0){$p->fit_image($ChordBody1, 66, 469, $sc);}
if ($Frets[0]==0){$p->fit_image($ChordBodyOpen, 66, 469, $sc);}
if ($Frets[1]!=0){$p->fit_image($ChordBody2, 328, 409, $sc);}
if ($Frets[1]==0){$p->fit_image($ChordBodyOpen, 328, 409, $sc);}
if ($Frets[2]!=0){$p->fit_image($ChordBody3, 66, 269, $sc);}
if ($Frets[2]==0){$p->fit_image($ChordBodyOpen, 66, 269, $sc);}
if ($Frets[3]!=0){$p->fit_image($ChordBody4, 328, 169, $sc);}
if ($Frets[3]==0){$p->fit_image($ChordBodyOpen, 328, 169, $sc);}
if ($Frets[4]!=0){$p->fit_image($ChordBody5, 66, 60, $sc);}
if ($Frets[4]==0){$p->fit_image($ChordBodyOpen, 66, 60, $sc);}


# -- Dot Overlays -- #
//// Would have been nice to build a loop here but each note has it's own coordinates.
//// Pattern 1
if($p1[0]!='-'){$p->fit_image($DotO[$p1[0]], 97, 605, $sc);}//// Row 1
if($p1[1]!='-'){$p->fit_image($DotO[$p1[1]], 128, 605, $sc);}
if($p1[2]!='-'){$p->fit_image($DotO[$p1[2]], 158, 605, $sc);}
if($p1[3]!='-'){$p->fit_image($DotO[$p1[3]], 189, 605, $sc);}
if($p1[4]!='-'){$p->fit_image($DotO[$p1[4]], 221, 605, $sc);}
if($p1[5]!='-'){$p->fit_image($DotO[$p1[5]], 97, 581, $sc);}//// Row 2
if($p1[6]!='-'){$p->fit_image($DotO[$p1[6]], 128, 581, $sc);}
if($p1[7]!='-'){$p->fit_image($DotO[$p1[7]], 158, 581, $sc);}
if($p1[8]!='-'){$p->fit_image($DotO[$p1[8]], 189, 581, $sc);}
if($p1[9]!='-'){$p->fit_image($DotO[$p1[9]], 221, 581, $sc);}
if($p1[10]!='-'){$p->fit_image($DotO[$p1[10]], 97, 555, $sc);}//// Row 3
if($p1[11]!='-'){$p->fit_image($DotO[$p1[11]], 128, 555, $sc);}
if($p1[12]!='-'){$p->fit_image($DotO[$p1[12]], 158, 555, $sc);}
if($p1[13]!='-'){$p->fit_image($DotO[$p1[13]], 189, 555, $sc);}
if($p1[14]!='-'){$p->fit_image($DotO[$p1[14]], 221, 555, $sc);}
if($p1[15]!='-'){$p->fit_image($DotO[$p1[15]], 97, 533, $sc);}//// Row 4
if($p1[16]!='-'){$p->fit_image($DotO[$p1[16]], 128, 533, $sc);}
if($p1[17]!='-'){$p->fit_image($DotO[$p1[17]], 158, 533, $sc);}
if($p1[18]!='-'){$p->fit_image($DotO[$p1[18]], 189, 533, $sc);}
if($p1[19]!='-'){$p->fit_image($DotO[$p1[19]], 221, 533, $sc);}
if($p1[20]!='-'){$p->fit_image($DotO[$p1[20]], 97, 507, $sc);}//// Row 5
if($p1[21]!='-'){$p->fit_image($DotO[$p1[21]], 128, 507, $sc);}
if($p1[22]!='-'){$p->fit_image($DotO[$p1[22]], 158, 507, $sc);}
if($p1[23]!='-'){$p->fit_image($DotO[$p1[23]], 189, 507, $sc);}
if($p1[24]!='-'){$p->fit_image($DotO[$p1[24]], 221, 507, $sc);}
if($p1[25]!='-'){$p->fit_image($DotO[$p1[25]], 97, 481, $sc);}//// Row 6
if($p1[26]!='-'){$p->fit_image($DotO[$p1[26]], 128, 481, $sc);}
if($p1[27]!='-'){$p->fit_image($DotO[$p1[27]], 158, 481, $sc);}
if($p1[28]!='-'){$p->fit_image($DotO[$p1[28]], 189, 481, $sc);}
if($p1[29]!='-'){$p->fit_image($DotO[$p1[29]], 221, 481, $sc);}
//// Pattern 2
if($p2[0]!='-'){$p->fit_image($DotO[$p2[0]], 358, 545, $sc);}//// Row 1
if($p2[1]!='-'){$p->fit_image($DotO[$p2[1]], 390, 545, $sc);}
if($p2[2]!='-'){$p->fit_image($DotO[$p2[2]], 420, 545, $sc);}
if($p2[3]!='-'){$p->fit_image($DotO[$p2[3]], 451, 545, $sc);}
if($p2[4]!='-'){$p->fit_image($DotO[$p2[4]], 483, 545, $sc);}
if($p2[5]!='-'){$p->fit_image($DotO[$p2[5]], 358, 521, $sc);}//// Row 2
if($p2[6]!='-'){$p->fit_image($DotO[$p2[6]], 390, 521, $sc);}
if($p2[7]!='-'){$p->fit_image($DotO[$p2[7]], 420, 521, $sc);}
if($p2[8]!='-'){$p->fit_image($DotO[$p2[8]], 451, 521, $sc);}
if($p2[9]!='-'){$p->fit_image($DotO[$p2[9]], 483, 521, $sc);}
if($p2[10]!='-'){$p->fit_image($DotO[$p2[10]], 358, 495, $sc);}//// Row 3
if($p2[11]!='-'){$p->fit_image($DotO[$p2[11]], 390, 495, $sc);}
if($p2[12]!='-'){$p->fit_image($DotO[$p2[12]], 420, 495, $sc);}
if($p2[13]!='-'){$p->fit_image($DotO[$p2[13]], 451, 495, $sc);}
if($p2[14]!='-'){$p->fit_image($DotO[$p2[14]], 483, 495, $sc);}
if($p2[15]!='-'){$p->fit_image($DotO[$p2[15]], 358, 473, $sc);}//// Row 4
if($p2[16]!='-'){$p->fit_image($DotO[$p2[16]], 390, 473, $sc);}
if($p2[17]!='-'){$p->fit_image($DotO[$p2[17]], 420, 473, $sc);}
if($p2[18]!='-'){$p->fit_image($DotO[$p2[18]], 451, 473, $sc);}
if($p2[19]!='-'){$p->fit_image($DotO[$p2[19]], 483, 473, $sc);}
if($p2[20]!='-'){$p->fit_image($DotO[$p2[20]], 358, 447, $sc);}//// Row 5
if($p2[21]!='-'){$p->fit_image($DotO[$p2[21]], 390, 447, $sc);}
if($p2[22]!='-'){$p->fit_image($DotO[$p2[22]], 420, 447, $sc);}
if($p2[23]!='-'){$p->fit_image($DotO[$p2[23]], 451, 447, $sc);}
if($p2[24]!='-'){$p->fit_image($DotO[$p2[24]], 483, 447, $sc);}
if($p2[25]!='-'){$p->fit_image($DotO[$p2[25]], 358, 421, $sc);}//// Row 6
if($p2[26]!='-'){$p->fit_image($DotO[$p2[26]], 390, 421, $sc);}
if($p2[27]!='-'){$p->fit_image($DotO[$p2[27]], 420, 421, $sc);}
if($p2[28]!='-'){$p->fit_image($DotO[$p2[28]], 451, 421, $sc);}
if($p2[29]!='-'){$p->fit_image($DotO[$p2[29]], 483, 421, $sc);}
//// Pattern 3
if($p3[0]!='-'){$p->fit_image($DotO[$p3[0]], 97, 405, $sc);}//// Row 1
if($p3[1]!='-'){$p->fit_image($DotO[$p3[1]], 128, 405, $sc);}
if($p3[2]!='-'){$p->fit_image($DotO[$p3[2]], 158, 405, $sc);}
if($p3[3]!='-'){$p->fit_image($DotO[$p3[3]], 189, 405, $sc);}
if($p3[4]!='-'){$p->fit_image($DotO[$p3[4]], 221, 405, $sc);}
if($p3[5]!='-'){$p->fit_image($DotO[$p3[5]], 97, 381, $sc);}//// Row 2
if($p3[6]!='-'){$p->fit_image($DotO[$p3[6]], 128, 381, $sc);}
if($p3[7]!='-'){$p->fit_image($DotO[$p3[7]], 158, 381, $sc);}
if($p3[8]!='-'){$p->fit_image($DotO[$p3[8]], 189, 381, $sc);}
if($p3[9]!='-'){$p->fit_image($DotO[$p3[9]], 221, 381, $sc);}
if($p3[10]!='-'){$p->fit_image($DotO[$p3[10]], 97, 355, $sc);}//// Row 3
if($p3[11]!='-'){$p->fit_image($DotO[$p3[11]], 128, 355, $sc);}
if($p3[12]!='-'){$p->fit_image($DotO[$p3[12]], 158, 355, $sc);}
if($p3[13]!='-'){$p->fit_image($DotO[$p3[13]], 189, 355, $sc);}
if($p3[14]!='-'){$p->fit_image($DotO[$p3[14]], 221, 355, $sc);}
if($p3[15]!='-'){$p->fit_image($DotO[$p3[15]], 97, 333, $sc);}//// Row 4
if($p3[16]!='-'){$p->fit_image($DotO[$p3[16]], 128, 333, $sc);}
if($p3[17]!='-'){$p->fit_image($DotO[$p3[17]], 158, 333, $sc);}
if($p3[18]!='-'){$p->fit_image($DotO[$p3[18]], 189, 333, $sc);}
if($p3[19]!='-'){$p->fit_image($DotO[$p3[19]], 221, 333, $sc);}
if($p3[20]!='-'){$p->fit_image($DotO[$p3[20]], 97, 307, $sc);}//// Row 5
if($p3[21]!='-'){$p->fit_image($DotO[$p3[21]], 128, 307, $sc);}
if($p3[22]!='-'){$p->fit_image($DotO[$p3[22]], 158, 307, $sc);}
if($p3[23]!='-'){$p->fit_image($DotO[$p3[23]], 189, 307, $sc);}
if($p3[24]!='-'){$p->fit_image($DotO[$p3[24]], 221, 307, $sc);}
if($p3[25]!='-'){$p->fit_image($DotO[$p3[25]], 97, 281, $sc);}//// Row 6
if($p3[26]!='-'){$p->fit_image($DotO[$p3[26]], 128, 281, $sc);}
if($p3[27]!='-'){$p->fit_image($DotO[$p3[27]], 158, 281, $sc);}
if($p3[28]!='-'){$p->fit_image($DotO[$p3[28]], 189, 281, $sc);}
if($p3[29]!='-'){$p->fit_image($DotO[$p3[29]], 221, 281, $sc);}
//// Pattern 4
if($p4[0]!='-'){$p->fit_image($DotO[$p4[0]], 358, 305, $sc);}//// Row 1
if($p4[1]!='-'){$p->fit_image($DotO[$p4[1]], 390, 305, $sc);}
if($p4[2]!='-'){$p->fit_image($DotO[$p4[2]], 420, 305, $sc);}
if($p4[3]!='-'){$p->fit_image($DotO[$p4[3]], 451, 305, $sc);}
if($p4[4]!='-'){$p->fit_image($DotO[$p4[4]], 483, 305, $sc);}
if($p4[5]!='-'){$p->fit_image($DotO[$p4[5]], 358, 281, $sc);}//// Row 2
if($p4[6]!='-'){$p->fit_image($DotO[$p4[6]], 390, 281, $sc);}
if($p4[7]!='-'){$p->fit_image($DotO[$p4[7]], 420, 281, $sc);}
if($p4[8]!='-'){$p->fit_image($DotO[$p4[8]], 451, 281, $sc);}
if($p4[9]!='-'){$p->fit_image($DotO[$p4[9]], 483, 281, $sc);}
if($p4[10]!='-'){$p->fit_image($DotO[$p4[10]], 358, 255, $sc);}//// Row 3
if($p4[11]!='-'){$p->fit_image($DotO[$p4[11]], 390, 255, $sc);}
if($p4[12]!='-'){$p->fit_image($DotO[$p4[12]], 420, 255, $sc);}
if($p4[13]!='-'){$p->fit_image($DotO[$p4[13]], 451, 255, $sc);}
if($p4[14]!='-'){$p->fit_image($DotO[$p4[14]], 483, 255, $sc);}
if($p4[15]!='-'){$p->fit_image($DotO[$p4[15]], 358, 233, $sc);}//// Row 4
if($p4[16]!='-'){$p->fit_image($DotO[$p4[16]], 390, 233, $sc);}
if($p4[17]!='-'){$p->fit_image($DotO[$p4[17]], 420, 233, $sc);}
if($p4[18]!='-'){$p->fit_image($DotO[$p4[18]], 451, 233, $sc);}
if($p4[19]!='-'){$p->fit_image($DotO[$p4[19]], 483, 233, $sc);}
if($p4[20]!='-'){$p->fit_image($DotO[$p4[20]], 358, 207, $sc);}//// Row 5
if($p4[21]!='-'){$p->fit_image($DotO[$p4[21]], 390, 207, $sc);}
if($p4[22]!='-'){$p->fit_image($DotO[$p4[22]], 420, 207, $sc);}
if($p4[23]!='-'){$p->fit_image($DotO[$p4[23]], 451, 207, $sc);}
if($p4[24]!='-'){$p->fit_image($DotO[$p4[24]], 483, 207, $sc);}
if($p4[25]!='-'){$p->fit_image($DotO[$p4[25]], 358, 181, $sc);}//// Row 6
if($p4[26]!='-'){$p->fit_image($DotO[$p4[26]], 390, 181, $sc);}
if($p4[27]!='-'){$p->fit_image($DotO[$p4[27]], 420, 181, $sc);}
if($p4[28]!='-'){$p->fit_image($DotO[$p4[28]], 451, 181, $sc);}
if($p4[29]!='-'){$p->fit_image($DotO[$p4[29]], 483, 181, $sc);}
//// Pattern 5
if($p5[0]!='-'){$p->fit_image($DotO[$p5[0]], 97, 199, $sc);}//// Row 1
if($p5[1]!='-'){$p->fit_image($DotO[$p5[1]], 128, 199, $sc);}
if($p5[2]!='-'){$p->fit_image($DotO[$p5[2]], 158, 199, $sc);}
if($p5[3]!='-'){$p->fit_image($DotO[$p5[3]], 189, 199, $sc);}
if($p5[4]!='-'){$p->fit_image($DotO[$p5[4]], 220, 199, $sc);}
if($p5[5]!='-'){$p->fit_image($DotO[$p5[5]], 97, 175, $sc);}//// Row 2
if($p5[6]!='-'){$p->fit_image($DotO[$p5[6]], 128, 175, $sc);}
if($p5[7]!='-'){$p->fit_image($DotO[$p5[7]], 158, 175, $sc);}
if($p5[8]!='-'){$p->fit_image($DotO[$p5[8]], 189, 175, $sc);}
if($p5[9]!='-'){$p->fit_image($DotO[$p5[9]], 220, 175, $sc);}
if($p5[10]!='-'){$p->fit_image($DotO[$p5[10]], 97, 150, $sc);}//// Row 3
if($p5[11]!='-'){$p->fit_image($DotO[$p5[11]], 128, 150, $sc);}
if($p5[12]!='-'){$p->fit_image($DotO[$p5[12]], 158, 150, $sc);}
if($p5[13]!='-'){$p->fit_image($DotO[$p5[13]], 189, 150, $sc);}
if($p5[14]!='-'){$p->fit_image($DotO[$p5[14]], 220, 150, $sc);}
if($p5[15]!='-'){$p->fit_image($DotO[$p5[15]], 97, 126, $sc);}//// Row 4
if($p5[16]!='-'){$p->fit_image($DotO[$p5[16]], 128, 126, $sc);}
if($p5[17]!='-'){$p->fit_image($DotO[$p5[17]], 158, 126, $sc);}
if($p5[18]!='-'){$p->fit_image($DotO[$p5[18]], 189, 126, $sc);}
if($p5[19]!='-'){$p->fit_image($DotO[$p5[19]], 220, 126, $sc);}
if($p5[20]!='-'){$p->fit_image($DotO[$p5[20]], 97, 102, $sc);}//// Row 5
if($p5[21]!='-'){$p->fit_image($DotO[$p5[21]], 128, 102, $sc);}
if($p5[22]!='-'){$p->fit_image($DotO[$p5[22]], 158, 102, $sc);}
if($p5[23]!='-'){$p->fit_image($DotO[$p5[23]], 189, 102, $sc);}
if($p5[24]!='-'){$p->fit_image($DotO[$p5[24]], 220, 102, $sc);}
if($p5[25]!='-'){$p->fit_image($DotO[$p5[25]], 97, 75, $sc);}//// Row 6
if($p5[26]!='-'){$p->fit_image($DotO[$p5[26]], 128, 75, $sc);}
if($p5[27]!='-'){$p->fit_image($DotO[$p5[27]], 158, 75, $sc);}
if($p5[28]!='-'){$p->fit_image($DotO[$p5[28]], 189, 75, $sc);}
if($p5[29]!='-'){$p->fit_image($DotO[$p5[29]], 220, 75, $sc);}

# -- Text Options -- #
if($noteref=="#"||$noteref=="b"){$refsize="12";}
else{$refsize="16";}
$optA = "verticalalign=justify linespreadlimit=120% ";
$optB = "alignment=center linespreadlimit=120% ";
$optst = "fontname=Eurostib ".$tos." position=left fitmethod=meet encoding=unicode embedding=TRUE " . "position={center bottom} fillcolor={cmyk 0.20 0.90 0.85 0.10}  charref";
$optsp = "fontname=Eurosti fontsize=13 encoding=unicode embedding=TRUE " . "fillcolor={cmyk 0 0 0 0} alignment=center charref";
$optnt1 = "fontname=Eurostib fontsize=15 encoding=unicode embedding=TRUE " . "boxsize={150 75} position=right fitmethod=meet fillcolor={cmyk 0.18 0.18 0.23 0}  charref";
$optnt1b = "fontname=Eurostib fontsize=".$refsize." encoding=unicode embedding=TRUE " . "position={center bottom} fillcolor={cmyk 0.20 0.90 0.85 0.10}  charref";
$optnt2 = "fontname=Eurostib fontsize=25 encoding=unicode embedding=TRUE " . "position={center bottom} fillcolor={cmyk 0.18 0.18 0.23 0} charref charspacing=5";
$optcr = "fontname=Eurosti fontsize=10 encoding=unicode embedding=TRUE " . "fillcolor={cmyk 0 0 0 0} charref";
$optpat = "fontname=Eurostib fontsize=25 encoding=unicode embedding=TRUE " . "fillcolor={cmyk 1 1 1 1}  charref";
$optban2 = "fontname=Eurostib fontsize=18 encoding=unicode embedding=TRUE matchbox={name=gt} showborder=false strokewidth=.5 textrendering=0 " . "fillcolor={cmyk 0 0 0 0}  strokecolor={cmyk 0.28 0.27 0.33 0} charref";
$optfret = "fontname=Eurostib fontsize=11 encoding=unicode embedding=TRUE " . "fillcolor={cmyk 1 1 1 1} charref";

# -- Force Unicode Encoding -- #
$p->set_option("errorpolicy=return");

# -- Note Table -- #
$tf=0; $tbl=0;
$rowmax = 1; $colmax = $scaleLength;
$llx=33; $lly=646.5; $urx=555; $ury=710;
$optlist = "fittextline={position=center font=" . $font . " fontsize=10 fillcolor={cmyk 0.18 0.18 0.23 0}} " . " margin=3 rowheight=12 colwidth=50";
$optlist2 = "fittextline={position=center font=" . $font . " fontsize=13  fillcolor={cmyk .24 .65 .50 0}} " . " margin=3 rowheight=17 colwidth=".round(300/$scaleLength);
$optlist2b = "fittextline={position=center font=" . $font . " fontsize=13  fillcolor={cmyk 0 0 0 0}} " . " margin=3 rowheight=17 colwidth=".round(300/$scaleLength);
$p->set_option("errorpolicy=return");
$p->set_option("SearchPath=$searchpath");
//// Row 1
$row = 1;
$col = 1; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][0] ?? '', $optlist2b);
$col = 2; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][1] ?? '', $optlist2);
$col = 3; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][2] ?? '', $optlist2);
$col = 4; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][3] ?? '', $optlist2);
if($scaleLength > 4){$col = 5; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][4] ?? '', $optlist2);}
if($scaleLength > 5){$col = 6; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][5] ?? '', $optlist2);}
if($scaleLength > 6){$col = 7; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][6] ?? '', $optlist2);}
if($scaleLength > 7){$col = 8; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][7] ?? '', $optlist2);}
if($scaleLength > 8){$col = 9; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][8] ?? '', $optlist2);}
if($scaleLength > 9){$col = 10; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][9] ?? '', $optlist2);}
if($scaleLength > 10){$col = 11; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][10] ?? '', $optlist2);}
if($scaleLength > 11){$col = 12; $tbl = $p->add_table_cell($tbl, $col, $row, $nl[$rn][11] ?? '', $optlist2);}


$optlist = "header=0
fill = {{area=col1 fillcolor={cmyk 0.17 0.90 0.83 0}}
{area=colother fillcolor={cmyk 0 0 0 0}}}
	stroke={{line=hor1 linewidth=0.7 strokecolor={cmyk 0.18 0.18 0.23 0}}
		{line=horother linewidth=0.7 strokecolor={cmyk 0.09 0.09 0.12 0}}
		{line=vertfirst linewidth=0.7 strokecolor={cmyk 0.2 0.2 0.2 0}}
		{line=vert3 linewidth=0.7 strokecolor={cmyk 0.2 0.2 0.2 0}}
		{line=vert4 linewidth=0.7 strokecolor={cmyk 0.18 0.18 0.23 0}}
		{line=vertlast linewidth=0.7 strokecolor={cmyk 0.18 0.18 0.23 0}}
	{line=vertother linewidth=0.7 strokecolor={cmyk 0.09 0.09 0.09 0}}}";

		/* Place the table instance */
		$result = $p->fit_table($tbl, $llx, $lly, $urx, $ury, $optlist);
		//// End Table

		# -- Scale Title -- #
		$p->setfont($font, 40);
		$p->set_text_pos(120, 810);
		$p->fit_textline($scaleTitle, $tow, $toh, $optst);

		# -- Scale Paragraph -- #
		$llx1= 370.5; $lly1=516.5; $urx1=540; $ury1=772;
		$sp = $p->add_textflow(0, $article, $optsp);
		$p->fit_textflow($sp, $llx1, $lly1, $urx1, $ury1, $optA);
		$p->delete_textflow($sp);

		# -- Copyright -- #
		$p->setfont($font, 14);
		$p->set_text_pos(96, 810);
		$p->fit_textline($copyright, 390, 4, $optcr);

		# -- Pattern Text -- #
		$p->setfont($font, 20);
		$p->set_text_pos(96, 810);
		$p->fit_textline("Pattern 1", 117, 630, $optpat);
		$p->fit_textline("Pattern 2", 377, 570, $optpat);
		$p->fit_textline("Pattern 3", 117, 430, $optpat);
		$p->fit_textline("Pattern 4", 377, 330, $optpat);
		$p->fit_textline("Pattern 5", 115, 225, $optpat);

		# -- Corner Banners -- #
		$p->setfont($font, 12);
		$p->set_text_pos(126, 50);
		$p->fit_textline("GUITARTRICKS.COM", 395, 14, $optban2);

		# -- Fret Numbers -- #
		$p->setfont($font, 12);
		$p->set_text_pos(126, 50);
		$p->fit_textline($FretPattern1, (97+6), (481-9), $optfret); // Pattern 1
		$p->fit_textline(($FretPattern1+1), (128+6), (481-9), $optfret);
		$p->fit_textline(($FretPattern1+2), (158+6), (481-9), $optfret);
		$p->fit_textline(($FretPattern1+3), (189+6), (481-9), $optfret);
		$p->fit_textline(($FretPattern1+4), (221+6), (481-9), $optfret);
		$p->fit_textline($FretPattern2, (358+6), (421-9), $optfret); // Pattern 2
		$p->fit_textline(($FretPattern2+1), (390+6), (421-9), $optfret);
		$p->fit_textline(($FretPattern2+2), (420+6), (421-9), $optfret);
		$p->fit_textline(($FretPattern2+3), (451+6), (421-9), $optfret);
		$p->fit_textline(($FretPattern2+4), (483+6), (421-9), $optfret);
		$p->fit_textline($FretPattern3, (97+6), (281-9), $optfret); // Pattern 3
		$p->fit_textline(($FretPattern3+1), (128+6), (281-9), $optfret);
		$p->fit_textline(($FretPattern3+2), (158+6), (281-9), $optfret);
		$p->fit_textline(($FretPattern3+3), (189+6), (281-9), $optfret);
		$p->fit_textline(($FretPattern3+4), (221+6), (281-9), $optfret);
		$p->fit_textline($FretPattern4, (358+6), (181-9), $optfret); // Pattern 4
		$p->fit_textline(($FretPattern4+1), (390+6), (181-9), $optfret);
		$p->fit_textline(($FretPattern4+2), (420+6), (181-9), $optfret);
		$p->fit_textline(($FretPattern4+3), (451+6), (181-9), $optfret);
		$p->fit_textline(($FretPattern4+4), (483+6), (181-9), $optfret);
		$p->fit_textline($FretPattern5, (97+6), (75-9), $optfret); // Pattern 5
		$p->fit_textline(($FretPattern5+1), (128+6), (75-9), $optfret);
		$p->fit_textline(($FretPattern5+2), (158+6), (75-9), $optfret);
		$p->fit_textline(($FretPattern5+3), (189+6), (75-9), $optfret);
		$p->fit_textline(($FretPattern5+4), (220+6), (75-9), $optfret);


		# -- Logo -- #
		$p->fit_image($Logo, 27.5, 780.5, $sclogo);

		/* create URI action */
		$optlistgt = "url={http://www.GuitarTricks.com}";
		$act = $p->create_action("URI", $optlistgt);
		$optlistgt = "action={activate " . $act . "} linewidth=0 usematchbox={gt}";
		$p->create_annotation(0, 0, 0, 0, "Link", $optlistgt);
		$optlistgt2 = "action={activate " . $act . "} linewidth=0 usematchbox={gt2}";
		$p->create_annotation(200, 200, 200, 200, "Link", $optlistgt2);


		$p->end_page_ext("");

		# Delete the virtual file to free the allocated memory
		$p->delete_pvf("/pvf/BG");
		$p->delete_pvf("/pvf/ChordBody1");
		$p->delete_pvf("/pvf/ChordBody2");
		$p->delete_pvf("/pvf/ChordBody3");
		$p->delete_pvf("/pvf/ChordBody4");
		$p->delete_pvf("/pvf/ChordBody5");
		$p->delete_pvf("/pvf/bottom");
		$p->delete_pvf("/pvf/DotOn");
		$p->delete_pvf("/pvf/DotOff");
		$p->delete_pvf("/pvf/Logo");

		$p->end_document("");

		$buf = $p->get_buffer();
		$len = strlen($buf);
		
		// //header("Content-Disposition: attachment; filename=UltimateScaleFinder-$name.pdf");
		header("Content-Type: application/pdf");
		header("Content-Disposition: inline; filename=\"UltimateScaleFinder-$rn-$st.pdf\"");
		header("Content-Length: $len");
		echo $buf;
		exit;
	}
	catch (PDFlibException $e) {
		die("PDFlib exception occurred in hello sample:\n" .
		"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
		$e->get_errmsg() . "\n");
	}
	catch (Exception $e) {
		die($e);
	}

	$p = 0;
