//
//  "00-Scr-ObjectCopier.mq4"  -- read/write objects to/from global variable
//
//    Ver. 1.00  2008/9/26(Fri)
//
#property  copyright  "00"
#property  link       "http://www.mql4.com/"

#property  show_inputs

//---- defines
#define S_TREND      "trend"
#define S_RECTANGLE  "rect"
#define S_VLINE      "vline"
#define S_HLINE      "hline"
#define S_TEXT       "text"
#define S_ARROW      "arrow"
#define S_FIBO       "fibo"
#define S_EXPANSION  "expansion"

//---- script parameters
extern bool   bMaster         = false;      // true: copy objs to global vars, false: vice versa  
extern string sMasterPrefix   = "master1";  // prefix for global vars
extern double tUpdate         = 1.0;        // interval time in sec
extern bool   bCopyTrend      = true;       // copy OBJ_TREND or not
extern bool   bCopyRectangle  = true;       // copy OBJ_RECTANGLE or not
extern bool   bCopyVLine      = true;       // copy OBJ_VLINE or not
extern bool   bCopyHLine      = true;       // copy OBJ_HLINE or not
extern bool   bCopyText       = true;       // copy OBJ_TEXT or not
extern bool   bCopyArrow      = true;       // copy OBJ_ARROW or not
extern bool   bCopyFibo       = true;       // copy OBJ_FIBO or not
extern bool   bCopyExpansion  = true;       // copy OBJ_EXPANSION or not

//---- vars
string sScriptName      = "00-Scr-ObjectCopier";
string sScriptShortName = "00-OC";
string sMasterPrefixOld;

//----------------------------------------------------------------------
void init()
{
    sMasterPrefixOld = StringConcatenate(sScriptName, "-", sMasterPrefix);
    sMasterPrefix = StringConcatenate(sScriptShortName, "-", sMasterPrefix);
}

//----------------------------------------------------------------------
void deinit()
{
    GlobalVariablesDeleteAll(sMasterPrefixOld);
    GlobalVariablesDeleteAll(sMasterPrefix);
}

//----------------------------------------------------------------------
int getObjType(string sParam[])
{
    int type = -1;
    string sType = sParam[1];
    
    if (sType == S_TREND) {
	type = OBJ_TREND;
    } else if (sType == S_RECTANGLE) {
	type = OBJ_RECTANGLE;
    } else if (sType == S_VLINE) {
	type = OBJ_VLINE;
    } else if (sType == S_HLINE) {
	type = OBJ_HLINE;
    } else if (sType == S_TEXT) {
	type = OBJ_TEXT;
    } else if (sType == S_ARROW) {
	type = OBJ_ARROW;
    } else if (sType == S_FIBO) {
	type = OBJ_FIBO;
    } else if (sType == S_EXPANSION) {
	type = OBJ_EXPANSION;
    } else {
	// not supported
    }
    
    return(type);
}

//----------------------------------------------------------------------
string getPrefix(string type, string sObjStr)
{
    return(StringConcatenate(sMasterPrefix, " ", type, " ", sObjStr));
}

//----------------------------------------------------------------------
string varSet(string sVarName, double v = 0.0)
{
    GlobalVariableSet(sVarName, v);
    
    return(sVarName);
}

//----------------------------------------------------------------------
string varSetTime1(string sVarName, double t1)
{
    string s = StringConcatenate(sVarName, " t1");
    GlobalVariableSet(s, t1);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetPrice1(string sVarName, double p1)
{
    string s = StringConcatenate(sVarName, " p1");
    GlobalVariableSet(s, p1);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetColor(string sVarName, color col)
{
    string s = StringConcatenate(sVarName, " color");
    GlobalVariableSet(s, col);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetPos1(string sVarName, double t, double p)
{
    string s = "";
    
    s = StringConcatenate(s, varSetTime1(sVarName, t));
    s = StringConcatenate(s, varSetPrice1(sVarName, p));
    
    return(s);
}

//----------------------------------------------------------------------
string varSetPos2(string sVarName, double t, double p)
{
    string s1 = StringConcatenate(sVarName, " t2");
    string s2 = StringConcatenate(sVarName, " p2");
    
    GlobalVariableSet(s1, t);
    GlobalVariableSet(s2, p);
    
    return(s1 + s2);
}

//----------------------------------------------------------------------
string varSetPos3(string sVarName, double t, double p)
{
    string s1 = StringConcatenate(sVarName, " t3");
    string s2 = StringConcatenate(sVarName, " p3");
    
    GlobalVariableSet(s1, t);
    GlobalVariableSet(s2, p);
    
    return(s1 + s2);
}

//----------------------------------------------------------------------
string varSetStyle(string sVarName, int width, int style, color col)
{
    string s1 = StringConcatenate(sVarName, " width");
    string s2 = StringConcatenate(sVarName, " style");
    
    GlobalVariableSet(s1, width);
    GlobalVariableSet(s2, style);
    string s = s1 + s2;
    s = s + varSetColor(sVarName, col);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetLevelColor(string sVarName, color levelCol)
{
    string s = StringConcatenate(sVarName, " levelColor");
    GlobalVariableSet(s, levelCol);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetLevelStyle(string sVarName, int levelWidth, int levelStyle, color levelCol)
{
    string s1 = StringConcatenate(sVarName, " levelWidth");
    string s2 = StringConcatenate(sVarName, " levelStyle");
    
    GlobalVariableSet(s1, levelWidth);
    GlobalVariableSet(s2, levelStyle);
    string s = s1 + s2;
    s = s + varSetLevelColor(sVarName, levelCol);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetRay(string sVarName, int ray)
{
    string s = StringConcatenate(sVarName, " ray");
    GlobalVariableSet(s, ray);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetBack(string sVarName, int back)
{
    string s = StringConcatenate(sVarName, " back");
    GlobalVariableSet(s, back);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetAngle(string sVarName, double angle)
{
    string s = StringConcatenate(sVarName, " angle");
    GlobalVariableSet(s, angle);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetScale(string sVarName, double scale)
{
    string s = StringConcatenate(sVarName, " scale");
    GlobalVariableSet(s, scale);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetArrowCode(string sVarName, int arrowCode)
{
    string s = StringConcatenate(sVarName, " arrowCode");
    GlobalVariableSet(s, arrowCode);
    
    return(s);
}

//----------------------------------------------------------------------
string varSetText(string sVarName, string text, int fontSize, color col)
{
    string s1 = StringConcatenate(sVarName, " text ", text);
    string s2 = StringConcatenate(sVarName, " fontSize");
    GlobalVariableSet(s1, 0);
    GlobalVariableSet(s2, fontSize);
    string s = StringConcatenate(s1, s2);
    s = StringConcatenate(s, varSetColor(sVarName, col));
    
    return(s);
}

//----------------------------------------------------------------------
string varGetText(string sVarPrefix)
{
    string text;
    int nVar = GlobalVariablesTotal();
    
    for (int jVar = 0; jVar < nVar; jVar++) {
	string sVarName = GlobalVariableName(jVar);
	int x = StringFind(sVarName, sVarPrefix);
	if (x >= 0) {
	    text = StringSubstr(sVarName, x + StringLen(sVarPrefix));
	}
    }
    
    return(text);
}

//----------------------------------------------------------------------
void objSetTime1(string sObjName, datetime t)
{
    ObjectSet(sObjName, OBJPROP_TIME1,  t);
}

//----------------------------------------------------------------------
void objSetPrice1(string sObjName, double p)
{
    ObjectSet(sObjName, OBJPROP_PRICE1, p);
}

//----------------------------------------------------------------------
void objSetPos1(string sObjName, datetime t, double p)
{
    objSetTime1(sObjName, t);
    objSetPrice1(sObjName, p);
}

//----------------------------------------------------------------------
void objSetPos2(string sObjName, datetime t, double p)
{
    ObjectSet(sObjName, OBJPROP_TIME2,  t);
    ObjectSet(sObjName, OBJPROP_PRICE2, p);
}

//----------------------------------------------------------------------
void objSetPos3(string sObjName, datetime t, double p)
{
    ObjectSet(sObjName, OBJPROP_TIME3,  t);
    ObjectSet(sObjName, OBJPROP_PRICE3, p);
}

//----------------------------------------------------------------------
void objSetStyle(string sObjName, int width, int style, color col)
{
    ObjectSet(sObjName, OBJPROP_WIDTH, width);
    ObjectSet(sObjName, OBJPROP_STYLE, style);
    ObjectSet(sObjName, OBJPROP_COLOR, col);
}

//----------------------------------------------------------------------
void objSetLevelStyle(string sObjName, int levelWidth, int levelStyle, color levelCol)
{
    ObjectSet(sObjName, OBJPROP_LEVELWIDTH, levelWidth);
    ObjectSet(sObjName, OBJPROP_LEVELSTYLE, levelStyle);
    ObjectSet(sObjName, OBJPROP_LEVELCOLOR, levelCol);
}

//----------------------------------------------------------------------
void objSetRay(string sObjName, int ray)
{
    ObjectSet(sObjName, OBJPROP_RAY, ray);
}

//----------------------------------------------------------------------
void objSetBack(string sObjName, int back)
{
    ObjectSet(sObjName, OBJPROP_BACK, back);
}

//----------------------------------------------------------------------
void objSetAngle(string sObjName, double angle)
{
    ObjectSet(sObjName, OBJPROP_ANGLE, angle);
}

//----------------------------------------------------------------------
void objSetScale(string sObjName, double scale)
{
    ObjectSet(sObjName, OBJPROP_SCALE, scale);
}

//----------------------------------------------------------------------
void objSetArrowCode(string sObjName, int arrowCode)
{
    ObjectSet(sObjName, OBJPROP_ARROWCODE, arrowCode);
}

//----------------------------------------------------------------------
void objSetText(string sObjName, string text, int fontSize, color col)
{
    ObjectSetText(sObjName, text, fontSize, "", col);
}

//----------------------------------------------------------------------
string strChConv(string s, int ch = '_')
{
    int len = StringLen(s);
    
    for (int i = 0; i < len; i++) {
	if (StringGetChar(s, i) == ' ') {
	    s = StringSetChar(s, i, ch);
	}
    }
    
    return(s);
}

//----------------------------------------------------------------------
int strSplit(string str, string &sParam[])
{
    int nParam = 0;
    
    for (int loop = 0; loop < 2; loop++) {
	string s = str;
	for (; ;) {
	    s = StringTrimLeft(s);
	    int len = StringLen(s);
	    if (len <= 0) {
		break;
	    }
	    int x = StringFind(s, " ");
	    string w;
	    if (x > 0) {
		w = StringSubstr(s, 0, x);
		s = StringSubstr(s, x + 1);
	    } else {
		w = s;
		s = "";
	    }
	    if (loop == 1) {
		sParam[nParam] = w;
	    }
	    nParam++;
	}
	
	if (loop == 0) {
	    ArrayResize(sParam, nParam);
	    nParam = 0;
	}
    }
    
    return(nParam);
}

//----------------------------------------------------------------------
bool isValidTime(datetime t)
{
    return(t > 0);
}

//----------------------------------------------------------------------
bool isValidPrice(double p)
{
    return(p > 0);
}

//----------------------------------------------------------------------
bool isValidPos1(datetime t1, double p1)
{
    return(isValidTime(t1) && isValidPrice(p1));
}

//----------------------------------------------------------------------
bool isValidPos12(datetime t1, double p1, datetime t2, double p2)
{
    return(isValidPos1(t1, p1) && isValidPos1(t2, p2));
}

//----------------------------------------------------------------------
bool isValidPos123(datetime t1, double p1, datetime t2, double p2, datetime t3, double p3)
{
    return(isValidPos1(t1, p1) && isValidPos1(t2, p2) && isValidPos1(t3, p3));
}

//----------------------------------------------------------------------
string writeGlobalVar(string sObjName)
{
    string sAll = "";
    int type = ObjectType(sObjName);
    string sObjStr = strChConv(sObjName);
    string sVarName;
    
    datetime t1         = ObjectGet(sObjName, OBJPROP_TIME1);
    double   p1         = ObjectGet(sObjName, OBJPROP_PRICE1);
    datetime t2         = ObjectGet(sObjName, OBJPROP_TIME2);
    double   p2         = ObjectGet(sObjName, OBJPROP_PRICE2);
    datetime t3         = ObjectGet(sObjName, OBJPROP_TIME3);
    double   p3         = ObjectGet(sObjName, OBJPROP_PRICE3);
    int      width      = ObjectGet(sObjName, OBJPROP_WIDTH);
    int      style      = ObjectGet(sObjName, OBJPROP_STYLE);
    int      ray        = ObjectGet(sObjName, OBJPROP_RAY);
    int      back       = ObjectGet(sObjName, OBJPROP_BACK);
    color    col        = ObjectGet(sObjName, OBJPROP_COLOR);
    int      fontSize   = ObjectGet(sObjName, OBJPROP_FONTSIZE);
    double   angle      = ObjectGet(sObjName, OBJPROP_ANGLE);
    double   scale      = ObjectGet(sObjName, OBJPROP_SCALE);
    int      levelWidth = ObjectGet(sObjName, OBJPROP_LEVELWIDTH);
    int      levelStyle = ObjectGet(sObjName, OBJPROP_LEVELSTYLE);
    color    levelCol   = ObjectGet(sObjName, OBJPROP_LEVELCOLOR);
    int      arrowCode  = ObjectGet(sObjName, OBJPROP_ARROWCODE);
    
    switch (type) {
	
    case OBJ_TREND:
	if (bCopyTrend) {
	    if (isValidPos12(t1, p1, t2, p2)) {
		sVarName = getPrefix(S_TREND, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPos1(sVarName, t1, p1));
		sAll = StringConcatenate(sAll, varSetPos2(sVarName, t2, p2));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetRay(sVarName, ray));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
	    }
	}
	break;
	
    case OBJ_RECTANGLE:
	if (bCopyTrend) {
	    if (isValidPos12(t1, p1, t2, p2)) {
		sVarName = getPrefix(S_RECTANGLE, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPos1(sVarName, t1, p1));
		sAll = StringConcatenate(sAll, varSetPos2(sVarName, t2, p2));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
	    }
	}
	break;
	
    case OBJ_VLINE:
	if (bCopyVLine) {
	    if (isValidTime(t1)) {
		sVarName = getPrefix(S_VLINE, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetTime1(sVarName, t1));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
	    }
	}
	break;
	
    case OBJ_HLINE:
	if (bCopyHLine) {
	    if (isValidPrice(p1)) {
		sVarName = getPrefix(S_HLINE, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPrice1(sVarName, p1));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
	    }
	}
	break;
	
    case OBJ_TEXT:
	if (bCopyText) {
	    if (isValidPos1(t1, p1)) {
		sVarName = getPrefix(S_TEXT, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPos1(sVarName, t1, p1));
		string text = ObjectDescription(sObjName);
		sAll = StringConcatenate(sAll, varSetText(sVarName, text, fontSize, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
		sAll = StringConcatenate(sAll, varSetAngle(sVarName, angle));
	    }
	}
	break;
	
    case OBJ_ARROW:
	if (bCopyArrow) {
	    if (isValidPos1(t1, p1)) {
		sVarName = getPrefix(S_ARROW, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPos1(sVarName, t1, p1));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
		sAll = StringConcatenate(sAll, varSetArrowCode(sVarName, arrowCode));
	    }
	}
	break;
	
    case OBJ_FIBO:
	if (bCopyFibo) {
	    if (isValidPos12(t1, p1, t2, p2)) {
		sVarName = getPrefix(S_FIBO, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPos1(sVarName, t1, p1));
		sAll = StringConcatenate(sAll, varSetPos2(sVarName, t2, p2));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
		sAll = StringConcatenate(sAll, varSetLevelStyle(sVarName, levelWidth, levelStyle, levelCol));
	    }
	}
	break;
	
    case OBJ_EXPANSION:
	if (bCopyExpansion) {
	    if (isValidPos123(t1, p1, t2, p2, t3, p3)) {
		sVarName = getPrefix(S_EXPANSION, sObjStr);
		sAll = StringConcatenate(sAll, varSet(sVarName));
		sAll = StringConcatenate(sAll, varSetPos1(sVarName, t1, p1));
		sAll = StringConcatenate(sAll, varSetPos2(sVarName, t2, p2));
		sAll = StringConcatenate(sAll, varSetPos3(sVarName, t3, p3));
		sAll = StringConcatenate(sAll, varSetStyle(sVarName, width, style, col));
		sAll = StringConcatenate(sAll, varSetBack(sVarName, back));
		sAll = StringConcatenate(sAll, varSetLevelStyle(sVarName, levelWidth, levelStyle, levelCol));
	    }
	}
	break;
	
    default:
	//Print(sObjName + " is not supported");
	break;
    }
    
    return(sAll);
}

//----------------------------------------------------------------------
void updateVars()
{
    int i;
    string sAll = "";
    
    int nObj = ObjectsTotal();
    for (i = 0; i < nObj; i++) {
	string sObjName = ObjectName(i);
	if (ObjectFind(sObjName) == 0) {
	    // only copy objs in main chart (window 0)
	    sAll = StringConcatenate(sAll, writeGlobalVar(sObjName));
	}
    }
    
    // delete unused global vars
    int nVar = GlobalVariablesTotal();
    for (i = 0; i < nVar; i++) {
	string sVar = GlobalVariableName(i);
	if (StringFind(sAll, sVar) < 0) {
	    GlobalVariableDel(sVar);
	}
    }
}

//----------------------------------------------------------------------
void updateObjects()
{
    int nObj = ObjectsTotal();
    int nVar = GlobalVariablesTotal();
    int jObj, jVar;
    string sObjName, sObjParam[];
    string sVarName, sVarParam[];
    int nDel = 0;
    
    for (jObj = 0; jObj < nObj; jObj++) {
	sObjName = ObjectName(jObj);
	if (StringFind(sObjName, sMasterPrefix) < 0) {
	    continue;
	}
	strSplit(sObjName, sObjParam);
	bool bFound = false;
	for (jVar = 0; jVar < nVar; jVar++) {
	    sVarName = GlobalVariableName(jVar);
	    if (StringFind(sVarName, sMasterPrefix) < 0) {
		continue;
	    }
	    strSplit(sVarName, sVarParam);
	    if (sObjParam[2] == sVarParam[2]) {
		bFound = true;
		break;
	    }
	}
	
	if (!bFound) {
	    ObjectDelete(sObjName);
	    nDel++;
	}
    }
    
    for (jVar = 0; jVar < nVar; jVar++) {
	sVarName = GlobalVariableName(jVar);
	if (StringFind(sVarName, sMasterPrefix) < 0) {
	    continue;
	}
	int n = strSplit(sVarName, sVarParam);
	if (n != 3) {
	    continue;
	}
	int type = getObjType(sVarParam);
	
	datetime t1         = GlobalVariableGet(StringConcatenate(sVarName, " t1"));
	double   p1         = GlobalVariableGet(StringConcatenate(sVarName, " p1"));
	datetime t2         = GlobalVariableGet(StringConcatenate(sVarName, " t2"));
	double   p2         = GlobalVariableGet(StringConcatenate(sVarName, " p2"));
	datetime t3         = GlobalVariableGet(StringConcatenate(sVarName, " t3"));
	double   p3         = GlobalVariableGet(StringConcatenate(sVarName, " p3"));
	int      width      = GlobalVariableGet(StringConcatenate(sVarName, " width"));
	int      style      = GlobalVariableGet(StringConcatenate(sVarName, " style"));
	int      ray        = GlobalVariableGet(StringConcatenate(sVarName, " ray"));
	int      back       = GlobalVariableGet(StringConcatenate(sVarName, " back"));
	color    col        = GlobalVariableGet(StringConcatenate(sVarName, " color"));
	int      fontSize   = GlobalVariableGet(StringConcatenate(sVarName, " fontSize"));
	double   angle      = GlobalVariableGet(StringConcatenate(sVarName, " angle"));
	double   scale      = GlobalVariableGet(StringConcatenate(sVarName, " scale"));
	int      levelWidth = GlobalVariableGet(StringConcatenate(sVarName, " levelWidth"));
	int      levelStyle = GlobalVariableGet(StringConcatenate(sVarName, " levelStyle"));
	color    levelCol   = GlobalVariableGet(StringConcatenate(sVarName, " levelColor"));
	int      arrowCode  = GlobalVariableGet(StringConcatenate(sVarName, " arrowCode"));
	
	string   text;
	
	switch (type) {
	    
	case OBJ_TREND:
	    sObjName = getPrefix(S_TREND, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_TREND, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetPos2(sObjName, t2, p2);
	    objSetStyle(sObjName, width, style, col);
	    objSetRay(sObjName, ray);
	    objSetBack(sObjName, back);
	    break;
	    
	case OBJ_RECTANGLE:
	    sObjName = getPrefix(S_RECTANGLE, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_RECTANGLE, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetPos2(sObjName, t2, p2);
	    objSetStyle(sObjName, width, style, col);
	    objSetBack(sObjName, back);
	    break;
	    
	case OBJ_VLINE:
	    sObjName = getPrefix(S_VLINE, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_VLINE, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetStyle(sObjName, width, style, col);
	    objSetBack(sObjName, back);
	    break;
	    
	case OBJ_HLINE:
	    sObjName = getPrefix(S_HLINE, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_HLINE, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetStyle(sObjName, width, style, col);
	    objSetBack(sObjName, back);
	    break;
	    
	case OBJ_TEXT:
	    text     = varGetText(StringConcatenate(sVarName, " text"));
	    sObjName = getPrefix(S_TEXT, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_TEXT, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetText(sObjName, text, fontSize, col);
	    objSetBack(sObjName, back);
	    objSetAngle(sObjName, angle);
	    break;
	    
	case OBJ_ARROW:
	    sObjName = getPrefix(S_ARROW, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_ARROW, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetStyle(sObjName, width, style, col);
	    objSetBack(sObjName, back);
	    objSetArrowCode(sObjName, arrowCode);
	    break;
	    
	case OBJ_FIBO:
	    sObjName = getPrefix(S_FIBO, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_FIBO, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetPos2(sObjName, t2, p2);
	    objSetStyle(sObjName, width, style, col);
	    objSetBack(sObjName, back);
	    objSetLevelStyle(sObjName, levelWidth, levelStyle, levelCol);
	    break;
	    
	case OBJ_EXPANSION:
	    sObjName = getPrefix(S_EXPANSION, sVarParam[2]);
	    ObjectCreate(sObjName, OBJ_EXPANSION, 0, 0, 0);
	    objSetPos1(sObjName, t1, p1);
	    objSetPos2(sObjName, t2, p2);
	    objSetPos3(sObjName, t3, p3);
	    objSetStyle(sObjName, width, style, col);
	    objSetBack(sObjName, back);
	    objSetLevelStyle(sObjName, levelWidth, levelStyle, levelCol);
	    break;
	    
	default:
	    break;
	}
    }
    
    WindowRedraw();
}

//----------------------------------------------------------------------
void start()
{
    while (IsStopped() == false) {
	if (bMaster) {
	    updateVars();
	} else {
	    updateObjects();
	}
	
	double t = MathMax(tUpdate * 1000, 100);
	Sleep(t);
    }
}
