/**
====================================================================================================================================
     ****** LyReName_Set ******

     複数選択したレイヤーの名前を一気に変換

 
     あらかじめ登録された名前を選択するか、新たに名前を付けることが出来る。
     
     下記にある[ReName Set]内に追加、削除することで登録数は増減できる。
     必ず番号は間を飛ばさないで続き番号にすること。
      
     記入形式
        ReLyName[番号] = "登録するレイヤー名(日本語でも可)";
    
   
    ※書き換えた後は文字コードを[UTF-8]で上書き保存。 
    
       
   
    ==不具合アリマス==
     元の選択状態とは違う状態で完了する場合があります。

     
     2008.0919

====================================================================================================================================
*/


//========ReName Set==========================================================================================================================

var ReLyName = new Array();
var valReLyName = null;

ReLyName[0] = "レイヤー名を登録1";
ReLyName[1] = "レイヤー名を登録2";
ReLyName[2] = "レイヤー名を登録3";
ReLyName[3] = "レイヤー名を登録4";
ReLyName[4] = "レイヤー名を登録5";
ReLyName[5] = "レイヤー名を登録6";
ReLyName[6] = "レイヤー名を登録7";
ReLyName[7] = "レイヤー名を登録8";
ReLyName[8] = "レイヤー名を登録9";
ReLyName[9] = "レイヤー名を登録10";
ReLyName[10] = "レイヤー名を登録11";
ReLyName[11] = "レイヤー名を登録12";
ReLyName[12] = "レイヤー名を登録13";
ReLyName[13] = "レイヤー名を登録14";
ReLyName[14] = "レイヤー名を登録15";

var numReLyName = ReLyName.length;

// ============================================================================================================================================



var linkLys = new Array();
var linkSets = new Array();
var valLink = new Array();

var actDoc = activeDocument;
var actLy = actDoc.activeLayer;
var selLinkLys = new Array();
var resLys = new Array();
var dumNames = new Array();
var visLys = new Array();
var motoNames = new Array();
var motoLinkName = new Array();
var OneSelLys = new Array();
var TwoSelLys = new Array();
var valAlert = false;




//========Main Script============================================================================================================================

MyDialog();

if(valAlert == false)
{

     //alert(valReLyName);	

     if(valReLyName == null)
     {
	     alert("******新しい名前がありません******");
     }else{

            SearchLinked(actDoc,0,0);


            UnLinkSelLys();

            try
            {
                LinkSelLys();
            }
            catch(e)
            {
            }
            finally
            {
            }

           SelLy();
      

                UnLinkSelLys();


                LyReName_One();

	
                ReLinked();
     
     
                LyReName_Two();


                ReSelected();
           

     }
}


// ===========FUNCTION=========================================================================================================================

function SearchLinked(layObj, indent,u)
{
//元のリンク状態を取得
     var i,k;
     nn=0;
     var n = layObj.artLayers.length;
     for (i=0; i<n; i++)
     {
          linkLys = layObj.artLayers[i].linkedLayers;
          if(linkLys.length > 0)
          {
               valLink[u] = linkLys;
	           valLink[u].push(layObj.artLayers[i]);
	           nn++;
	           u++;

          }
     }
     
     var ns = layObj.layerSets.length;
     for (i=0; i<ns; i++)
     {
          for (k=0; k<indent; k++);
          linkSets = layObj.layerSets[i].linkedLayers;
          if(linkSets.length > 0)
          {

	           valLink[u] = linkSets;
	           valLnk[u].push(layObj.layerSets[i]);
	           u++;
	           
	      }
         SearchLinked(layObj.layerSets[i],indent+1,u);
     }
}

// =========================================================================================================================

function MyDialog()
{
     mDlg = new Window("dialog","ReName Set",[200,80,580,(120+(10*numReLyName))]);
     grpDlg = mDlg.add("group",[20,20,570,(30+(30*numReLyName))]);
     okBtn = mDlg.add("button",[130,(10*numReLyName),225,(30+(10*numReLyName))], "OK!", { name:"ok"});
     clBtn = mDlg.add("button",[250,(10*numReLyName),345,(30+(10*numReLyName))], "CANCEL!", { name:"cancel"});

     DDname = grpDlg.add( "statictext" , [20,0,140,15] , "登録の中から選択" ); DDname.justify="left";
     lyDD = grpDlg.add("dropdownlist",[20,20,140,40], ReLyName);
     
     EDname = grpDlg.add( "statictext" , [150,0,350,15] , "新規リネーム" ); EDname.justify="left";
     lyEdit = grpDlg.add("edittext",[150,20,350,40], "リネームレイヤー名",enterKeySignalOnChange=true);
     lyEdit.active = true;
     
	 lyDD.onChange = function()
	                      {
	                      	var valItem = lyDD.selection;
	                      	//alert(valItem);
	                      	valReLyName = valItem ;
	                      }
     
     ClickOK();
     ClickCL();
                          
     mDlg.center();
     mDlg.show();

}

// =========================================================================================================================

function ClickOK()
{
	 okBtn.onClick = function()
	                     {
	                      	mDlg.close();
	
                                        if(lyEdit.text != "リネームレイヤー名")
                                        {
	                                         valReLyName = lyEdit.text;
	                                    }
	                      }
}

// =========================================================================================================================

function ClickCL()
{
	 clBtn.onClick = function()
	                     {
	                      	mDlg.close();
	                      	
	                      	//alert("******キャンセルされました******");
	                      	valAlert = true;
	
	                      }
}

// =========================================================================================================================

function LyReName_One()
{

     nresLys = resLys.length;
     for(q=0;q<nresLys;q++)
     {

          actDoc.activeLayer = resLys[nresLys-1];
          actDoc.activeLayer = resLys[q];

//選択レイヤーの名前を一時リネーム

          actDoc.activeLayer.name = "ChangeName" +q;
          
          OneSelLys[q] = actDoc.activeLayer;
     }

}

// =========================================================================================================================

function LyReName_Two()
{

     nOneSelLys = OneSelLys.length;
     for(qq=0;qq<nOneSelLys;qq++)
     {

          actDoc.activeLayer = OneSelLys[nOneSelLys-1];
          actDoc.activeLayer = OneSelLys[qq];

//選択レイヤーの名前をリネーム

          actDoc.activeLayer.name = valReLyName;
          
          TwoSelLys[qq] = actDoc.activeLayer;

//非表示だったものを復元
          if(visLys[qq] == false)
          {
                    resLys[qq].visible = false;
          }
     }
}

// =========================================================================================================================
function LinkSelLys()
{
//選択レイヤーをリンク付け
    var lID1 = stringIDToTypeID( "linkSelectedLayers" );
    var lDesc1 = new ActionDescriptor();
    var lID2 = charIDToTypeID( "null" );
    var lRef1 = new ActionReference();
    var lID3 = charIDToTypeID( "Lyr " );
    var lID4 = charIDToTypeID( "Ordn" );
    var lID5 = charIDToTypeID( "Trgt" );
    lRef1.putEnumerated( lID3, lID4, lID5 );
    lDesc1.putReference( lID2, lRef1 );
    executeAction( lID1, lDesc1, DialogModes.NO );

}

// =========================================================================================================================

function UnLinkSelLys()
{
//選択レイヤーのリンク解除
    var uID1 = stringIDToTypeID( "unlinkSelectedLayers" );
    var uDesc1 = new ActionDescriptor();
    var uID2 = charIDToTypeID( "null" );
    var uRef1 = new ActionReference();
    var uID3 = charIDToTypeID( "Lyr " );
    var uID4 = charIDToTypeID( "Ordn" );
    var uID5 = charIDToTypeID( "Trgt" );
    uRef1.putEnumerated( uID3, uID4, uID5 );
    uDesc1.putReference( uID2, uRef1 );
    executeAction( uID1, uDesc1, DialogModes.NO );

}

// =========================================================================================================================

function SelLy()
{
//リンクされたレイヤーを取得
     selLinkLys = actLy.linkedLayers;
     nactLy = selLinkLys.length;
     resLys[0] = actLy;
     u=1;

     for(i=0;i<nactLy;i++)
     {
          resLys[u] = selLinkLys[i];
          u++;
     }
}

// =========================================================================================================================

function VisLy()
{
//非表示レイヤーを表示
     nresLys = resLys.length;
     for(i=0;i<nresLys;i++)
     {
          visLys[i] = resLys[i].visible;
          //alert(visLys[i]);
          resLys[i].visible = true;
     }
}

// =========================================================================================================================

function ReLinked()
{
//リンクを元の状態に復元
     nVal = valLink.length;
     for(uu=0;uu<nVal;uu++)
     {
	     for(uuu=0;uuu<valLink[uu].length;uuu++)
	     {
              //alert(valLink[uu][uuu]);
      
         //リンクの重複を回避
              if(valLink[uu][uuu].linkedLayers.length == 0)
              {
              	//選択レイヤーの名前を一時変更(同じ名前が複数あった場合に"LinkSelLys()"に都合が悪い為)
              	   motoLinkName[0] = valLink[uu][0].name;
              	   valLink[uu][0].name = uu+"chgLinkName0";
      	           activeDocument.activeLayer = valLink[uu][0];
      	           for(p=1;p<valLink[uu].length;p++)
      	           {
      	           	    motoLinkName[p] = valLink[uu][p].name;
      	           	    valLink[uu][p].name = uu+"chgLinkName"+p;     	  
      	           }
      	            
      	            for(ppp=0;ppp<valLink[uu].length;ppp++)
      	            {
      	            	sl3Name = valLink[uu][ppp].name;
      	         //トグル選択
      	            	ToggleSelect(sl3Name);
      	            }
      	            
      	            UnLinkSelLys();
      	            
      	           try
      	           {
      	                LinkSelLys();      	
      	           }
      	           catch(e)
      	           {
      	           }
      	           finally
      	           {
      	           }
      	           
      	           for(pp=0;pp<valLink[uu].length;pp++)
      	           {
      	       //元の名前に復元
      	           	activeDocument.activeLayer = valLink[uu][valLink[uu].length-1];
      	           	valLink[uu][pp].name = motoLinkName[pp];
      	           }
      	           
               }
	     }
	      //alert("************");
     }
}

// =========================================================================================================================

function ToggleSelect(TslName)
{
//トグル選択(Ctrl+Click)
    var oID12 = charIDToTypeID( "slct" );
    var oDesc3 = new ActionDescriptor();
    var oID13 = charIDToTypeID( "null" );
    var oRef3 = new ActionReference();
    var oID14 = charIDToTypeID( "Lyr " );
    oRef3.putName( oID14, TslName );
    oDesc3.putReference( oID13, oRef3 );
    var oID15 = stringIDToTypeID( "selectionModifier" );
    var oID16 = stringIDToTypeID( "selectionModifierType" );
    var oID17 = stringIDToTypeID( "addToSelection" );
    oDesc3.putEnumerated( oID15, oID16, oID17 );
    var oID18 = charIDToTypeID( "MkVs" );
    oDesc3.putBoolean( oID18, false );
    executeAction( oID12, oDesc3, DialogModes.NO );

}

// =========================================================================================================================

function ReSelected()
{
//元のレイヤー選択状態に復元
	activeDocument.activeLayer = TwoSelLys[0];
	for(g=1;g<TwoSelLys.length;g++)
	{
		sl3Name = TwoSelLys[g].name;
		ToggleSelect(sl3Name);
	}

}

// ===========END FUNCTION=========================================================================================================================