9 Replies Latest reply on Jan 25, 2014 8:55 AM by W_J_T

    Custom Swatch Palette (beta)

    Silly-V Adobe Community Professional

      Hi yall,

       

      I created this custom swatch palette which allows a person to keep swatch info in this palette and instantiate it in documents.  The palette can store notes about a particular swatch and there is a save button somewhere which will save your palette state as an xml file.

       

      //==================================================HOBO SWATCHES by Vasily ===========================================//

      // BETA

      /**

      * @@@BUILDINFO@@@ Hobo Swatches_v1.jsx !Version! Sat Jan 18 2014 22:36:40 GMT-0600

      */

       

       

       

       

      function swatchPalette(){

      //===================================================Icon Resources========================//

      var infoBtnSrc='({total:2, '+

      'shape_1:{fillColor:[0.11, 0.18, 1], name:"", tag:"", strokeColor:null, pathPoints:[10, 3, 5, 5], ellipsePath:true, closed:true}, '+

      'shape_0:{fillColor:[0.11, 0.18, 1], name:"", tag:"", strokeColor:null, pathPoints:[[15, 15], [15, 11], [18, 11], [18, 9], [13, 9], [8, 9], [8, 11], [11, 11], [11, 15], [7, 15], [7, 17], [19, 17], [19, 15]], ellipsePath:false, closed:true}})';

      var addBtnSrc='({total:1, '+

      'group_0:{'+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0, 0.14, 1], pathPoints:[[19, 9], [14, 9], [14, 4], [12, 4], [12, 9], [7, 9], [7, 11], [12, 11], [12, 16], [14, 16], [14, 11], [19, 11]], ellipsePath:false, closed:true, strokeWidth:2}, '+

      'shape_0:{fillColor:[1, 1, 0], name:"", tag:"", strokeColor:null, pathPoints:[[19, 9], [14, 9], [14, 4], [12, 4], [12, 9], [7, 9], [7, 11], [12, 11], [12, 16], [14, 16], [14, 11], [19, 11]], ellipsePath:false, closed:true}, total:2}})';

      var rmvBtnSrc='({total:2, '+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0, 0.22, 0], pathPoints:[[20, 9], [6, 9], [6, 11], [20, 11]], ellipsePath:false, closed:true, strokeWidth:3}, '+

      'shape_0:{fillColor:[0.27, 1, 0], name:"", tag:"", strokeColor:null, pathPoints:[[20, 9], [6, 9], [6, 11], [20, 11]], ellipsePath:false, closed:true}})';

      var rstBtnSrc='({total:2, '+

      'group_1:{'+

      'shape_1:{fillColor:[1, 0, 0], name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[45, 4, 12, 12], ellipsePath:true, closed:true, strokeWidth:2}, '+

      'shape_0:{fillColor:null, name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[[51, 12], [51, 2]], ellipsePath:false, closed:false, strokeWidth:3}, total:2}, '+

      'group_0:{'+

      'shape_7:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[5, 16], [5, 5], [11, 5], [11, 10], [7, 10], [12, 15]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_6:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[20, 5], [15, 5], [15, 15], [19, 15]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_5:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[14, 10], [18, 10]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_4:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[34, 5], [29, 5], [29, 15], [34, 15]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_3:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[29, 10], [32, 10]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_2:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[21, 15], [26, 15], [26, 10], [22, 10], [22, 5], [27, 5]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[39, 16], [39, 5]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_0:{fillColor:null, name:"", tag:"", strokeColor:[0.75, 0.36, 0], pathPoints:[[35, 5], [42, 5]], ellipsePath:false, closed:false, strokeWidth:2}, total:8}})';

      var labModelSrc='({total:3, '+

      'shape_2:{fillColor:null, name:"", tag:"", strokeColor:[1, 1, 1], pathPoints:[[4, 2], [4, 8], [7, 8]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0, 1, 1], pathPoints:[[12, 3], [12, 8], [9, 8], [9, 5], [12, 5]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_0:{fillColor:null, name:"", tag:"", strokeColor:[1, 1, 0], pathPoints:[[15, 2], [15, 8], [18, 8], [18, 5], [15, 5]], ellipsePath:false, closed:false, strokeWidth:2}})';

      var cmykModelSrc='({total:4, '+

      'shape_3:{fillColor:[0, 1, 1], name:"", tag:"", strokeColor:null, pathPoints:[[2, 9], [5, 9], [5, 8], [3, 8], [3, 3], [5, 3], [5, 2], [2, 2]], ellipsePath:false, closed:true}, '+

      'shape_2:{fillColor:[1, 0, 1], name:"", tag:"", strokeColor:null, pathPoints:[[10, 3], [9, 3], [9, 4], [8, 4], [8, 3], [7, 3], [7, 2], [6, 2], [6, 3], [6, 5], [6, 9], [7, 9], [7, 5], [8, 5], [8, 6], [9, 6], [9, 5], [10, 5], [10, 9], [11, 9], [11, 2], [10, 2]], ellipsePath:false, closed:true}, '+

      'shape_1:{fillColor:[1, 1, 0], name:"", tag:"", strokeColor:null, pathPoints:[[16, 2], [16, 3], [15, 3], [15, 4], [14, 4], [14, 3], [13, 3], [13, 2], [12, 2], [12, 4], [13, 4], [13, 5], [14, 5], [14, 9], [15, 9], [15, 5], [16, 5], [16, 4], [17, 4], [17, 2]], ellipsePath:false, closed:true}, '+

      'group_0:{'+

      'shape_4:{fillColor:[0, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[19, 5], [19, 2], [18, 2], [18, 9], [19, 9], [19, 6], [20, 6], [20, 5]], ellipsePath:false, closed:true}, '+

      'shape_3:{fillColor:[0, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[20, 8], [21, 8], [21, 6], [20, 6]], ellipsePath:false, closed:true}, '+

      'shape_2:{fillColor:[0, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[22, 9], [22, 8], [21, 8], [21, 9]], ellipsePath:false, closed:true}, '+

      'shape_1:{fillColor:[0, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[21, 3], [20, 3], [20, 5], [21, 5]], ellipsePath:false, closed:true}, '+

      'shape_0:{fillColor:[0, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[22, 2], [21, 2], [21, 3], [22, 3]], ellipsePath:false, closed:true}, total:5}})';

      var rgbModelSrc='({total:5, '+

      'shape_4:{fillColor:[1, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[2, 2], [2, 9], [3, 9], [3, 3], [5, 3], [5, 5], [3, 5], [3, 7], [4, 7], [4, 6], [6, 6], [6, 2]], ellipsePath:false, closed:true}, '+

      'shape_3:{fillColor:[1, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[5, 8], [5, 7], [4, 7], [4, 8]], ellipsePath:false, closed:true}, '+

      'shape_2:{fillColor:[1, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[6, 9], [6, 8], [5, 8], [5, 9]], ellipsePath:false, closed:true}, '+

      'shape_1:{fillColor:[0, 1, 0], name:"", tag:"", strokeColor:null, pathPoints:[[7, 9], [11, 9], [11, 6], [9, 6], [9, 7], [10, 7], [10, 8], [8, 8], [8, 3], [10, 3], [10, 4], [11, 4], [11, 2], [7, 2]], ellipsePath:false, closed:true}, '+

      'shape_0:{fillColor:[0, 0, 1], name:"", tag:"", strokeColor:null, pathPoints:[[13, 5], [13, 3], [15, 3], [15, 5], [16, 5], [16, 2], [12, 2], [12, 9], [16, 9], [16, 6], [15, 6], [15, 8], [13, 8], [13, 6], [15, 6], [15, 5]], ellipsePath:false, closed:true}})';

      var grayModelSrc='({total:7, '+

      'shape_6:{fillColor:[0.57, 0.58, 0.59], name:"", tag:"", strokeColor:null, pathPoints:[[7, 2], [7, 9], [8, 9], [8, 3], [10, 3], [10, 5], [8, 5], [8, 7], [9, 7], [9, 6], [11, 6], [11, 2]], ellipsePath:false, closed:true}, '+

      'shape_5:{fillColor:[0.57, 0.58, 0.59], name:"", tag:"", strokeColor:null, pathPoints:[[10, 8], [10, 7], [9, 7], [9, 8]], ellipsePath:false, closed:true}, '+

      'shape_4:{fillColor:[0.57, 0.58, 0.59], name:"", tag:"", strokeColor:null, pathPoints:[[11, 9], [11, 8], [10, 8], [10, 9]], ellipsePath:false, closed:true}, '+

      'shape_3:{fillColor:[0.82, 0.82, 0.83], name:"", tag:"", strokeColor:null, pathPoints:[[2, 9], [6, 9], [6, 6], [4, 6], [4, 7], [5, 7], [5, 8], [3, 8], [3, 3], [5, 3], [5, 4], [6, 4], [6, 2], [2, 2]], ellipsePath:false, closed:true}, '+

      'shape_2:{fillColor:[0.35, 0.36, 0.38], name:"", tag:"", strokeColor:null, pathPoints:[[15, 3], [13, 3], [13, 2], [15, 2]], ellipsePath:false, closed:true}, '+

      'shape_1:{fillColor:[0.35, 0.36, 0.38], name:"", tag:"", strokeColor:null, pathPoints:[[15, 3], [15, 5], [13, 5], [13, 3], [12, 3], [12, 9], [13, 9], [13, 6], [15, 6], [15, 9], [16, 9], [16, 3]], ellipsePath:false, closed:true}, '+

      'shape_0:{fillColor:[0.2, 0.22, 0.24], name:"", tag:"", strokeColor:null, pathPoints:[[21, 2], [21, 3], [20, 3], [20, 4], [19, 4], [19, 3], [18, 3], [18, 2], [17, 2], [17, 4], [18, 4], [18, 5], [19, 5], [19, 9], [20, 9], [20, 5], [21, 5], [21, 4], [22, 4], [22, 2]], ellipsePath:false, closed:true}})';

      var noteMarkSrc='({total:4, '+

      'shape_3:{fillColor:[0.53, 0.33, 0.26], name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[[11, 21], [11, 14], [4, 14]], ellipsePath:false, closed:true, strokeWidth:1}, '+

      'shape_2:{fillColor:[1, 0.97, 0.62], name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[[11, 21], [1, 21], [1, 14], [7, 14], [11, 19]], ellipsePath:false, closed:true, strokeWidth:1}, '+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[[1, 17], [6, 17]], ellipsePath:false, closed:false, strokeWidth:1}, '+

      'shape_0:{fillColor:null, name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[[1, 19], [6, 19]], ellipsePath:false, closed:false, strokeWidth:1}})';

      var okBtnSrc='({total:2, '+

      'group_1:{'+

      'shape_5:{fillColor:null, name:"", tag:"", strokeColor:[0.39, 0.31, 0], pathPoints:[[11, 5], [5, 5], [5, 15], [11, 15]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_4:{fillColor:null, name:"", tag:"", strokeColor:[0.39, 0.31, 0], pathPoints:[[28, 5], [22, 5], [22, 15], [28, 15]], ellipsePath:false, closed:true, strokeWidth:2}, '+

      'shape_3:{fillColor:null, name:"", tag:"", strokeColor:[0.39, 0.31, 0], pathPoints:[[14, 4], [14, 15], [19, 15]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_2:{fillColor:null, name:"", tag:"", strokeColor:[0.39, 0.31, 0], pathPoints:[[45, 5], [40, 5], [40, 15], [45, 15]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0.39, 0.31, 0], pathPoints:[[40, 10], [43, 10]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_0:{fillColor:null, name:"", tag:"", strokeColor:[0.39, 0.31, 0], pathPoints:[[31, 15], [36, 15], [36, 10], [32, 10], [32, 5], [37, 5]], ellipsePath:false, closed:false, strokeWidth:2}, total:6}, '+

      'group_0:{'+

      'shape_2:{fillColor:[0, 0, 0], name:"", tag:"", strokeColor:[0.57, 0.58, 0.59], pathPoints:[47, 2, 15, 15], ellipsePath:true, closed:true, strokeWidth:1}, '+

      'shape_1:{fillColor:null, name:"", tag:"", strokeColor:[0.93, 0.11, 0.14], pathPoints:[[51, 13], [58, 6]], ellipsePath:false, closed:false, strokeWidth:2}, '+

      'shape_0:{fillColor:null, name:"", tag:"", strokeColor:[0.93, 0.11, 0.14], pathPoints:[[58, 13], [51, 6]], ellipsePath:false, closed:false, strokeWidth:2}, total:3}})';

      var addToDocBtnSrc='({total:5, '+

      'shape_4:{fillColor:[1, 1, 0.59], name:"", tag:"", strokeColor:[0.14, 0.12, 0.13], pathPoints:[[22, 16], [13, 16], [13, 9], [17, 5], [22, 5]], ellipsePath:false, closed:true, strokeWidth:2}, '+

      'shape_3:{fillColor:[0.14, 0.12, 0.13], name:"", tag:"", strokeColor:null, pathPoints:[[11, 13], [8, 13], [8, 4], [11, 4]], ellipsePath:false, closed:true}, '+

      'shape_2:{fillColor:[0.14, 0.12, 0.13], name:"", tag:"", strokeColor:null, pathPoints:[[5, 10], [5, 7], [14, 7], [14, 10]], ellipsePath:false, closed:true}, '+

      'shape_1:{fillColor:[1, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[13, 9], [6, 9], [6, 8], [13, 8]], ellipsePath:false, closed:true}, '+

      'shape_0:{fillColor:[1, 0, 0], name:"", tag:"", strokeColor:null, pathPoints:[[10, 5], [10, 12], [9, 12], [9, 5]], ellipsePath:false, closed:true}})';

      //===================================================Basic Functions========================//

          var UIElements=[Window,Group,EditText,Panel];

          for(var i=0; i<UIElements.length; i++){

              UIElements[i].prototype.setBg=function(rgb){

                  this.graphics.backgroundColor=this.graphics.newBrush(this.graphics.BrushType.SOLID_COLOR, [rgb[0],rgb[1],rgb[2]]);

              }

          }

          function round2(num){

              return Math.round(num*100)/100;

          }

          var env=ScriptUI.environment;

         

          function convertAppColor(src,dest,clrArr){

              return app.convertSampleColor(ImageColorSpace[src], clrArr, ImageColorSpace[dest], ColorConvertPurpose.defaultpurpose);

          }

          function currentTime(){

              var time=new Date();

              var hours=time.getHours();

              var minutes=time.getMinutes();

              var seconds=time.getSeconds();

              if(seconds<10){seconds='0'+seconds;}

              if(minutes<10){minutes='0'+minutes;}

              var ampm=function(){

                  if(hours>12){

                      hours-=12;

                      return 'pm';

                  } else {

                      if(hours==0){hours=1;}

                      return 'am';

                  }

              }();

              return (hours)+":"+minutes+":"+seconds+" "+ampm;

          }

          function getUIRGB(type, clr){

              for(var x=0; x<clr.length; x++){

                  clr[x]=clr[x]*1;

              }

              if(type=="RGB"){

                  return [round2(clr[0]/255),round2(clr[1]/255),round2(clr[2]/255)];

              } else if(type=="CMYK"){

                  var newArr=convertAppColor("CMYK","RGB",[clr[0],clr[1],clr[2],clr[3]]);

                  return [round2(newArr[0]/255),round2(newArr[1]/255),round2(newArr[2]/255)];

              } else if(type=="GRAY"){

                  var newArr=convertAppColor("GrayScale","RGB",[clr[0]]);

                  return [round2(newArr[0]/255),round2(newArr[1]/255),round2(newArr[2]/255)];

              } else if(type=="LAB"){

                  var newArr=convertAppColor("LAB","RGB",[clr[0],clr[1],clr[2]]);

                  return [round2(newArr[0]/255),round2(newArr[1]/255),round2(newArr[2]/255)];

              } else {

                  return [0.5,0.5,0.5];

              }

          }

      //===================================================Advanced Functions========================//

          //===================================XML=============//

          function wrapCDATA(str, propNm){

              str = '<data>'+str+'</data>';

              str = str.replace(/(\<data\>)/g, '<'+propNm+'><![CDATA[');

              str = str.replace(/(\<\/data\>)/g,']]\>'+'</'+propNm+'>');

              return XML(str);

          }

          function stringXmlSafe(str){

              str=str.toString();

              str=str.replace(/&(?!(amp;|gt;|lt;|quot;|apos;))/g,"&amp;");

              str=str.replace(/</g,"&lt;");

              str=str.replace(/>/g,"&gt;");

              str=str.replace(/'/g,"&apos;");

              str=str.replace(/"/g,"&quot;");

              return str;

          }

          function getXmlSwatchesArr(xmlFile){

              var myFile=xmlFile;

              myFile.open('r');

              myFile.seek(0,0);

              var fileStr=myFile.read();

              myFile.close();

              var xmlObj=XML(fileStr);

              var swatchArr=[];

              for(var x=0, ln=xmlObj.children().length(); x<ln; x++){

                  var sw={};

                  var thisSw=xmlObj.children()[x];

                  sw.name=thisSw.descendants("name").toString();

                  sw.aiSwatchKind=thisSw.descendants("aiswatchkind").toString();

                  var comp=thisSw.descendants("colorcomp");

                  sw.colorComp={};

                  sw.colorComp.mode=comp.descendants("mode").toString();

                  sw.colorComp.comp=[];

                  for(var y=0, ln_2=thisSw.descendants("colorcomp").descendants("colorvalues").children().length(); y<ln_2; y++){

                      sw.colorComp.comp.push(thisSw.descendants("colorcomp").descendants("colorvalues").childre n()[y]*1);

                  }

                  sw.notes=thisSw.descendants("notes");

                  sw.originDoc=thisSw.descendants("origindoc").toString();

                  swatchArr.push(sw);

              }

              return swatchArr;

          }

          function getXmlSwatchesXML(swatchArr){

              XML.prettyIndent=4;

              var xmlBody=new XML('<swatches></swatches>');

              for(var i=0; i<swatchArr.length; i++){

                  var thisSw=swatchArr[i];

                  xmlBody.appendChild(new XML("<swatch></swatch>")); xmlBody.swatch[i].@order=i+1;

                  xmlBody.swatch[i].appendChild(new XML("<name>"+stringXmlSafe(thisSw.name)+"</name>"));

                  if(thisSw.name!='none'){

                      if(thisSw.info && thisSw.info.plating){

                          thisSw.aiSwatchKind=thisSw.info.plating;

                          thisSw.colorComp.mode=thisSw.colorComp.typename;

                          thisSw.originDoc=thisSw.info.originDoc;

                          thisSw.notes=thisSw.info.notes;

                      }

                      xmlBody.swatch[i].appendChild(new XML("<aiswatchkind>"+stringXmlSafe(thisSw.aiSwatchKind)+"</aiswatchkind>"));

                      xmlBody.swatch[i].appendChild(new XML("<colorcomp></colorcomp>"));

                      xmlBody.swatch[i].colorcomp[0].appendChild(new XML("<mode>"+stringXmlSafe(thisSw.colorComp.mode)+"</mode>"));

                      xmlBody.swatch[i].colorcomp[0].appendChild(new XML("<colorvalues></colorvalues>"));

                      for(var j=0; j<thisSw.colorComp.comp.length; j++){

                          xmlBody.swatch[i].colorcomp[0].colorvalues[0].appendChild(new XML("<value>"+stringXmlSafe(thisSw.colorComp.comp[j])+"</value>"));

                      }

                      xmlBody.swatch[i].notes=wrapCDATA(thisSw.notes, 'notes');

                      xmlBody.swatch[i].origindoc=stringXmlSafe(thisSw.originDoc);

                  }

              }

              return xmlBody;

          }

          //===================================end XML=============//

         

          // gets type and color array from swatch in swatch palette - for BT

          function getAISwatchColor(processColorOrSpot,name){

              function round2(num){

                  return Math.round(num*100)/100;

              }

              var result={type:null, name:null, colorArr:null, uiColor:null, plating:null, originDoc:null, creDt:null, rgbClr:null, cmykClr:null, grayClr:null, labClr:null};

              var clr=processColorOrSpot;

              result.name=name;

              if(clr=="[RGBColor]"){

                  result.type="RGB"; result.colorArr=[round2(clr.red),round2(clr.green),round2(clr.blue)];

                  result.uiColor=[clr.red/255,clr.green/255,clr.blue/255]; result.plating='Process';

              } else if(clr=="[CMYKColor]"){

                  result.type="CMYK"; result.colorArr=[round2(clr.cyan),round2(clr.magenta),round2(clr.yellow),round2(clr.black )]; result.uiColor=function(){

                      var newArr=convertAppColor("CMYK","RGB",[clr.cyan,clr.magenta,clr.yellow,clr.black]);

                      return [newArr[0]/255,newArr[1]/255,newArr[2]/255,];

                  }(); result.plating='Process';

              } else if(clr=="[GrayColor]"){

                  result.type="GRAY"; result.colorArr=[round2(clr.gray)]; result.uiColor=function(){

                      var newArr=convertAppColor("GrayScale","RGB",[clr.gray]);

                      return [newArr[0]/255,newArr[1]/255,newArr[2]/255,];

                  }(); result.plating='Process';

              } else if(clr=="[SpotColor]"){

                  clr=clr.spot;

                  if(clr.colorType==ColorModel.SPOT){

                      result.plating='Spot';

                  } else if(clr.colorType==ColorModel.PROCESS){

                      result.plating='GlobalProcess';

                  } else if(clr.colorType==ColorModel.REGISTRATION){

                      result.plating='Registration';

                  } else {

                      result.plating="Process";

                  }

                  var intClr=clr.getInternalColor();

                  for(var i=0; i<intClr.length; i++){

                      intClr[i]=round2(intClr[i]);

                  }

                  if(clr.spotKind==SpotColorKind.SPOTLAB){

                      result.type="LAB"; result.colorArr=intClr; result.uiColor=function(){

                          var newArr=convertAppColor("LAB","RGB",[intClr[0],intClr[1],intClr[2]]);

                          return [newArr[0]/255,newArr[1]/255,newArr[2]/255,];

                      }();

                  } else if(clr.spotKind==SpotColorKind.SPOTRGB){

                      result.type="RGB"; result.colorArr=intClr; result.uiColor=[intClr[0]/255,intClr[1]/255,intClr[2]/255];

                  } else if(clr.spotKind==SpotColorKind.SPOTCMYK){

                      result.type="CMYK"; result.colorArr=intClr; result.uiColor=function(){

                          var newArr=convertAppColor("CMYK","RGB",[intClr[0],intClr[1],intClr[2],intClr[3]]);

                          return [newArr[0]/255,newArr[1]/255,newArr[2]/255,];

                      }();

                  }

              }

              var colorMode=result.type;

              if(colorMode=="GRAY"){

                  colorMode="GrayScale";

              }

              var altClrs=[

                  result.rgbClr=convertAppColor(colorMode, "RGB", result.colorArr),

                  result.cmykClr=convertAppColor(colorMode, "CMYK", result.colorArr),

                  result.grayClr=convertAppColor(colorMode, "GrayScale", result.colorArr),

                  result.labClr=convertAppColor(colorMode, "LAB", result.colorArr),

              ];

              for(var c=0; c<altClrs.length; c++){

                  for(var d=0; d<altClrs[c].length; d++){

                      altClrs[c][d]=round2(altClrs[c][d]);

                  }

              }

              result.originDoc=app.activeDocument.name;

              result.creDt=currentTime();

              return result;

          }

       

       

          function drawPath(shp, canvas){

              var thisShp=shp;

              if(thisShp.ellipsePath!=true){

                  var vectorPts=thisShp.pathPoints;

                  canvas.newPath(); canvas.moveTo(thisShp.pathPoints[0][0],thisShp.pathPoints[0][1]);

                  for(var j=0; j<vectorPts.length; j++){

                      var thisAnchor=vectorPts[j];

                      var x=thisAnchor[0], y=thisAnchor[1];

                      canvas.lineTo(x,y);

                  }

                  if(thisShp.closed==true){

                      canvas.closePath();

                  }

              } else {

                  var cirPts=thisShp.pathPoints;

                  canvas.newPath();

                  canvas.ellipsePath(round2(cirPts[0]), round2(cirPts[1]), round2(cirPts[2]), round2(cirPts[3]));

                  canvas.closePath();

              }

              if(thisShp.fillColor!=null){

                  var clr=thisShp.fillColor;

                  var myBrush=canvas.newBrush(canvas.BrushType.SOLID_COLOR,clr);

                  canvas.fillPath(myBrush);

              }

              if(thisShp.strokeColor!=null){

                  var clr=thisShp.strokeColor;

                  var myPen=canvas.newPen(canvas.PenType.SOLID_COLOR,[clr[0],clr[1],clr[2],1], thisShp.strokeWidth);

                  canvas.strokePath(myPen);

              }

          }

          function drawImg(objString, canvasArea){

              // using drawPath();

              var obj=eval(objString.replace(/(^'|';$)/g,''));

              var canvas=canvasArea.graphics;

              var counter=obj.total;

              while(counter>=0){

                  for(all in obj){

                      if(all.match(/\d{1,2}$/g) && all.match(/\d{1,2}$/g)==counter){

                          var thisShp=obj[all];

                          if(all.match('group')){

                              var ctr=obj[all].total;

                              while(ctr>=0){

                                  for(paths in obj[all]){

                                      if(paths.match(/\d{1,2}$/g) && paths.match(/\d{1,2}$/g)==ctr){

                                          drawPath(obj[all][paths], canvas);

                                      }

                                  }

                              ctr--;

                              }

                          } else {

                              drawPath(thisShp, canvas);

                          }

                      }

                  }

              counter-=1;

              } 

          }

          function btnSkin(elem,aClr,w,h){

              var g=elem.graphics; var brush=g.newBrush(g.BrushType.SOLID_COLOR,aClr);

              g.newPath(); g.moveTo(1,1); g.lineTo(w-1,1); g.lineTo(w-1,h-1); g.lineTo(1,h-1); g.closePath(); g.fillPath(brush);

              var ltr=[aClr[0]*1.2,aClr[1]*1.2,aClr[2]*1.2];

              for(var c=0; c<ltr.length; c++){

                  if(ltr[c]>1){

                      ltr[c]=1;

                  }

              }

              brush=g.newBrush(g.BrushType.SOLID_COLOR,ltr); g.newPath(); g.rectPath(0,0,w,h/2); g.fillPath(brush);

              var pen=g.newPen(g.PenType.SOLID_COLOR,[1,1,1,1],2);

              g.newPath(); g.moveTo(1,1); g.lineTo(w-1,1); g.lineTo(w-1,h-1); g.lineTo(1,h-1); g.closePath();

              g.strokePath(pen);

          }

          function createAltDisp(swObj, uiParent){

              var altClrs=swObj.info.altClrs;

              var modes=['CMYK','RGB','LAB','GRAY'];

              for(var m=0; m<modes.length; m++){

                  if(swObj.colorComp.typename!=modes[m]){

                      var altG=uiParent.add('panel',undefined,modes[m]); altG.margins=[2,6,2,2];

                      altG.size=[80,88]; altG.spacing=2; altG.alignChildren='left';

                      if(modes[m]=="RGB"){

                          altG.add('statictext',undefined,'R: '+altClrs.rgbClr[0]);

                          altG.add('statictext',undefined,'G: '+altClrs.rgbClr[1]);

                          altG.add('statictext',undefined,'B: '+altClrs.rgbClr[2]);

                      } else if(modes[m]=="CMYK"){

                          altG.add('statictext',undefined,'C: '+altClrs.cmykClr[0]);

                          altG.add('statictext',undefined,'M: '+altClrs.cmykClr[1]);

                          altG.add('statictext',undefined,'Y: '+altClrs.cmykClr[2]);

                          altG.add('statictext',undefined,'K: '+altClrs.cmykClr[3]);

                      } else if(modes[m]=="LAB"){

                          altG.add('statictext',undefined,'L: '+altClrs.labClr[0]);

                          altG.add('statictext',undefined,'A: '+altClrs.labClr[1]);

                          altG.add('statictext',undefined,'B: '+altClrs.labClr[2]);

                      } else if(modes[m]=="GRAY"){

                          altG.add('statictext',undefined,'Black: '+altClrs.grayClr[0]);

                      }

                  }

              }

          }

          function swatchInfoBox(swObj, uiParent){

              var baseG=uiParent; // usually a group

              var g_1=baseG.add("panel",undefined,"Swatch Info"); g_1.size=[340,340]; g_1.spacing=2; g_1.margins=[4,12,4,4];

              var nameD=g_1.add('edittext',undefined,swObj.name,{readonly:true}); nameD.characters=20; nameD.justify='center';

              if(swObj.name!='none'){

                  var mode=swObj.colorComp.typename;

                  var sep=g_1.add('panel'); sep.size=[310,2];

                  var g_1_0=g_1.add('group');

                      var txtG=g_1_0.add('group'); txtG.orientation='column'; txtG.spacing=2; txtG.margins=[2,2,2,2]; txtG.alignChildren='left';

                          txtG.add('statictext',undefined,'Color Model: '+swObj.colorComp.typename);

                          txtG.add('statictext',undefined,'Illustrator Swatch Type: '+swObj.info.plating);

                      var swD=g_1_0.add('panel'); swD.size=[34,34]; swD.setBg(swObj.fillColor);

                  var sep_1=g_1.add('panel'); sep_1.size=[310,2];

                  var g_1_1=g_1.add('group'); g_1_1.spacing=2;

                  if(mode=="RGB"){

                      var rD=g_1_1.add('statictext',undefined,'Red: '+swObj.colorComp.comp[0]+',');

                      var gD=g_1_1.add('statictext',undefined,'Green: '+swObj.colorComp.comp[1]+',');

                      var bD=g_1_1.add('statictext',undefined,'Blue: '+swObj.colorComp.comp[2]);

                  } else if(mode=="CMYK"){

                      var cD=g_1_1.add('statictext',undefined,'Cyan: '+swObj.colorComp.comp[0]+',');

                      var mD=g_1_1.add('statictext',undefined,'Magenta: '+swObj.colorComp.comp[1]+',');

                      var yD=g_1_1.add('statictext',undefined,'Yellow: '+swObj.colorComp.comp[2]+',');

                      var kD=g_1_1.add('statictext',undefined,'Black: '+swObj.colorComp.comp[3]);

                  } else if(mode=="LAB"){

                      var lD=g_1_1.add('statictext',undefined,'Luminance: '+swObj.colorComp.comp[0]+',');

                      var aD=g_1_1.add('statictext',undefined,'a: '+swObj.colorComp.comp[1]+',');

                      var bD=g_1_1.add('statictext',undefined,'b: '+swObj.colorComp.comp[2]);

                  } else if(mode=="GRAY"){

                      var gD=g_1_1.add('statictext',undefined,'Gray-Scale Black: '+swObj.colorComp.comp[0]);

                  }

                  var g_1_2=g_1.add('group');

                  createAltDisp(swObj, g_1_2);

                  var sep_2=g_1.add('panel'); sep_2.size=[310,2];

                  var originDocG=g_1.add('group'); originDocG.orientation='row';

                      var originDocH=originDocG.add('statictext',undefined,"Originating Document");

                      var originDocE=originDocG.add('edittext',undefined,swObj.info.originDoc,{readonly:true}); originDocE.characters=18;

                  var g_1_3=g_1.add('panel',undefined,'Notes'); g_1_3.margins=[2,8,2,2]; g_1_3.spacing=2;

                      var notesE=g_1_3.add('edittext',undefined,'',{readonly:true, multiline:true}); notesE.size=[310,60];

                      if(swObj.info && swObj.info.notes && swObj.info.notes!=''){

                          notesE.text=swObj.info.notes;

                      }

                      var notesBtnG=g_1_3.add('group');

                          var viewBigBtn=notesBtnG.add('button',undefined,"View Big");

                          var editBtn=notesBtnG.add('button',undefined,"Edit Notes");

                          var clearBtn=notesBtnG.add('button',undefined,"Clear Notes");

                  viewBigBtn.onClick=function(){

                      if(notesE.text!=''){

                          var notesW=new Window('dialog',"Notes in a bigger window:"); notesW.margins=[4,4,4,4];

                          var bignotesE=notesW.add('edittext',undefined,notesE.text,{multiline:true, readonly:true}); bignotesE.size=[300,360];

                          var closeNotes=notesW.add('button',undefined,"Ok");

                          notesW.show();

                      } else {

                          alert("There are no notes here.");

                      }

                  }

                  editBtn.onClick=function(){

                      var editResult=function(){

                          var newNotes=null;

                          var w=new Window('dialog','Edit Notes');

                              var inst=w.add('statictext',undefined,"Tip: use Ctrl+Return to enter in a carriage-return.");

                              var editE=w.add('edittext',undefined,notesE.text,{multiline:true}); editE.size=[310,160]; editE.active=true;

                              var btnG=w.add('group');

                                  var okBtn=btnG.add('button',undefined,'Set Notes (OK)');

                                  var cclBtn=btnG.add('button',undefined,'Cancel');

                          okBtn.onClick=function(){

                              if(editE.text.replace(/\s/g)!=''){

                                  newNotes=editE.text;

                              } else {

                                  newNotes='';

                              }

                              w.close();

                          }

                          w.show();

                          return newNotes;

                      }();

                      if(editResult!=null){

                          notesE.text=editResult;

                          swObj.info.notes=editResult;

                          swObj.noteChange=currentTime();

                      }

                  }

                  clearBtn.onClick=function(){

                      if(confirm("Are you sure you want to clear the notes?")==true){

                          notesE.text='';

                          swObj.info.notes='';

                          swObj.noteChange=currentTime();

                      }

                  }

              }

          }

          function infoWindow(SESSION){ //======================================MINI UI

              var noteChange;

              var userChoice={showMode:SESSION.options.showMode, showNotes:SESSION.options.showNotes, noteChange:false};

              var swatchBox=function(){

                  if(SESSION.selection.length==0){

                      return null;

                  } else if(SESSION.selection.length==1){

                      return SESSION.selection[0];

                  } else if(SESSION.selection.length>1){

                      return "--Multiple Selection--";

                  }

              }();

              var w=new Window('dialog',"Swatch Info & Preferences"); w.margins=[4,4,4,4];

                  var g_0=w.add('group'); g_0.orientation='column'; g_0.spacing=4;

                      var g_0_1=g_0.add("group");

                      if(swatchBox!=null){

                          if(swatchBox=="--Multiple Selection--"){ // Multi

                              var msg=g_0_1.add('statictext',undefined,swatchBox);

                          } else { //Single

                              if(swatchBox.name!='none'){

                                  noteChange=swatchBox.noteChange;

                                  swatchInfoBox(swatchBox, g_0_1);

                              } else {

                                  var msg=g_0_1.add('statictext',undefined,"Empty Cell");

                              }

                          }

                      } else { // NONE

                          //var msg=g_0_1.add('statictext',undefined,"NONE");

                      }

                      var g_0_1=g_0.add("panel",undefined,"Main Window Prefrences"); g_0_1.size=[340,44]; g_0_1.orientation='column';

                          var boxGrp=g_0_1.add('group');

                              var modelBx=boxGrp.add('checkbox',undefined,"Show Color Mode"); modelBx.value=SESSION.options.showMode;

                              var noteBx=boxGrp.add('checkbox',undefined,"Show Note Marker"); noteBx.value=SESSION.options.showNotes;

                      var g_0_2=g_0.add("panel",undefined,"Persistence Options"); g_0_2.size=[340,54];

                          var saveBtn=g_0_2.add('button',undefined,"Save Current Session");

                  var okBtn=w.add('button',undefined,'Ok'); okBtn.size=[340,20]; okBtn.margins=[0,0,0,0];

                  okBtn.onClick=function(){

                      w.close();

                  }

                  saveBtn.onClick=function(){

                      var swcs=SESSION.swatchBoxes, swcsLn=SESSION.swatchBoxes.length;

                      var dir=SESSION.presetFolder;

                      var saveFl=File(dir+"/HoboSwatchSession.xml");

                      var blank=function(){

                          for(var s=0; s<swcsLn; s++){

                              if(swcs[s].name!='none'){

                                  return false;

                              }

                          }

                          return true;

                      }();

                      var go=false;

                      if(blank==true){

                          if(confirm('Set saved session to all blanks?',true,'Confirm this action:')==true){

                              go=true;

                          }

                      } else if(confirm('Save current session?',true,'Confirm this action:')==true){

                          go=true;

                      }

                      if(go==true){

                          if(!dir.exists){

                              dir.create();

                          }

                          saveFl.open('w');

                          saveFl.write('<?xml version="1.0"?>\r'+getXmlSwatchesXML(swcs));

                          saveFl.close();

                          if(saveFl.exists){

                              alert("Successfully Saved in: "+decodeURI(saveFl),'SUCCESS!');

                          } else {

                              alert("Sorry, "+decodeURI(saveFl)+"'s save operation was NOT successful!",'Failure... Horrible abysmal failure. :\'(');

                          }

                      }

                  }

              w.show();

              userChoice.showMode=modelBx.value;

              userChoice.showNotes=noteBx.value;

              userChoice.noteChange=function(){

                  if(swatchBox!=null && (swatchBox.noteChange != noteChange)){

                      return true;

                  }

                  return false;

              }();

              return userChoice;

          }

      //===================================================For Bridge Talk========================//

          function asSourceString(func, withArgs){

              if(withArgs!=undefined && withArgs==true){

                  return func.toSource().toString().replace("(","").replace(/\)$/,"");

              } else {

                  return func.toSource().toString().replace("(function "+func.name+"(){","").replace(/}\)$/,"");

              }

          }

          function sendBTmsg(func, updateObj, resultFunc, resultFuncArgs){

              if(updateObj==undefined){updateObj={self: 'nothing'}};

              var updateObjName=updateObj.self;

              if(updateObjName!=undefined){

                  var bt=new BridgeTalk;

                  bt.target='illustrator';

                  var btMsg=asSourceString(func);

                  for(all in updateObj){

                      if(all!='self'){

                          var rx=new RegExp(updateObjName+'\\.'+all,'g');

                          btMsg=btMsg.replace(rx,updateObj[all]);

                      }

                  }

                  bt.body=btMsg;

                  //$.write(btMsg);

                  if(resultFunc!=undefined){

                      bt.onResult=function(result){

                          resultFunc(result.body, resultFuncArgs);

                      }

                  }

                  bt.send();

              } else {

                  $.writeln("Error, function 'sendBTmsg(func, updateOb)': the update object should have a 'self' property, indentifying its' name.");

              }

          }

          function doNothing(){

              var nothing=function(){

                  return;

              }()

          }

          function initSwatch(SESSION, sw, name, mode, clrArr, uiClr, info){ // Result of getting document swatches.

              sw.fillColor=uiClr;

              sw.name=name;

              if(mode=="RGB" || mode=="LAB"){

                  sw.colorComp={typename:ColorComp[mode].typename,comp:[clrArr[0],clrArr[1],clrArr[2]]};

              } else if(mode=="CMYK"){

                  sw.colorComp={typename:ColorComp[mode].typename,comp:[clrArr[0],clrArr[1],clrArr[2],clrAr r[3]]};

              } else if(mode=="GRAY"){

                  sw.colorComp={typename:ColorComp[mode].typename,comp:[clrArr[0]]};

              }

              sw.colorComp.name=sw.name;

              SESSION.nameDisplay.text=sw.name;

              sw.info=info;

              sw.addDrawPhase(sw.coloredState);

              if(info.plating=="Spot"){

                  sw.addDrawPhase(sw.spotMark);

              } else if(info.plating=="GlobalProcess"){

                  sw.addDrawPhase(sw.globalMark);

              }

              if(SESSION.options.showMode==true){

                  sw.addDrawPhase(sw[mode+'Model']);

              }

              if(SESSION.options.showNotes==true && sw.info && sw.info.notes!=''){

                  sw.addDrawPhase(sw.noteMark);

              }

              if(sw.selected==true){

                  sw.removeDrawPhase(sw.selectedMark);

                  sw.addDrawPhase(sw.selectedMark);

              }

              sw.refresh();

              sw.instantiated=true;

              sw.elem.helpTip=sw.getInfo();

          }

      //=========<<<<<<<<<<<<<<<BT Function

          function bt_func(){

              var outcome={swatches:[],};

              if(app.documents.length>0){

                  var doc=app.activeDocument;

                  var swcs=doc.swatches.getSelected();

                  if(swcs.length>0){

                      BTOBJ.func_convertAppColor;

                      BTOBJ.func_currentTime;

                      BTOBJ.func_getAISwatchColor;

                      for(var s=0; s<swcs.length; s++){

                          var thisSw=swcs[s];

                          if(thisSw.color!="[PatternColor]" && thisSw.color!="[GradientColor]"

                              && thisSw.name!="[Registration]" && thisSw.name!="[None]"){

                              outcome.swatches.push(getAISwatchColor(thisSw.color, thisSw.name));

                          }

                      }

                      outcome=outcome.toSource();

                  } else {

                      alert("Please select some swatches from the document's swatches palette.");

                  }

              } else {

                  alert("Please open a document with swatches.");

              }

          }

          function bt_func_rt(objString, args){ //puts swatches into palette.

              var docSws=eval(objString).swatches; var SESSION=args[0];

              for(var s=0; s<docSws.length; s++){

                  var thisSw=docSws[s];

                  if(SESSION.selection[s]!=undefined){

                      if(thisSw.name!='none'){

                          var sw=SESSION.selection[s];

                          var info={plating: thisSw.plating, originDoc: thisSw.originDoc,

                              altClrs:{rgbClr:thisSw.rgbClr,cmykClr:thisSw.cmykClr,labClr:thisSw.labClr,grayClr:thisSw. grayClr},

                              notes: '',

                          };

                          initSwatch(SESSION, sw, thisSw.name, thisSw.type, thisSw.colorArr, thisSw.uiColor, info);

                      } else {

                          alert("Sorry, can't have a swatch by the name of '"+thisSw.name+"'");

                      }

                  }

              }

          }

          function bt_func_2(){

              BTOBJ.func_currentTime;

              var outcome={};

              if(app.documents.length>0){

                  var doc=app.activeDocument;

                  var swcs=eval(BTOBJ.sessionSelection);

                  var nonConflictingSwatches=[];

                  for(var s=0; s<swcs.length; s++){

                      var thisSw=swcs[s];

                      try{

                          doc.swatches.getByName(thisSw.name);

                          continue;

                      } catch(e){

                          nonConflictingSwatches.push(thisSw);

                      }

                  }

                  for(var s=0; s<nonConflictingSwatches.length; s++){

                      var thisSw=nonConflictingSwatches[s];

                      for(var t=0; t<nonConflictingSwatches.length; t++){

                          var thisOtherSw=nonConflictingSwatches[t];

                          if(t!=s && thisSw.name==thisOtherSw.name){

                              nonConflictingSwatches.splice(s,1);

                              s=0;

                              break;

                          }

                      }

                  }

                  if(nonConflictingSwatches.length>0){

                      var swG=doc.swatchGroups.add(); var d=new Date();

                      swG.name="Added at "+((d.getMonth()+1)+"/"+d.getDate()+"/"+d.getFullYear()+" "+currentTime());

                  }

                  for(var s=0; s<nonConflictingSwatches.length; s++){

                      var thisSw=nonConflictingSwatches[s];

                      if(thisSw.plating!='Process'){

                          var dsw=doc.spots.add();

                          if(thisSw.colorComp.typename=="LAB"){

                              dsw.colorType=ColorModel.SPOT;

                          }

                          dsw.color=function(){

                              if(thisSw.colorComp.typename=="RGB"){

                                  var c=new RGBColor();

                                  c.red=thisSw.colorComp.comp[0];

                                  c.green=thisSw.colorComp.comp[1];

                                  c.blue=thisSw.colorComp.comp[2];

                                  return c;

                              } else if(thisSw.colorComp.typename=="CMYK"){

                                  var c=new CMYKColor();

                                  c.cyan=thisSw.colorComp.comp[0];

                                  c.magenta=thisSw.colorComp.comp[1];

                                  c.yellow=thisSw.colorComp.comp[2];

                                  c.black=thisSw.colorComp.comp[3];

                                  return c;

                              } else if(thisSw.colorComp.typename=="LAB"){

                                  var c=new LabColor();

                                  c.l=thisSw.colorComp.comp[0];

                                  c.a=thisSw.colorComp.comp[1];

                                  c.b=thisSw.colorComp.comp[2];

                                  return c;

                              } else if(thisSw.colorComp.typename=="GRAY"){

                                  var c=new CMYKColor();

                                  c.cyan=0;

                                  c.magenta=0;

                                  c.yellow=0;

                                  c.black=thisSw.colorComp.comp[0];

                                  return c;

                              }

                          }();

                          dsw.name=thisSw.name;

                          if(thisSw.plating=="Spot"){

                              dsw.colorType=ColorModel.SPOT;

                          } else if(thisSw.plating=="GlobalProcess"){

                              dsw.colorType=ColorModel.PROCESS;

                          }

                          swG.addSpot(dsw);

                      } else {

                          var dsw=doc.swatches.add();

                          var color=function(){

                              if(thisSw.colorComp.typename=="RGB"){

                                  var c=new RGBColor();

                                  c.red=thisSw.colorComp.comp[0];

                                  c.green=thisSw.colorComp.comp[1];

                                  c.blue=thisSw.colorComp.comp[2];

                                  return c;

                              } else if(thisSw.colorComp.typename=="CMYK"){

                                  var c=new CMYKColor();

                                  c.cyan=thisSw.colorComp.comp[0];

                                  c.magenta=thisSw.colorComp.comp[1];

                                  c.yellow=thisSw.colorComp.comp[2];

                                  c.black=thisSw.colorComp.comp[3];

                                  return c;

                              } else if(thisSw.colorComp.typename=="GRAY"){

                                  var c=new GrayColor();

                                  c.gray=thisSw.colorComp.comp[0];

                                  return c;

                              }

                          }();

                          dsw.color=color;

                          dsw.name=thisSw.name;

                          swG.addSwatch(dsw);

                      }

                  }

                  outcome=outcome.toSource();

              } else {

                  alert("Please open a document with swatches.");

              }

          }

      //===================================================Used Objects========================//

          var BTOBJ={

              self: "BTOBJ",

              doNothing: asSourceString(doNothing),

              func_getAISwatchColor: asSourceString(getAISwatchColor, true),

              func_convertAppColor: asSourceString(convertAppColor, true),

              func_currentTime: asSourceString(currentTime, true),

              func_round2: asSourceString(round2, true),

              sessionSelection: null,

          };

          var ColorComp={

              CMYK:{typename:'CMYK', name:'', comp: [0,0,0,0]},

              RGB:{typename:'RGB', name:'', comp: [0,0,0]},

              LAB:{typename:'LAB', name:'', comp: [0,0,0]},

              GRAY:{typename:'GRAY', name:'', comp: [0]},

              NULL:{typename:'NULL', name:'None', comp:null},

          };

          function SwatchBox(elem){

              this.uiOrder=elem.order;

              this.name='none';

              this.elem=elem;

              this.colorComp=ColorComp.NULL;

              this.elem.parentObj=this; // access constructor through UI element.

              this.selected=false;

              this.instantiated=false;

              this.refresh=function(){

                  this.assignOnDraw(this.currentDrawingState);

                  this.elem.hide();  this.elem.show();

              }

              this.elem.helpTip='none';

              this.fillColor=[0.4,0.4,0.4];

              this.selectedMark={id: 'selected',

                  func:function(elem){

                      var g = elem.graphics;

                      var pen=g.newPen(g.PenType.SOLID_COLOR,[0,0,0,0.7],3);

                      g.rectPath(2, 2, 19, 19); g.strokePath(pen);

                      pen=g.newPen(g.PenType.SOLID_COLOR,[1,1,1,1],2);

                      g.newPath(); g.moveTo(2,7); g.lineTo(2,2); g.lineTo(7,2); g.strokePath(pen);

                      g.newPath(); g.moveTo(21,7); g.lineTo(21,2); g.lineTo(16,2); g.strokePath(pen);

                      g.newPath(); g.moveTo(2,16); g.lineTo(2,21); g.lineTo(7,21); g.strokePath(pen);

                      g.newPath(); g.moveTo(21,16); g.lineTo(21,21); g.lineTo(16,21); g.strokePath(pen);

                  }

              };

              this.coloredState={id:'colored',

                  func:function(elem){

                      var g = elem.graphics;

                      var pen=g.newPen(g.PenType.SOLID_COLOR,[0.7,0.7,0.7,1],1);

                      var brush=g.newBrush(g.BrushType.SOLID_COLOR,elem.parentObj.fillColor);

                      g.newPath(); g.moveTo(1,1); g.lineTo(22,1); g.lineTo(22,22); g.lineTo(1,22); g.closePath();

                      g.fillPath(brush); g.strokePath(pen);

                  }

              };

              this.noneState={id:'none',

                  func:function(elem){

                      var g = elem.graphics;

                      var pen=g.newPen(g.PenType.SOLID_COLOR,[0.7,0.7,0.7,1],1);

                      var brush=g.newBrush(g.BrushType.SOLID_COLOR,[0.4,0.4,0.4]);

                      g.newPath(); g.moveTo(1,1); g.lineTo(22,1); g.lineTo(22,22); g.lineTo(1,22); g.closePath();

                      g.strokePath(pen); g.fillPath(brush);

                  }

              };

              this.spotMark={id:'spot',

                  func:function(elem){

                      var g = elem.graphics;

                      var brush=g.newBrush(g.BrushType.SOLID_COLOR,[1,1,1]), pen=g.newPen(g.PenType.SOLID_COLOR,[0.7,0.7,0.7,1],1);

                      g.newPath(); g.moveTo(22,13); g.lineTo(22,22); g.lineTo(13,22); g.closePath();

                      g.fillPath(brush); g.strokePath(pen);

                      g.newPath();

                      brush=g.newBrush(g.BrushType.SOLID_COLOR,[0,0,0]);

                      g.ellipsePath(18,18,2,2); g.fillPath(brush);

                  }

              };

              this.globalMark={id:'global',

                  func:function(elem){

                      var g = elem.graphics;

                      var brush=g.newBrush(g.BrushType.SOLID_COLOR,[1,1,1]), pen=g.newPen(g.PenType.SOLID_COLOR,[0.7,0.7,0.7,1],1);

                      g.newPath(); g.moveTo(22,13); g.lineTo(22,22); g.lineTo(13,22); g.closePath();

                      g.fillPath(brush); g.strokePath(pen);

                  }

              };

              this.noteMark={id:'notes',

                  func:function(elem){

                      drawImg(noteMarkSrc, elem);

                  }

              };

              this.LABModel={id:'labmodel',

                  func:function(elem){

                      drawImg(labModelSrc, elem);

                  }

              };

              this.GRAYModel={id:'graymodel',

                  func:function(elem){

                      drawImg(grayModelSrc, elem);

                  }

              };

              this.CMYKModel={id:'cmykmodel',

                  func:function(elem){

                      drawImg(cmykModelSrc, elem);

                  }

              };

              this.RGBModel={id:'rgbmodel',

                  func:function(elem){

                      drawImg(rgbModelSrc, elem);

                  }

              };

              this.addDrawPhase=function(newPhase){

                  for(var x=0, ln=this.currentDrawingState.length; x<ln; x++){

                      if(this.currentDrawingState[x].id!=newPhase.id && x==ln-1){

                          this.currentDrawingState.push(newPhase);

                      }

                  }

              }

              this.removeDrawPhase=function(oldPhase){

                  for(var x=this.currentDrawingState.length-1; x>-1; x--){

                      if(this.currentDrawingState[x].id==oldPhase.id){

                          this.currentDrawingState.splice(x,1);

                      }

                  }

              }

              this.currentDrawingState=[this.noneState];

              this.assignOnDraw=function(aDrawings){

                  this.elem.onDraw=function(){

                      for(var d=0; d<aDrawings.length; d++){

                          aDrawings[d].func(this);

                      }

                  }

              }

              this.select=function(){

                  this.removeDrawPhase(this.selectedMark);

                  this.addDrawPhase(this.selectedMark);

                  this.selected=true;

                  this.refresh();

              }

              this.unselect=function(){

                  this.removeDrawPhase(this.selectedMark);

                  this.selected=false;

                  this.refresh();

              }

              this.reset=function(){

                  this.currentDrawingState=[this.noneState];

                  this.info={};

                  this.name='none';

                  this.elem.helpTip='none';

                  this.instantiated=false;

                  this.colorComp=ColorComp.NULL;

                  this.selected=false;

                  this.refresh();

              }

              this.getInfo=function(){

                  var msg='';

                  msg+='Name: '+this.name+"\rColor Model: "+this.colorComp.typename+"\r";

                  var clrCmp=this.colorComp;

                  var cmp=function(){

                      var cmp=clrCmp;

                      if(cmp.typename=="RGB"|| cmp.typename=="LAB"){

                          return 'Color Values: '+cmp.comp[0]+" , "+cmp.comp[1]+" , "+cmp.comp[2];

                      } else if(cmp.typename=="CMYK"){

                          return 'Color Values: '+cmp.comp[0]+" , "+cmp.comp[1]+" , "+cmp.comp[2]+" , "+cmp.comp[3];

                      } else if(cmp.typename=="GRAY"){

                          return 'Color Values: '+cmp.comp[0];

                      }

                      return '';

                  }();

                  msg+=cmp;

                  return msg;

              }

              this.info={};

              this.noteChange=currentTime();

          }

          var allSwatchBoxes=[];

          var SESSION={ //========================================================<<< SESSION object

              selection: [],

              options: {

                 showMode: true,

                 showNotes: true,

              },

              lastSelection: null,

              swatchBoxes: allSwatchBoxes,

              presetFolder: function(){

                  var dir;

                  if($.os.match('Windows')){

                      dir=Folder("~\\Documents\\Adobe Scripts\\Hobo Swatches");

                  } else {

                      dir=Folder(app.path+"/Hobo Swatches");

                  }

                  return dir;

              }(),

          };

      //===================================================UI Window========================//

          function ShowPalette(name){

              var w= new Window('palette',name,undefined,{closeButton:false}); w.margins=[1,1,1,1]; w.spacing=2; w.setBg([0.2,0.2,0.2]);

                  var g_0=w.add('group'); g_0.orientation='column'; g_0.margins=[1,1,1,1]; g_0.spacing=1;

                      var g_0_1=g_0.add('panel',undefined,'',{borderStyle:'sunken'}); g_0_1.size=[140,160]; g_0_1.margins=[0,1,1,0];

                      g_0_1.orientation='row'; g_0_1.spacing=1; g_0_1.alignChildren='top';

                      var swatchContainer=g_0_1.add('group'); swatchContainer.spacing=1;

                      swatchContainer.size=[123,260]; swatchContainer.margins=[0,0,0,0]; swatchContainer.orientation='column';

                      var swatchContObj={

                          swG_0: swatchContainer.add('group'),

                          swG_1: swatchContainer.add('group'),

                          swG_2: swatchContainer.add('group'),

                          swG_3: swatchContainer.add('group'),

                          swG_4: swatchContainer.add('group'),

                          swG_5: swatchContainer.add('group'),

                          swG_6: swatchContainer.add('group'),

                          swG_7: swatchContainer.add('group'),

                          swG_8: swatchContainer.add('group'),

                          swG_9: swatchContainer.add('group'),

                      }

                      for(all in swatchContObj){

                          swatchContObj[all].spacing=1;

                      }

                      for(var i=0; i<50; i++){// Setting up all 50 swatch slots.

                          var swP = swatchContObj[('swG_'+Math.floor((i/5)))].add('group'); swP.size=[24,24]; swP.order=i;

                          var thisSwatch=new SwatchBox(swP);

                          thisSwatch.assignOnDraw(thisSwatch.currentDrawingState);

                          thisSwatch.elem.addEventListener('mousedown',function(ev){

                              var subj=this.parentObj;

                              var keyState=env.keyboardState;

                              if(keyState.ctrlKey==false && keyState.shiftKey==false && keyState.metaKey==false && keyState.altKey==false){

                                  nameD.text=subj.name;

                                  subj.select();

                                  SESSION.selection=[subj];

                                  for(var j=0; j<allSwatchBoxes.length; j++){

                                      var thisBox=allSwatchBoxes[j];

                                      if(thisBox.selected==true && thisBox!=subj){

                                          thisBox.unselect();

                                      }

                                  }

                              } else if(keyState.shiftKey==true){

                                  SESSION.nameDisplay.text=subj.name;

                                  if(subj.selected==false){

                                      subj.select();

                                      SESSION.selection.push(subj);

                                      SESSION.selection.sort(function(a,b){return a.uiOrder-b.uiOrder});

                                  }

                                  if(SESSION.lastSelection!=null){

                                      if(ev.target.parentObj.uiOrder > SESSION.lastSelection.uiOrder){

                                          var indA = SESSION.lastSelection.uiOrder, indB = ev.target.parentObj.uiOrder;

                                      } else {

                                          var indA = ev.target.parentObj.uiOrder, indB = SESSION.lastSelection.uiOrder;

                                      }

                                      for(var s=0; s<allSwatchBoxes.length; s++){

                                          if(s>indA && s<indB){

                                              var thisBox=allSwatchBoxes[s];

                                              if(thisBox.selected==false){

                                                  thisBox.select();

                                                  SESSION.selection.push(thisBox);

                                              }

                                          }

                                      }

                                  SESSION.selection.sort(function(a,b){return a.uiOrder-b.uiOrder});

                                  }

                              } else if(keyState.ctrlKey==true || keyState.metaKey==true){

                                  if(subj.selected==false){

                                      nameD.text=subj.name;

                                      subj.select();

                                      SESSION.selection.push(subj);

                                      SESSION.lastSelection=subj;

                                  } else if(subj.selected==true){

                                      subj.unselect();

                                      for(var j=0; j<SESSION.selection.length; j++){

                                          var thisBox=SESSION.selection[j];

                                          if(thisBox==subj){

                                              SESSION.selection.splice(j,1);

                                              break;

                                          }

                                      }

                                  }

                              } else if(keyState.altKey==true && subj.selected==true && subj.name!='none'){

                                  var infoDisp=function(){

                                      var w=new Window('dialog',subj.name+" Swatch Info"); w.margins=[4,8,4,4]; w.spacing=2;

                                      swatchInfoBox(subj, w);

                                      var okBtn=w.add('button',undefined,'Ok'); okBtn.size=[340,22];

                                      okBtn.onClick=function(){

                                          w.close();

                                      };

                                      w.show();

                                  }();

                                  if(subj.info.notes!='' && SESSION.options.showNotes==true){

                                      for(var i=0; i<subj.currentDrawingState.length; i++){

                                          if(subj.currentDrawingState[i].id=='notes'){

                                              break;

                                          } else if(i==subj.currentDrawingState.length-1 && subj.currentDrawingState[i].id!='notes'){

                                              subj.addDrawPhase(subj.noteMark);

                                              subj.refresh();

                                          }

                                      }

                                  } else if(SESSION.options.showNotes==false || subj.info.notes==''){

                                      for(var i=0; i<subj.currentDrawingState.length; i++){

                                          if(subj.currentDrawingState[i].id=='notes'){

                                              subj.removeDrawPhase(subj.currentDrawingState[i]);

                                              subj.refresh();

                                              break;

                                          }

                                      }

                                  }

                              }

                              if(SESSION.selection.length>1){

                                  nameD.text="--Multi-Selection: "+SESSION.selection.length+"--"; SESSION.lastSelection=SESSION.selection[0];

                              } else if(SESSION.selection.length==1){

                                  nameD.text=SESSION.selection[0].name; SESSION.lastSelection=SESSION.selection[0];

                              }  else if(SESSION.selection.length==0){

                                  nameD.text=''; SESSION.lastSelection=null;

                              }

                          });

                          allSwatchBoxes.push(thisSwatch);

                      }

                      var g_0_1_scrl=g_0_1.add('scrollbar'); g_0_1_scrl.size=[10,152];

              var g_0_2=g_0.add('group'); g_0_2.indent=1;

                  var nameD=g_0_2.add('edittext',undefined,'',{readonly:true}); nameD.size=[140,20]; nameD.setBg([1,1,1]);

                  SESSION.nameDisplay=nameD;

              var btnG=g_0.add('group'); btnG.margins=[1,1,1,1]; btnG.spacing=2;

                  var infoBtn=btnG.add('button',undefined,'I'); infoBtn.size=[26,20];

                      infoBtn.helpTip='Get swatch info';

                      infoBtn.onDraw=function(){

                          btnSkin(this,[0.9,0.8,0.3],26,20);

                          drawImg(infoBtnSrc, this);

                      }

                  var addToDocBtn=btnG.add('button',undefined,'T'); addToDocBtn.size=[26,20];

                      addToDocBtn.helpTip='Add selected swatches to current document';

                      addToDocBtn.onDraw=function(){

                          btnSkin(this,[0.3,0.8,0.9],26,20);

                          drawImg (addToDocBtnSrc, this)

                      }

                  var addBtn=btnG.add('button',undefined,'A'); addBtn.size=[26,20];

                      addBtn.helpTip='Add swatch from current document to this palette';

                      addBtn.onDraw=function(){

                          btnSkin(this,[0.4,0.8,0.4],26,20);

                          drawImg(addBtnSrc, this);

                      }

                  var rmvBtn=btnG.add('button',undefined,'R'); rmvBtn.size=[26,20];

                      rmvBtn.helpTip='Remove current selected swatch from this palette';

                      rmvBtn.onDraw=function(){

                          btnSkin(this,[0.6,0.2,0.3],26,20);

                          drawImg(rmvBtnSrc, this);

                      }

              var btnG_2=g_0.add('group'); btnG_2.margins=[1,1,1,1]; btnG_2.spacing=2;

                  var rstBtn=btnG_2.add('button',undefined,'Reset'); rstBtn.size=[65,20];

                      rstBtn.helpTip='RESET all Hobo Swatches to "none"';

                      rstBtn.onDraw=function(){

                          btnSkin(this,[1,0.6,0.2],65,20);

                          drawImg(rstBtnSrc,this);

                      }

                  var okBtn=btnG_2.add('button',undefined,'Close'); okBtn.size=[65,20];

                      okBtn.helpTip='Close this palette';

                      okBtn.onDraw=function(){

                          btnSkin(this,[0.8,0.2,0.2],65,20);

                          drawImg(okBtnSrc,this);

                      }

              g_0_1_scrl.onChange=function(){ // Need both of them for mousewheels and clicks.

                  swatchContainer.location=[0,1-(this.value/100*96)];

              }

              g_0_1_scrl.onChanging=function(){

                  swatchContainer.location=[0,1-(this.value/100*96)];

              }

              addBtn.onClick=function(){

                  if(SESSION.selection.length>0){

                      sendBTmsg(bt_func, BTOBJ, bt_func_rt, [SESSION]);

                      SESSION.nameDisplay.text=SESSION.selection[0].name;

                  } else {

                      alert("Please allocate cells to fill with your document swatches.");

                  }

              }

              rmvBtn.onClick=function(){

                  if(SESSION.selection.length>0){

                      if(SESSION.selection.length<2){

                          var sw=SESSION.selection[0];

                          sw.reset(); sw.selected=true; sw.addDrawPhase(sw.selectedMark); sw.refresh; nameD.text=sw.name; sw.elem.helpTip=sw.name;

                      } else {

                          for(var s=SESSION.selection.length-1; s>-1; s--){

                              var sw=SESSION.selection[s];

                              sw.reset(); sw.selected=true; sw.addDrawPhase(sw.selectedMark); sw.refresh; sw.elem.helpTip=sw.name;

                          }

                          nameD.text=sw.name;

                      }

                  }

              }

              infoBtn.onClick=function(){

                  var sessionUpdate=infoWindow(SESSION);

                  if(sessionUpdate.showMode!=SESSION.options.showMode || sessionUpdate.showNotes != SESSION.options.showNotes || sessionUpdate.noteChange==true){

                      SESSION.options.showMode=sessionUpdate.showMode;

                      SESSION.options.showNotes=sessionUpdate.showNotes;

                      for(var s=allSwatchBoxes.length-1; s>-1; s--){

                          var thisBox=allSwatchBoxes[s];

                          var dState=thisBox.currentDrawingState;

                          if(SESSION.options.showMode==false){

                              for(var c=dState.length-1; c>-1; c--){

                                  if(dState[c].id.match('model')){

                                      thisBox.removeDrawPhase(dState[c]);

                                  }

                              }

                          } else {

                              for(var c=dState.length-1; c>-1; c--){

                                  if(dState[c].id.match('model')){

                                      thisBox.removeDrawPhase(dState[c]);

                                  }

                              }

                              if(thisBox.colorComp.typename!="NULL"){

                                  thisBox.addDrawPhase(thisBox[thisBox.colorComp.typename+"Model"]);

                              }

                          }

                          if(thisBox.info && thisBox.info.hasOwnProperty('notes')){

                              if(SESSION.options.showNotes==false || thisBox.info.notes==''){

                                  for(var c=dState.length-1; c>-1; c--){

                                      if(dState[c].id=='notes'){

                                          thisBox.removeDrawPhase(dState[c]);

                                      }

                                  }

                              } else if(SESSION.options.showNotes==true && thisBox.info.notes!=''){

                                  for(var c=dState.length-1; c>-1; c--){

                                      if(dState[c].id=='notes'){

                                          break;

                                      } else if(dState[c].id!='notes' && c==0){

                                          thisBox.addDrawPhase(thisBox.noteMark);

                                      }

                                  }

                              }

                          }

                          thisBox.refresh();

                      }

                  }

              }

              rstBtn.onClick=function(){

                  if(confirm('Are you sure you want to reset the whole Hobo Swatch palette?',true,'Confirm this action:')==true){

                      for(var i=0; i<allSwatchBoxes.length; i++){

                          var thisBox=allSwatchBoxes[i];

                          thisBox.reset();

                      }

                      nameD.text='';

                      SESSION.selection=[];

                  }

              }

       

       

              addToDocBtn.onClick=function(){

                  var validOnes=function(){

                      var arr=[];

                      for(var s=0; s<SESSION.selection.length; s++){

                          if(SESSION.selection[s].instantiated==true){

                              arr.push(SESSION.selection[s]);

                          }

                      }

                      return arr;

                  }();

                  if(validOnes.length>0){

                      BTOBJ.sessionSelection=function(){

                          var arr=[];

                          for(var s=0; s<validOnes.length; s++){

                              var sw=validOnes[s];

                              arr.push({

                                  name: sw.name, colorComp: sw.colorComp, plating: sw.info.plating,

                              });

                          }

                          return arr.toSource();

                      }();

                      sendBTmsg(bt_func_2, BTOBJ);

                  } else {

                      alert("Please select some existing swatches first.");

                  }

              }

              okBtn.onClick=function(){

                  if(confirm('Are you sure you want completely close the Hobo Swatch palette?',true,'Confirm this action:')==true){

                      w.close();

                  }

              }

              this.show=function(){w.show()};

          };

          var mainWindow = new ShowPalette('Hobo Swatches™');

          mainWindow.show();

          // Load from Preset XML on startup.

          var presetFile=File(SESSION.presetFolder+"/HoboSwatchSession.xml");

          if(presetFile.exists){

              try{

                  var swXmlArr=getXmlSwatchesArr(presetFile);

                  for(var i=0; i<swXmlArr.length; i++){

                      if(allSwatchBoxes[i] && swXmlArr[i].name!='none'){

                          var thisSw=allSwatchBoxes[i], thisInfo=swXmlArr[i];

                          var colorMode=thisInfo.colorComp.mode.toString(), colorArr=thisInfo.colorComp.comp;

                          var altClrs=[

                              thisSw.rgbClr=convertAppColor(colorMode, "RGB", colorArr),

                              thisSw.cmykClr=convertAppColor(colorMode, "CMYK", colorArr),

                              thisSw.grayClr=convertAppColor(colorMode, "GrayScale", colorArr),

                              thisSw.labClr=convertAppColor(colorMode, "LAB", colorArr),

                          ];

                          for(var c=0; c<altClrs.length; c++){

                              for(var d=0; d<altClrs[c].length; d++){

                                  altClrs[c][d]=round2(altClrs[c][d]);

                              }

                          }

                          initSwatch(SESSION, thisSw, thisInfo.name, thisInfo.colorComp.mode,

                          thisInfo.colorComp.comp, getUIRGB(colorMode,colorArr),

                              {plating: thisInfo.aiSwatchKind,

                                  originDoc: thisInfo.originDoc,

                                  altClrs:{rgbClr:thisSw.rgbClr,cmykClr:thisSw.cmykClr,labClr:thisSw.labClr,grayClr:thisSw. grayClr},

                                  notes: thisInfo.notes,

                              }

                          );

                          SESSION.selection=[];

                          SESSION.nameDisplay.text='';

                      }

                  }

              } catch(e){

                  alert(e,'Uhoh!');

              }

          }

      }

      #target illustrator

      #targetengine main

      swatchPalette();