void OnDisable()
 {
     if(atkWindow != null)
     {
         atkWindow.Close();
         atkWindow = null;
     }
         
 }
    void OnDisable()
    {
        if (unitListWindow != null)
        {
            unitListWindow.Close();
            unitListWindow = null;
        }
            
        if (atkListWindow != null)
        {
            atkListWindow.Close();
            atkListWindow = null;
        }

        if(maskWindow != null)
        {
            maskWindow.Close();
            maskWindow = null;
        }
            
    }
    /******SPELL******************************/
    void showSpellCardInfo()
    {
        if (GUILayout.Button("Attack List"))
        {
            AttackListWindow.CardEdit(true);
            atkListWindow = (AttackListWindow)EditorWindow.GetWindow(typeof(AttackListWindow));
        }

        currentAtk = atkDataList.findByID(cardDataList.cardList[toggledIndex].linkedTo);

        if (currentAtk != null)
        {
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel(currentAtk.aName);
            EditorGUILayout.TextField("Pattern: " + currentAtk.pattern, GUILayout.ExpandWidth(false));
            EditorGUILayout.TextField("Damage: " + currentAtk.expectedMin + " - " + currentAtk.expectedMax, GUILayout.ExpandWidth(false));
            EditorGUILayout.TextField("Range: " + currentAtk.range, GUILayout.ExpandWidth(false));
            EditorGUILayout.EndHorizontal();
        }
        else
            EditorGUILayout.LabelField("No Attack selected", EditorStyles.boldLabel);
    }
    void OnGUI()
    {
        /***********************************/
        //Header
        /***********************************/

        GUILayout.Label("Unit Data Editor", EditorStyles.boldLabel);
        if (unitDataList == null)
        {
            EditorGUILayout.LabelField("No Attack database available, error.");
        }

        /******************************************/
        //Sanity Checks and setups
        /******************************************/

        GUILayout.Space(20);

        if (unitDataList.unitList == null)
        {
            Debug.Log("New List was made");
            unitDataList.unitList = new List<UnitData>();
            toggledIndex = 0;
        }

        if (buttonToggled == null || buttonToggled.Count < unitDataList.unitList.Count)
        {
            buttonToggled = new List<bool>();
            toggledIndex = 0;
            for (int i = 0; i < unitDataList.unitList.Count; i++)
                buttonToggled.Add(false);
        }

        if (toggledIndex > unitDataList.unitList.Count)
        {
            Debug.Log("Index was out of bounds");
            toggledIndex = unitDataList.unitList.Count - 1;
        }

        /************************************************************/

        /******************************************/
        //Display things
        /******************************************/
        if (unitDataList != null)
        {
            GUILayout.BeginHorizontal();
            GUILayout.Space(10);

            if (GUILayout.Button("Prev", GUILayout.ExpandWidth(false)))
            {
                findPrev();
            }
            GUILayout.Space(5);
            if (GUILayout.Button("Next", GUILayout.ExpandWidth(false)))
            {
                findNext();
            }

            GUILayout.Space(60);

            if (GUILayout.Button("Add Item", GUILayout.ExpandWidth(false)))
            {
                AddUnit();
                unitDataList.unitList[toggledIndex].uType = filterType;

            }
            if (GUILayout.Button("Delete Item", GUILayout.ExpandWidth(false)))
            {
                DeleteUnit(toggledIndex);
            }

            filterType = (UnitTypes)EditorGUILayout.EnumPopup(filterType);

            if (GUILayout.Button("Sort", GUILayout.ExpandWidth(false)))
            {
                sortByName();
            }

            GUILayout.EndHorizontal();
            if (unitDataList.unitList == null)
            {
                Debug.Log("Mistakes were made - You should never reach this");
            }  

            /****************************************/
            //How the list will look
            /***************************************/
            
            if (unitDataList.unitList.Count > 0)
            {
                if (unitDataList.unitList[toggledIndex].uType != filterType)
                {
                    toggledIndex = 0;
                    findNext();
                }

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.BeginVertical();
                //----------Show all the buttons-----------
                showScrollButtons();
                //-----------------------------------------
                EditorGUILayout.EndVertical();
                GUILayout.Space(5);


                EditorGUILayout.BeginVertical();
                //---------Current selection info-----------
                statScroll = GUILayout.BeginScrollView(statScroll,false, false);

                GUILayout.BeginHorizontal();
                unitDataList.unitList[toggledIndex].uName = EditorGUILayout.TextField("Unit Name", unitDataList.unitList[toggledIndex].uName);
                unitDataList.unitList[toggledIndex].uType = (UnitTypes)EditorGUILayout.EnumPopup("Unit Type", unitDataList.unitList[toggledIndex].uType);
                if (unitDataList.unitList[toggledIndex].uType != filterType)
                    filterType = unitDataList.unitList[toggledIndex].uType;
                GUILayout.EndHorizontal();

                GUILayout.Space(5);

                unitDataList.unitList[toggledIndex].isHero = EditorGUILayout.Toggle("Hero", unitDataList.unitList[toggledIndex].isHero, GUILayout.ExpandWidth(false));
                GUILayout.Space(10);

                EditorGUILayout.LabelField("Stats", EditorStyles.boldLabel);
                unitDataList.unitList[toggledIndex].maxHp = EditorGUILayout.IntField("HP", unitDataList.unitList[toggledIndex].maxHp, GUILayout.ExpandWidth(false));
                unitDataList.unitList[toggledIndex].maxSpeed = EditorGUILayout.Slider("Speed", unitDataList.unitList[toggledIndex].maxSpeed, 5, 20, GUILayout.ExpandWidth(false));
                
                if (unitDataList.unitList[toggledIndex].isHero)
                {
                    unitDataList.unitList[toggledIndex].impulse = EditorGUILayout.IntSlider("Impulse", unitDataList.unitList[toggledIndex].impulse, 3, 6, GUILayout.ExpandWidth(false));
                    unitDataList.unitList[toggledIndex].memory = EditorGUILayout.IntSlider("Memory", unitDataList.unitList[toggledIndex].memory, 0, 5, GUILayout.ExpandWidth(false));
                }
                
                /*****************************************/
                //Atk/Def Factors
                /*****************************************/
                EditorGUILayout.Space();
                
                showFactors = EditorGUILayout.Foldout(showFactors, "Type Factors");
                
                if (showFactors)
                {
                    GUILayout.BeginHorizontal();
                    EditorGUILayout.LabelField("Attack Factors");
                    EditorGUILayout.LabelField("Defence Factors");
                    GUILayout.EndHorizontal();
                    for (int i = 0; i < (int)DamageType.TOTAL; i++)
                    {
                        GUILayout.BeginHorizontal();
                        unitDataList.unitList[toggledIndex].typeAtk[i] = EditorGUILayout.Slider(Enum.GetName(typeof(DamageType), i), unitDataList.unitList[toggledIndex].typeAtk[i], 0.5f, 2.0f);
                        unitDataList.unitList[toggledIndex].typeDef[i] = EditorGUILayout.Slider(Enum.GetName(typeof(DamageType), i), unitDataList.unitList[toggledIndex].typeDef[i], 0.5f, 2.0f);
                        GUILayout.EndHorizontal();
                    }
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("Reset Attack Factors"))
                        for (int i = 0; i < (int)DamageType.TOTAL; i++)
                        {
                            unitDataList.unitList[toggledIndex].typeAtk[i] = 1.0f;
                        }
                    if (GUILayout.Button("Reset Defence Factors"))
                        for (int i = 0; i < (int)DamageType.TOTAL; i++)
                        {
                            unitDataList.unitList[toggledIndex].typeDef[i] = 1.0f;
                        }
                    GUILayout.EndHorizontal();
                    
                }

                GUILayout.EndScrollView();


                /*************************************/
                //UnitAttack WindowSpawn
                /************************************/
                GUILayout.Space(10);
                EditorGUILayout.LabelField("Unit Attacks", EditorStyles.boldLabel);

                atkScroll = EditorGUILayout.BeginScrollView(atkScroll, GUILayout.Height(120));
                foreach(string x in unitDataList.unitList[toggledIndex].attacksData.ToList<String>())
                {
                    AttackData knownAtk = atkDataList.findByID(x);
                    if(knownAtk != null)
                    {
                        EditorGUILayout.BeginHorizontal();
                        //EditorGUILayout.PrefixLabel(knownAtk.aName);
                        showAttackSummary(knownAtk);
                        if (GUILayout.Button("Remove", GUILayout.Width(120f)))
                            RemoveAttack((toggledIndex), x);
                        EditorGUILayout.EndHorizontal();
                    }       
                }
                EditorGUILayout.EndScrollView();

                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Attack List"))
                {
                    AttackListWindow.CardEdit(false);
                    atkWindow = (AttackListWindow)EditorWindow.GetWindow(typeof(AttackListWindow));
                }


                if (GUILayout.Button("Clear Residual Data"))
                    refreshUnitsAttackLists();
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.EndVertical();
                GUILayout.EndHorizontal();

            }
            else
            {
                GUILayout.Label("This Unit List is Empty.");
            }

            if (GUI.changed)
            {
                EditorUtility.SetDirty(unitDataList);
            }
        }
    }