Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Code Status: draft 2014-10-31
- //File: AppScript.cs
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Xml;
- using System.Xml.Serialization;
- using UnityEngine;
- public class AppScript : MonoBehaviour
- {
- private ConfigInfo _Config;
- private bool _IsExistConfig;
- //string _UserConfigFile = Application.persistentDataPath & Path.DirectorySeparatorChar & "Config.xml";
- private string _UserConfigFile;
- private Uri _BaseUri;
- private XmlDocument _Document;
- private string _FormID;
- private string _FormID2;
- private Dictionary<string, string> _FromData;
- private Dictionary<string, string> _headers;
- private Dictionary<string, Texture2D> _uiTexture2D;
- private Dictionary<string, GUIStyle> _uiStyle;
- private Vector2 _baseSize;
- private Vector2 _scale;
- //private void Awake()
- //{
- // Debug.Log("Awake called.");
- //}
- private void Start()
- {
- _IsExistConfig = false;
- //_UserConfigFile = Path.Combine(Application.persistentDataPath, "Config.xml");
- _UserConfigFile = Application.persistentDataPath + "/Config.xml";
- if (Path.DirectorySeparatorChar != '/')
- _UserConfigFile = _UserConfigFile.Replace('/', Path.DirectorySeparatorChar);
- _BaseUri = new Uri("http://app.test.com.tw/");
- _Document = new XmlDocument();
- _FormID = "";
- _FromData = new Dictionary<string, string>();
- _headers = new Dictionary<string, string>();
- _uiTexture2D = new Dictionary<string, Texture2D>();
- _uiStyle = new Dictionary<string, GUIStyle>();
- _baseSize = new Vector2(640, 960);
- _scale = new Vector2((float)Screen.width / _baseSize.x, (float)Screen.height / _baseSize.y);
- switch (Application.platform)
- {
- case RuntimePlatform.WindowsPlayer:
- case RuntimePlatform.WindowsWebPlayer:
- case RuntimePlatform.WindowsEditor:
- break;
- case RuntimePlatform.WP8Player:
- break;
- case RuntimePlatform.Android:
- break;
- case RuntimePlatform.OSXDashboardPlayer:
- case RuntimePlatform.OSXPlayer:
- case RuntimePlatform.OSXWebPlayer:
- case RuntimePlatform.IPhonePlayer:
- break;
- default:
- break;
- }
- FileInfo info = new FileInfo(_UserConfigFile);
- if (info == null || info.Exists == false)
- {
- _IsExistConfig = false;
- _FormID2 = "Config";
- }
- else
- {
- _IsExistConfig = true;
- _FormID2 = "MainMenu";
- loadConfig();
- }
- }
- // Update is called once per frame
- private void Update()
- {
- }
- private void OnGUI()
- {
- //GUIUtility.ScaleAroundPivot(_scale, Vector2.zero);
- //GUI.Label(new Rect(0, 0, 6000, 20), Application.persistentDataPath);
- xmlForm();
- }
- private void loadConfig()
- {
- using (FileStream fs = new FileStream(_UserConfigFile, FileMode.Open, FileAccess.Read, FileShare.Read))
- {
- XmlDocument doc = new XmlDocument();
- doc.Load(fs);
- XmlReader reader = new XmlNodeReader(doc.DocumentElement);
- XmlSerializer serializer = new XmlSerializer(typeof(ConfigInfo));
- _Config = (ConfigInfo)serializer.Deserialize(reader);
- fs.Close();
- }
- //Debug.Log(LoadedObj.lat);
- _headers.Add("GroupID", _Config.GroupID);
- _headers.Add("LoginID", _Config.LoginID);
- _headers.Add("Password", _Config.Password);
- }
- private void saveConfig()
- {
- // Serialise to the XML document
- XmlDocument doc = new XmlDocument();
- using (XmlWriter writer = doc.CreateNavigator().AppendChild())
- {
- XmlSerializer serializer = new XmlSerializer(typeof(ConfigInfo));
- serializer.Serialize(writer, _Config);
- }
- doc.Save(_UserConfigFile);
- }
- private void TryParseXmlForm(XmlNode node)
- {
- if ((node == null) || (!node.HasChildNodes))
- return;
- XmlNodeList uiList = node.ChildNodes;
- foreach (XmlNode ui in uiList)
- {
- string type = ui.Name;
- string text = getXmlAttributesValue(ui, "text", string.Empty);
- string image = getXmlAttributesValue(ui, "image", string.Empty);
- string tooltip = getXmlAttributesValue(ui, "tooltip", string.Empty);
- string class2 = getXmlAttributesValue(ui, "class", string.Empty);
- string style = getXmlAttributesValue(ui, "style", string.Empty);
- string rect = getXmlAttributesValue(ui, "rect", "");
- int maxLength = -1;
- GUIStyle style2 = null;
- if (!string.IsNullOrEmpty(style) || !string.IsNullOrEmpty(class2))
- {
- if (type == "Style")
- {
- TryParseStyle(string.Empty, class2, style, out style2);
- string id = getXmlAttributesValue(ui, "id", string.Empty);
- if (string.IsNullOrEmpty(id))
- {
- DebugOut(ui);
- continue;
- }
- _uiStyle.Add(id, style2);
- continue;
- }
- else
- {
- TryParseStyle(type, class2, style, out style2);
- }
- }
- Rect position;
- if (!TryParseRect(rect, out position))
- {
- DebugOut(ui);
- continue;
- }
- //------------------------------------------
- //UI位置修正, 備用, 致能屬性尚未未定
- //水平置左(Left)
- //position.x = 0;
- //水平置中(Center)
- //position.x = (Screen.width >= position.width) ? ((Screen.width - position.width) / 2) : 0;
- //水平置右(Right)
- //position.x = (Screen.width >= position.width) ? (Screen.width - position.width) : 0;
- //垂直置頂(Top)
- //position.y = 0;
- //垂直置中
- //position.y = (Screen.height >= position.height) ? ((Screen.height - position.height) / 2) : 0;
- //垂直置底(Bottom)
- //position.y = (Screen.height >= position.height) ? (Screen.height - position.height) : 0;
- //------------------------------------------
- Texture2D image2 = null;
- GUIContent content2 = new GUIContent();
- if (!string.IsNullOrEmpty(image))
- {
- image2 = getTexture2D(image);
- content2.image = image2;
- }
- if (!string.IsNullOrEmpty(text))
- content2.text = text;
- if (!string.IsNullOrEmpty(tooltip))
- content2.tooltip = tooltip;
- switch (type)
- {
- case "Box":
- {
- if (style2 != null)
- GUI.Box(position, content2, style2);
- else
- GUI.Box(position, content2);
- }
- break;
- case "Button":
- {
- if (style2 != null)
- {
- if (GUI.Button(position, content2, style2))
- onButtonClick(ui);
- }
- else
- {
- if (GUI.Button(position, content2))
- onButtonClick(ui);
- }
- }
- break;
- case "Group":
- {
- if (string.IsNullOrEmpty(text) && (image2 == null))
- {
- if (style2 != null)
- GUI.BeginGroup(position, style2);
- else
- GUI.BeginGroup(position);
- }
- else
- {
- if (style2 != null)
- GUI.BeginGroup(position, content2, style2);
- else
- GUI.BeginGroup(position, content2);
- }
- //遞迴展開
- TryParseXmlForm(ui);
- GUI.EndGroup();
- }
- break;
- case "Label":
- {
- if (style2 != null)
- GUI.Label(position, content2, style2);
- else
- GUI.Label(position, content2);
- }
- break;
- case "PasswordField":
- {
- string id = getXmlAttributesValue(ui, "id", string.Empty);
- if (string.IsNullOrEmpty(id))
- {
- DebugOut(ui);
- continue;
- }
- if (_FromData.ContainsKey(id))
- text = _FromData[id];
- if (ui.Attributes["maxLength"] != null)
- int.TryParse(ui.Attributes["maxLength"].Value, out maxLength);
- char maskChar = '*';
- if (style2 != null)
- {
- if (maxLength == -1)
- _FromData[id] = GUI.PasswordField(position, text, maskChar, style2);
- else
- _FromData[id] = GUI.PasswordField(position, text, maskChar, maxLength, style2);
- }
- else
- {
- if (maxLength == -1)
- _FromData[id] = GUI.PasswordField(position, text, maskChar);
- else
- _FromData[id] = GUI.PasswordField(position, text, maskChar, maxLength);
- }
- }
- break;
- case "RepeatButton":
- {
- if (style2 != null)
- {
- if (GUI.RepeatButton(position, content2, style2))
- onButtonClick(ui);
- }
- else
- {
- if (GUI.RepeatButton(position, content2))
- onButtonClick(ui);
- }
- }
- break;
- case "ScrollView":
- {
- //TODO: ScrollView
- //遞迴展開
- //TryParseXmlForm(ui);
- //GUI.EndScrollView();
- }
- break;
- case "TextArea":
- {
- string id = getXmlAttributesValue(ui, "id", string.Empty);
- if (string.IsNullOrEmpty(id))
- {
- DebugOut(ui);
- continue;
- }
- if (_FromData.ContainsKey(id))
- text = _FromData[id];
- if (ui.Attributes["maxLength"] != null)
- int.TryParse(ui.Attributes["maxLength"].Value, out maxLength);
- if (style2 != null)
- {
- if (maxLength == -1)
- _FromData[id] = GUI.TextArea(position, text, style2);
- else
- _FromData[id] = GUI.TextArea(position, text, maxLength, style2);
- }
- else
- {
- if (maxLength == -1)
- _FromData[id] = GUI.TextArea(position, text);
- else
- _FromData[id] = GUI.TextArea(position, text, maxLength);
- }
- }
- break;
- case "TextField":
- {
- string id = getXmlAttributesValue(ui, "id", string.Empty);
- if (string.IsNullOrEmpty(id))
- {
- DebugOut(ui);
- continue;
- }
- if (_FromData.ContainsKey(id))
- text = _FromData[id];
- if (ui.Attributes["maxLength"] != null)
- int.TryParse(ui.Attributes["maxLength"].Value, out maxLength);
- if (style2 != null)
- {
- if (maxLength == -1)
- _FromData[id] = GUI.TextField(position, text, style2);
- else
- _FromData[id] = GUI.TextField(position, text, maxLength, style2);
- }
- else
- {
- if (maxLength == -1)
- _FromData[id] = GUI.TextField(position, text);
- else
- _FromData[id] = GUI.TextField(position, text, maxLength);
- }
- }
- break;
- case "Toggle":
- {
- string id = getXmlAttributesValue(ui, "id", string.Empty);
- if (string.IsNullOrEmpty(id))
- {
- DebugOut(ui);
- continue;
- }
- bool value = false;
- bool value2 = false;
- if (_FromData[id] != null)
- bool.TryParse(_FromData[id], out value);
- else if (ui.Attributes["value"] != null)
- bool.TryParse(ui.Attributes["value"].Value, out value);
- if (style2 != null)
- value2 = GUI.Toggle(position, value, content2, style2);
- else
- value2 = GUI.Toggle(position, value, content2);
- _FromData[id] = value2.ToString();
- }
- break;
- }
- }
- }
- private void xmlForm()
- {
- try
- {
- if (_FormID != _FormID2)
- {
- //string GUIFile = Path.Combine(Application.dataPath, _FormID2) + ".xml";
- string GUIFile = Application.dataPath + "/" + _FormID2 + ".xml";
- if (Path.DirectorySeparatorChar != '/')
- GUIFile = GUIFile.Replace('/', Path.DirectorySeparatorChar);
- //_Document.LoadXml(File.ReadAllText(GUIFile));
- _Document.Load(GUIFile);
- _FormID = _FormID2;
- _FromData.Clear();
- }
- if (_Document == null)
- return;
- XmlNodeList formList = _Document.SelectNodes("/form");
- if (formList == null)
- return;
- if (formList.Count == 0)
- return;
- XmlNode form = formList.Item(0);
- TryParseXmlForm(form);
- }
- catch (Exception ex)
- {
- DebugOut(ex);
- }
- }
- //private XmlNode findXmlNode(string id)
- //{
- // string find = "/form/ui[@id='" + id + "']";
- // XmlNodeList uiList = _Document.SelectNodes(find);
- // foreach (XmlNode ui in uiList)
- // return ui;
- // return null;
- //}
- private string getXmlAttributesValue(XmlNode node, string name, string defaultValue)
- {
- XmlAttribute attr = node.Attributes[name];
- if (attr != null)
- return attr.Value;
- else
- return defaultValue;
- }
- private bool TryParseRect(string src, out Rect rect)
- {
- string[] num = src.Split(new Char[] { ',' });
- if (num.Length == 4)
- {
- float x, y, w, h;
- if (float.TryParse(num[0], out x) &&
- float.TryParse(num[1], out y) &&
- float.TryParse(num[2], out w) &&
- float.TryParse(num[3], out h))
- {
- rect = new Rect(x, y, w, h);
- return true;
- }
- }
- rect = new Rect();
- return false;
- }
- private bool TryParseVector2(string src, out Vector2 vec)
- {
- string[] num = src.Split(new Char[] { ',' });
- if (num.Length == 2)
- {
- float x, y;
- if (float.TryParse(num[0], out x) &&
- float.TryParse(num[1], out y))
- {
- vec = new Vector2(x, y);
- return true;
- }
- }
- vec = new Vector2();
- return false;
- }
- private bool TryParseRectOffset(string src, out RectOffset rectOffset)
- {
- string[] num = src.Split(new Char[] { ',' });
- if (num.Length == 4)
- {
- int left, right, top, bottom;
- if (int.TryParse(num[0], out left) &&
- int.TryParse(num[1], out right) &&
- int.TryParse(num[2], out top) &&
- int.TryParse(num[3], out bottom))
- {
- rectOffset = new RectOffset(left, right, top, bottom);
- return true;
- }
- }
- rectOffset = null;
- return false;
- }
- private bool TryParseTextAnchor(string src, out TextAnchor textAnchor)
- {
- switch (src)
- {
- case "UpperLeft":
- textAnchor = TextAnchor.UpperLeft;
- break;
- case "UpperCenter":
- textAnchor = TextAnchor.UpperCenter;
- break;
- case "UpperRight":
- textAnchor = TextAnchor.UpperRight;
- break;
- case "MiddleLeft":
- textAnchor = TextAnchor.MiddleLeft;
- break;
- case "MiddleCenter":
- textAnchor = TextAnchor.MiddleCenter;
- break;
- case "MiddleRight":
- textAnchor = TextAnchor.MiddleRight;
- break;
- case "LowerLeft":
- textAnchor = TextAnchor.LowerLeft;
- break;
- case "LowerCenter":
- textAnchor = TextAnchor.LowerCenter;
- break;
- case "LowerRight":
- textAnchor = TextAnchor.LowerRight;
- break;
- default:
- textAnchor = TextAnchor.UpperLeft;
- return false;
- }
- return true;
- }
- private bool TryParseTextClipping(string src, out TextClipping textClipping)
- {
- switch (src)
- {
- case "Overflow":
- textClipping = TextClipping.Overflow;
- break;
- case "Clip":
- textClipping = TextClipping.Clip;
- break;
- default:
- textClipping = TextClipping.Overflow;
- return false;
- }
- return true;
- }
- private bool TryParseFontStyle(string src, out FontStyle fontStyle)
- {
- switch (src)
- {
- case "Bold":
- fontStyle = FontStyle.Bold;
- break;
- case "BoldAndItalic":
- fontStyle = FontStyle.BoldAndItalic;
- break;
- case "Italic":
- fontStyle = FontStyle.Italic;
- break;
- case "Normal":
- fontStyle = FontStyle.Normal;
- break;
- default:
- fontStyle = FontStyle.Normal;
- return false;
- }
- return true;
- }
- private bool TryParseImagePosition(string src, out ImagePosition imagePosition)
- {
- switch (src)
- {
- case "ImageLeft":
- imagePosition = ImagePosition.ImageLeft;
- break;
- case "ImageAbove":
- imagePosition = ImagePosition.ImageAbove;
- break;
- case "ImageOnly":
- imagePosition = ImagePosition.ImageOnly;
- break;
- case "TextOnly":
- imagePosition = ImagePosition.TextOnly;
- break;
- default:
- imagePosition = ImagePosition.ImageLeft;
- return false;
- }
- return true;
- }
- private bool TryParseStyleState(string src, out GUIStyleState styleState)
- {
- //TODO: TryParseStyleState
- styleState = new GUIStyleState();
- return true;
- }
- private Texture2D getTexture2D(string image)
- {
- Texture2D ret = _uiTexture2D[image];
- if (ret == null)
- {
- ret = Resources.Load(image) as Texture2D;
- _uiTexture2D.Add(image, ret);
- }
- return ret;
- }
- private void TryParseStyle(string type, string class2, string src, out GUIStyle style2)
- {
- if (!string.IsNullOrEmpty(class2))
- style2 = _uiStyle[class2];
- else if (!string.IsNullOrEmpty(type))
- style2 = new GUIStyle(GUI.skin.GetStyle(type));
- else
- style2 = new GUIStyle();
- if (string.IsNullOrEmpty(src))
- return;
- string[] style = src.Split(new Char[] { ';' });
- string key, value;
- foreach (string str in style)
- {
- string[] s = str.Split(new Char[] { ':' });
- if (s.Length == 2)
- {
- key = s[0].Trim();
- value = s[1].Trim();
- switch (key)
- {
- case "active":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.active = styleState;
- }
- break;
- case "alignment":
- {
- TextAnchor textAnchor;
- if (TryParseTextAnchor(value, out textAnchor))
- style2.alignment = textAnchor;
- }
- break;
- case "border":
- {
- RectOffset rectOffset;
- if (TryParseRectOffset(value, out rectOffset))
- style2.border = rectOffset;
- }
- break;
- case "clipping":
- {
- TextClipping textClipping;
- if (TryParseTextClipping(value, out textClipping))
- style2.clipping = textClipping;
- }
- break;
- //過時功能
- //case "clipOffset":
- // {
- // Vector2 vec;
- // TryParseVector2(value, out vec);
- // style2.clipOffset = vec;
- // }
- // break;
- case "contentOffset":
- {
- Vector2 vec;
- if (TryParseVector2(value, out vec))
- style2.contentOffset = vec;
- }
- break;
- case "fixedHeight":
- {
- float fixedHeight;
- if (float.TryParse(value, out fixedHeight))
- style2.fixedHeight = fixedHeight;
- }
- break;
- case "fixedWidth":
- {
- float fixedWidth;
- if (float.TryParse(value, out fixedWidth))
- style2.fixedWidth = fixedWidth;
- }
- break;
- case "focused":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.focused = styleState;
- }
- break;
- case "font":
- {
- Font font = new Font(value);
- style2.font = font;
- }
- break;
- case "fontSize":
- {
- int fontSize;
- if (int.TryParse(value, out fontSize))
- style2.fontSize = fontSize;
- }
- break;
- case "fontStyle":
- {
- FontStyle fontStyle;
- if (TryParseFontStyle(value, out fontStyle))
- style2.fontStyle = fontStyle;
- }
- break;
- case "hover":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.hover = styleState;
- }
- break;
- case "imagePosition":
- {
- ImagePosition imagePosition;
- if (TryParseImagePosition(value, out imagePosition))
- style2.imagePosition = imagePosition;
- }
- break;
- case "margin":
- {
- RectOffset rectOffset;
- if (TryParseRectOffset(value, out rectOffset))
- style2.margin = rectOffset;
- }
- break;
- case "normal":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.normal = styleState;
- }
- break;
- case "onActive":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.onActive = styleState;
- }
- break;
- case "onFocused":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.onFocused = styleState;
- }
- break;
- case "onHover":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.onHover = styleState;
- }
- break;
- case "onNormal":
- {
- GUIStyleState styleState;
- if (TryParseStyleState(value, out styleState))
- style2.onNormal = styleState;
- }
- break;
- case "overflow":
- {
- RectOffset rectOffset;
- if (TryParseRectOffset(value, out rectOffset))
- style2.padding = rectOffset;
- }
- break;
- case "padding":
- {
- RectOffset rectOffset;
- if (TryParseRectOffset(value, out rectOffset))
- style2.padding = rectOffset;
- }
- break;
- case "richText":
- {
- bool richText;
- if (bool.TryParse(value, out richText))
- style2.richText = richText;
- }
- break;
- case "stretchHeight":
- {
- bool stretchHeight;
- if (bool.TryParse(value, out stretchHeight))
- style2.stretchHeight = stretchHeight;
- }
- break;
- case "stretchWidth":
- {
- bool stretchWidth;
- if (bool.TryParse(value, out stretchWidth))
- style2.stretchWidth = stretchWidth;
- }
- break;
- case "wordWrap":
- {
- bool wordWrap;
- if (bool.TryParse(value, out wordWrap))
- style2.wordWrap = wordWrap;
- }
- break;
- }
- }
- }
- }
- private void onButtonClick(XmlNode node)
- {
- if (node != null)
- {
- string method = getXmlAttributesValue(node, "method", "");
- string action = getXmlAttributesValue(node, "action", "");
- if (string.IsNullOrEmpty(method))
- {
- switch (method)
- {
- case "browser":
- Application.OpenURL(action);
- break;
- case "call":
- callFunc(action);
- break;
- case "post":
- if (string.IsNullOrEmpty(action))
- xmlFormPost(action);
- break;
- case "reset":
- _FormID2 = _FormID;
- _FormID = "";
- break;
- case "form":
- _FormID2 = action;
- _FormID = "";
- break;
- case "quit":
- Application.Quit();
- break;
- }
- }
- }
- }
- private void callFunc(string action)
- {
- }
- private IEnumerator xmlFormPost(string strUrl)
- {
- yield return new WaitForEndOfFrame();
- if (_IsExistConfig == true)
- {
- var form = new WWWForm();
- foreach (string key in _FromData.Keys)
- form.AddField(key, _FromData[key]);
- string strUrl2;
- Uri url = new Uri(strUrl);
- if ((url.Scheme == "http") || (url.Scheme == "http"))
- strUrl2 = strUrl;
- else
- strUrl2 = (new Uri(_BaseUri, strUrl)).PathAndQuery;
- var http = new WWW(strUrl2, form.data, _headers);
- yield return http;
- if (!String.IsNullOrEmpty(http.error))
- {
- DebugOut(http);
- }
- else
- {
- string Location = http.responseHeaders["Location"];
- if (!string.IsNullOrEmpty(Location))
- {
- _FormID2 = Location;
- }
- else
- {
- _FormID = _FormID2 = "";
- _Document.LoadXml(http.text);
- }
- }
- }
- }
- private void DebugOut(object obj)
- {
- if (obj is string)
- {
- //Debug.Log(msg);
- print(obj as string);
- }
- else if (obj is Exception)
- {
- print((obj as Exception).Message);
- }
- else if (obj is WWW)
- {
- print((obj as WWW).error);
- }
- else
- {
- XmlWriter w = XmlWriter.Create("");
- (obj as XmlNode).WriteTo(w);
- print(w.ToString());
- }
- }
- }
- //--------------------------------------
- //File: ConfigInfo.cs
- using System;
- using System.Xml;
- using System.Xml.Serialization;
- [XmlRoot("root")]
- public class ConfigInfo {
- [XmlAttribute("GroupID")]
- public string GroupID = "";
- [XmlAttribute("LoginID")]
- public string LoginID = "";
- [XmlAttribute("Password")]
- public string Password = "";
- }
- //--------------------------------------
- //File: Config.xml
- <?xml version="1.0" encoding="utf-8"?>
- <form>
- <Box text="設定使用者" rect="0,0,240,240" />
- <Label text="案場代號:" rect="20,60,80,60" />
- <TextField id="GroupID" rect="40,80,160,20" maxLength="20" />
- <Label text="帳號:" rect="20,100,40,20" />
- <TextField id="LoginID" rect="40,120,160,20" maxLength="20" />
- <Label text="密碼:" rect="20,140,40,20" />
- <TextField id="Password" rect="40,160,160,20" maxLength="20" />
- <Button text="儲存" rect="20,200,100,20" action="saveConfig" method="call" />
- <Button text="取消" rect="120,200,100,20" action="loadConfig" method="call" />
- </form>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement