#include "..\..\inc\swilib.h"
#include "conf_loader.h"
#include "language.h"
#include "createMenu.h"
#include "string_works.h"
#include "adrList.h"

#ifdef MEGADIAL

GBSTMR tmr_scroll;

//extern const int ENA_VIBRA;
//extern const unsigned int vibraPower;
//extern const unsigned int vibraDuration;
extern const char COLOR_MENU_BK[4];
extern const char COLOR_MENU_BRD[4];
extern const char COLOR_NOTSELECTED[4];
extern const char COLOR_SELECTED[4];
extern const char COLOR_SELECTED_BG[4];
extern const char COLOR_SELECTED_BRD[4];
extern const char COLOR_SEARCH_MARK[4];

#define TMR_SECOND 216


#pragma inline
void patch_header(HEADER_DESC* head)
{
  head->rc.x=0;
  head->rc.y=YDISP;
  head->rc.x2=ScreenW()-1;
  head->rc.y2=HeaderH()+YDISP;
}
#pragma inline
void patch_input(INPUTDIA_DESC* inp)
{
  inp->rc.x=0;
  inp->rc.y=HeaderH()+1+YDISP;
  inp->rc.x2=ScreenW()-1;
  inp->rc.y2=ScreenH()-SoftkeyH()-1;
}


#ifdef ELKA
#define MAX_ESTR_LEN 9
#else
#define MAX_ESTR_LEN 13
#endif

#ifdef NEWSGOLD
#define MAX_RECORDS 5000
#define LEVEL1_RN	(41*41)
#define LEVEL2_RN	(41)
#else 
#define MAX_RECORDS 1024
#define LEVEL1_RN	(0x20)
#endif

#define NUMBERS_MAX 5

#define wslen(ARG) (ARG->wsbody[0])

#ifdef NEWSGOLD
#else 
#define LAST_NAME 0x23
#define FIRST_NAME 0x24
#define PHONE_NUMBER 0x2D
#define PHONE_OFFICE 0x2A
#define PHONE_MOBILE 0x2C
#define PHONE_FAX 0x2B
#define PHONE_FAX2 0x5E
#endif

//CSM_DESC icsmd;

//int (*old_icsm_onMessage)(CSM_RAM*,GBS_MSG*);
//void (*old_icsm_onClose)(CSM_RAM*);

int (*old_ed_onkey)(GUI *gui, GUI_MSG *msg);
void (*old_ed_ghook)(GUI *gui, int cmd);
void (*old_ed_redraw)(void *data);

//0 - §Ø§Õ§Ö§Þ §á§à§ñ§Ó§Ý§Ö§ß? §Õ§Ú§Ñ§Ý§à§Ô?
//1 - §Õ§Ú§Ñ§Ý§à§Ô §á§à§ñ§Ó§Ú§Ý§ã§ñ, §Ù§Ñ§è§Ö§á§Ú§Ý§Ú§ã§î, §Ø§Õ§Ö§Þ §Ù§Ñ§è§Ö§á§Ý§Ö§ß? §Ù§Ñ onRedraw
//2 - §Ù§Ñ§è§Ö§á§Ú§Ý§Ú onRedraw, idle-§â§Ö§Ø§Ú?
//3 - §Ù§Ñ§á§â§à§ã §á§à§Ú§ã§Ü§Ñ
//4 - §à§ä§á§â§Ñ§Ó§Ý§Ö?§Ù§Ñ§á§â§à§ã
//5 - §á§â§à§Ú§Ù§Ó§à§Õ§Ú§ä? §á§à§Ú§ã?

volatile int hook_state=0;

volatile WSHDR *e_ws;

volatile int curpos; //§±§à§Ù§Ú§è§Ú§ñ §Ü§å§â§ã§à§â??§ã§á§Ú§ã§Ü§Ö

typedef struct
{
  void *next;
  WSHDR *name;
  WSHDR *num[NUMBERS_MAX];
  WSHDR *icons;
}CLIST2;

volatile CLIST2 *cltop2; //§¯§Ñ§é§Ñ§Ý§à
volatile CLIST2 *clbot; //§¬§à§ß§Ö?
char dstr[NUMBERS_MAX][40];


int menu_icons[NUMBERS_MAX];
int utf_symbs[NUMBERS_MAX];


const int menusoftkeys[]={0,1,2};

SOFTKEY_DESC menu_sk[]=
{
  {0x0018,0x0000,(int)LGP_NULL},
  {0x0001,0x0000,(int)LGP_NULL},
  {0x003D,0x0000,(int)LGP_DOIT_PIC}
};

const SOFTKEYSTAB menu_skt=
{
  menu_sk,0
};


#ifdef NEWSGOLD
#define USR_WIRE 0xE106
#define USR_MOBILE 0xE107
#define WORK_WIRE 0xE108
#define WORK_FAX 0xE109
#define USR_FAX 0xE10A
#define WORK_MOBILE 0xE10E

void InitIcons(void)
{
  menu_icons[0]=GetPicNByUnicodeSymbol(utf_symbs[0]=USR_WIRE); //12345
  menu_icons[1]=GetPicNByUnicodeSymbol(utf_symbs[1]=WORK_WIRE); //093
  menu_icons[2]=GetPicNByUnicodeSymbol(utf_symbs[2]=USR_MOBILE); //651
  menu_icons[3]=GetPicNByUnicodeSymbol(utf_symbs[3]=WORK_MOBILE); //884
  menu_icons[4]=GetPicNByUnicodeSymbol(utf_symbs[4]=USR_FAX);
}

#else
#define USR_WIRE 0xE100
#define WORK_WIRE 0xE102
#define USR_MOBILE 0xE101
#define USR_FAX1 0xE103
#define USR_FAX2 0xE104

void InitIcons(void)
{
  menu_icons[0]=GetPicNByUnicodeSymbol(utf_symbs[0]=USR_WIRE); 
  menu_icons[1]=GetPicNByUnicodeSymbol(utf_symbs[1]=WORK_WIRE); 
  menu_icons[2]=GetPicNByUnicodeSymbol(utf_symbs[2]=USR_MOBILE); 
  menu_icons[3]=GetPicNByUnicodeSymbol(utf_symbs[3]=USR_FAX1);
  menu_icons[4]=GetPicNByUnicodeSymbol(utf_symbs[4]=USR_FAX2);
}
#endif

//§µ§ß§Ú§é§ä§à§Ø§Ú§ä§î §ã§á§Ú§ã§à§Ü
void FreeCLIST2(void)
{
  LockSched();
  CLIST2 *cl=(CLIST2*)cltop2;
  cltop2=0;
  clbot=0;
  UnlockSched();
  while(cl)
  {
//    GetCPUClock();
    CLIST2 *p;
    if(cl->name) FreeWS(cl->name);
    for(int i=0;i<NUMBERS_MAX;i++)
    {
      if(cl->num[i]) FreeWS(cl->num[i]);
    }
    if(cl->icons) FreeWS(cl->icons);
    p=cl;
    cl=(CLIST2*)(cl->next);
    mfree(p);
  }
}

//-----------------------------------------------------
//§±§à§Ú§ã?§á§à§Õ§ã§ä§â§à§Ü??§ã§ä§â§à§Ü§Ö §á§à §Þ§Ö§ä§à§Õ§å ?
//-----------------------------------------------------

#ifdef LANG_CN
static const unsigned short PinYinTable[5227]=
{
  31033,40855,38777,26917,37412,30583,10535,12915,37719,29333,37975,21913,8787,17301,39225,30037,27027,34137,40854,13465,30613,29767,39314,38742,21657,63487,63063,65535,32598,32665,65398,38898,21828,25945,31129,22819,29849,30553,39236,22937,13721,10565,39268,38277,10133,22937,14227,39413,13687,10073,21906,62066,12120,39033,39315,30596,12948,37525,26999,25462,31097,21913,29241,13113,
  38777,39219,22873,13714,31123,38967,37961,38809,39250,9511,39321,9881,38500,38290,10135,38727,14743,37732,37490,37778,35225,33353,63895,34377,38806,22393,17522,38037,22066,17699,34628,31013,22649,38217,21586,38521,21145,13622,18722,22425,21369,10648,25175,18774,39301,21874,34695,10594,10648,18803,38293,31059,38037,30585,26003,31015,39321,37459,21849,14679,31060,14373,8851,17049,
  21145,38297,18725,30756,33639,31125,31048,21832,14119,38233,22133,30105,37701,26002,39250,30585,38697,21143,10645,31111,38969,29331,10549,18728,39321,39257,37682,38249,14233,34457,22824,9111,31093,31033,22885,33574,31060,8823,39207,38793,14627,9353,22370,39314,37495,31129,29266,38804,9619,21847,35190,39225,34167,22905,30018,22936,33346,30103,14739,22613,31042,38489,30581,29331,
  34393,38201,12885,10613,34594,38179,38517,9846,21845,37522,18809,34167,8793,22921,34453,13913,39321,39209,22345,10343,22070,39288,62455,32755,62963,31092,10583,18772,18501,22313,40851,38261,26661,26983,22900,21650,18070,30569,21913,30358,22884,25961,22163,13443,21058,22868,13879,22361,34421,31047,14165,21557,21033,10594,21815,14693,13109,37459,14691,21363,13396,22903,21032,37955,
  29235,29479,30041,22818,38035,22869,9365,14115,38247,21799,10071,17490,21795,31027,21031,16965,34101,38197,63785,10101,21076,10040,18727,13689,22935,22821,13684,13465,37975,8821,30041,21879,17780,21913,21591,34132,38228,37525,22870,17017,22165,39253,22163,39287,21846,38229,22169,29781,9311,38182,40809,9589,21846,39222,39317,25977,22389,30071,14745,13701,39273,37461,38695,37925,
  17145,37412,38265,29556,21315,9252,22390,21913,37973,29751,17241,17737,21843,30007,38777,25237,31095,31094,29257,38041,39209,26169,29271,8786,38233,38037,38713,27001,22425,21079,38297,29525,37497,38275,39252,37753,38903,34345,33909,37673,39321,14165,10066,22420,38258,18329,30582,37727,29305,14711,38185,22327,30514,30615,31122,31065,21107,17748,22867,21289,38696,18807,21127,20307,
  9878,39316,13140,21608,39320,25177,22854,38994,30499,9081,17459,30552,39316,38441,38697,18788,13657,29588,13458,29333,38534,9576,31049,22329,26263,14709,35193,30617,37449,17993,31127,31076,35221,10099,38035,38276,39219,38213,25426,18808,17207,22937,38505,18777,22937,34644,39273,38297,34674,37780,27028,17047,37781,17986,62297,38501,30100,9798,38487,39252,39285,22053,16951,18756,
  17561,10050,34601,38297,10136,14739,26423,65359,38741,22356,37791,38772,22823,39207,22678,18583,22162,38809,37465,39321,29826,13191,10393,31042,38201,38263,38729,18071,29685,21288,10489,13608,27029,22935,37957,26921,39327,37993,37954,21833,38809,39316,22421,30615,39255,31081,37471,38239,39300,30610,38009,9842,29524,38770,39285,22855,31125,63298,26484,14324,9071,8839,39250,34678,
  9587,30805,37458,17495,17481,10649,25465,13638,10628,25977,30281,39282,21141,18329,38742,18569,14745,8773,35129,39250,38215,31043,39285,39285,38547,39269,39223,10615,39321,37943,31027,39287,34102,38009,39225,33881,9874,29785,39321,22854,38469,21910,9061,18807,21398,31017,39007,17445,39321,21029,38489,23031,26009,40950,30612,37974,34921,22872,17047,17300,34853,29785,17495,38984,
  29844,22857,18327,31122,39285,34953,37976,34132,30857,38231,38041,38729,38771,38713,29271,21862,37529,22137,13191,17794,37465,21845,34195,14629,34681,39029,14152,30820,12181,22133,12948,14674,21140,9557,38527,21587,17698,37705,14659,37443,37945,30099,12855,13716,17717,39206,10025,38041,9337,38707,25493,29269,21911,9255,21655,37737,30610,22935,30101,10291,37506,39225,38265,25975,
  22613,21334,31124,13700,9593,34359,9362,37781,37412,30099,38217,37705,25913,38967,21907,37444,18775,39221,38233,22824,26487,33432,22904,38695,39315,10569,34196,22937,30548,21794,26230,22393,21090,39282,9109,29785,26423,39058,38263,39289,29559,29576,37686,13427,14648,37764,31065,38261,21287,35225,13397,39287,37449,22339,38229,21656,21877,39207,31013,39287,22167,17561,38037,13941,
  37783,10066,30505,37429,38553,39317,37753,20345,26228,12873,14473,10645,34932,37528,62293,10645,33875,30073,14646,38291,38260,34194,18729,22835,38691,10536,37717,17269,25426,30342,25989,14658,14197,14665,38710,38293,21369,22933,10089,38553,9110,37769,18835,38435,25497,39305,30307,14194,37780,13862,31125,27031,38725,30105,14711,17781,21833,21844,39273,17557,26969,39285,39209,38808,
  38039,22421,31093,26997,39283,33365,38550,22390,13463,34617,39273,39321,22935,38745,14743,13138,9811,10071,37525,13431,14489,26707,21591,18743,37465,21353,22005,21913,17555,34601,27033,39255,30873,30518,10132,13622,18073,39318,38549,39289,30296,39287,29250,18834,38809,30617,30290,21609,38743,26489,26457,22409,29222,38807,39317,26969,39221,37525,25958,9289,30327,34708,39273,17750,
  39220,22857,10649,13157,21657,29299,38263,37737,26146,21126,30610,35175,38521,25193,13975,38293,30039,31125,22137,22933,21849,39317,9074,27033,21127,39268,38217,37478,39207,22841,26409,22886,34658,38804,30759,18809,26969,37945,37780,30505,38258,38039,18840,38002,18329,30105,25714,37461,38290,22165,22855,16995,38006,25959,21145,9846,18245,26969,39289,21829,10644,12887,38706,29523,
  31031,38391,39321,37689,26229,30019,26482,38180,39257,38489,39319,21396,17497,17556,21143,26966,37493,34130,38279,30579,39317,63894,30006,38713,38232,38226,21845,33433,39287,17301,30613,38729,63346,10537,21913,37749,30503,18258,13609,39314,17733,34169,37785,30805,38194,26439,9602,24375,39010,21545,38453,13139,37748,37494,22164,39301,38292,21911,39219,14194,38243,29561,21634,39316,
  21846,9593,17794,26453,18773,18834,21845,38035,39235,31097,22821,38035,38041,29593,39305,14743,38297,21830,26500,39319,39253,29337,38743,14424,33433,21849,38777,9001,9879,30581,21849,12850,39256,29225,14743,31123,10645,22871,21849,37687,22871,39257,39273,22889,14681,39314,21815,31129,22869,39221,39205,30361,13602,39267,10601,18725,8857,31045,40773,29303,31063,39314,30553,30111,
  10025,25459,38711,37705,37769,14455,10645,38457,22393,37751,31095,12951,38692,37783,38770,17252,38553,10553,29751,22148,31048,16998,37481,37669,10553,30354,9778,21091,29785,8790,18761,17817,18823,10089,17031,38297,22933,14137,9321,14211,35225,37785,21641,10630,9506,22309,30601,27031,14743,22837,30041,22313,21077,38293,8853,27000,21394,29279,21849,39253,34200,35221,17779,26182,
  31013,38710,37529,30521,18291,13459,10388,14117,14489,18787,38242,38761,22903,30099,10039,22642,9028,37461,18248,22854,13401,18517,37961,39321,39289,39320,12834,31090,8857,30105,10649,13618,37529,39221,21652,39316,10329,12889,24471,39314,22933,31109,39220,39319,14457,12953,18729,22085,38697,22823,18487,10101,18568,37513,14697,39305,22825,38297,22313,31017,38946,37991,39318,13637,
  38788,21030,25129,39319,26149,37497,14660,14709,39059,38739,13417,31017,16937,30505,39305,40803,31079,21593,22934,17225,38037,22393,17559,39250,37972,26409,13620,39240,22423,37699,9624,38550,22425,39319,22933,30024,31016,25236,30537,39250,17753,22930,29542,27001,12850,22050,37957,34163,17813,12918,38292,21849,29769,26760,25641,39209,38804,21397,8994,17191,39267,9353,10615,35138,
  37415,38729,37529,37476,34710,26937,10583,18327,22425,21907,31047,31095,21588,22882,37529,39207,39241,39029,34706,26516,29300,9318,8738,35206,18034,17815,30293,30103,38537,22423,21907,31095,10613,29321,8823,10583,17781,39319,33689,30771,14629,9555,26996,10581,35109,10615,33641,21621,29593,22359,25241,22361,9572,38293,14738,13926,26983,26258,37522,14677,16997,17762,21113,38725,
  34405,38037,22932,38777,17810,29813,22329,21795,21849,31028,38228,38293,10649,17523,35124,13638,21287,31127,31028,31016,12917,38711,22936,29849,22425,38905,30295,8809,10135,9109,39289,10739,10645,18770,29273,39319,38807,21383,29561,35170,38741,37412,30567,39320,26409,29241,9829,26409,37778,25145,29526,25970,34164,26754,38805,26914,21845,26007,18322,38261,29766,22935,18329,26519,
  37922,37685,38439,13652,38279,22901,22869,22681,38198,39237,9874,38978,30578,30054,39061,39319,22867,17799,22424,26434,38805,39209,22937,30103,13394,30617,26199,13603,38697,21129,26152,31129,29481,13429,14135,34121,30583,39257,17813,39321,10277,22610,37528,22405,21874,37988,29283,26996,31125,26009,38777,27031,29288,39321,18729,37529,10137,21893,21842,17496,37779,39289,39209,31071,
  38210,29780,10615,10105,10098,14679,22889,38007,25975,30265,30872,34098,39317,34711,26937,18727,22841,37495,30834,9591,29250,30615,8793,21844,38041,9351,18281,38809,25190,22898,31078,38263,21876,30553,31029,39316,38690,17524,22168,22937,35109,21042,25177,37415,30617,37987,33365,22932,26004,39285,14631,30503,22356,31127,38178,26467,14725,21081,39289,9622,39238,38248,29317,38805,
  30103,38439,21831,21908,31095,27029,10615,26009,22822,14232,21897,38485,38724,22327,18761,37668,25911,9289,18281,26003,14674,8745,21337,12838,29847,29589,21400,27029,10135,14649,38743,22361,9625,39320,38777,63826,21027,14681,17751,39257,14485,14629,38807,31033,31129,12949,17721,38777,38783,30550,37685,38485,30105,31221,14137,38745,21849,21364,35225,21657,14660,22313,27001,37526,
  37417,30034,21556,18066,38003,39321,22403,37785,38809,25637,37481,31124,37785,37478,8739,22873,18216,38292,22869,38023,38804,17561,39252,31125,39207,17481,39058,22425,38521,17783,39321,9561,14745,39321,26953,31125,26489,9814,31017,21863,29332,9620,38485,26185,18786,10562,22677,38999,13401,34201,29592,39241,9593,37525,38519,9593,40757,31060,21861,39303,38905,17556,29223,33430,
  22905,29561,30617,21811,34551,21911,39273,30504,35225,22101,27126,30610,10143,33591,21877,10642,31095,38039,14706,38297,30498,26937,17554,30611,30084,25945,38505,9033,37941,29225,26951,10025,22871,30292,12951,25491,39241,22937,38455,37524,38777,21843,14194,22934,39303,21908,38452,26521,22914,17762,14647,9106,30534,30583,31129,31108,37782,17193,12887,22837,21142,38802,9335,29993,
  22105,10615,13721,22005,31097,22423,22937,9559,29335,37522,39314,37689,21827,39257,31044,13716,33861,30100,38178,31065,18296,14677,63890,38233,14713,17527,31125,37527,10069,22643,13657,17815,34649,21097,37783,18840,37938,17017,26953,38277,10069,38515,29557,34169,31065,22834,63781,21912,21909,29991,30567,37442,29299,37524,38741,13385,14664,37426,39319,30615,39250,38231,13465,26403,
  17737,22935,22821,39319,38261,14121,17954,14661,13367,63381,30531,14217,39225,22867,39289,10537,39241,22823,22905,21545,14165,22921,21094,34132,27030,39319,22905,29335,26921,21848,18327,38741,33911,10645,10069,38295,26169,21621,39301,39314,38262,13381,30329,30617,35113,30837,34681,29845,30533,37448,22358,37490,18788,30868,21817,9529,22905,31045,33860,38772,21655,37956,17737,22820,
  22937,38290,33655,22420,22101,9589,21800,38809,38502,31096,21625,31058,39321,10617,21623,31129,13097,31076,30039,37753,31064,26664,22821,21653,26774,39063,18803,21831,31012,13689,9557,22329,38488,38729,21545,30617,17241,10067,37415,21844,30103,29331,9559,34966,10358,26452,21654,38777,18791,30034,25635,29849,22357,25893,38244,39220,22419,38693,38293,29527,22884,63829,38293,39319,
  37481,30549,30505,23026,34197,21909,9561,17814,37927,27033,31017,38293,22937,38805,38809,30098,29305,39316,39289,30868,18758,39289,24473,37778,39234,31010,22818,10135,30615,22933,29493,27029,37481,29560,10137,30581,22903,39321,21346,39315,22562,21399,14629,9555,30035,39222,31127,14743,29764,18327,39315,26212,37714,29218,25127,22527,26517,29592,18009,36711,9047,26482,34679,30805,
  34407,22311,27001,29557,25955,30327,12947,12905,38711,38041,30098,21305,39319,10615,22329,29574,30616,17001,37443,13202,38537,18295,39319,21623,22674,31128,22854,17797,9592,39234,18839,37753,39289,38041,37671,29763,34406,29334,31090,18839,14693,9558,25747,38262,17288,14745,39059,39241,22871,22905,17017,39206,17557,30260,14708,9849,29301,38247,38265,26425,38296,22820,38197,38295,
  18777,37524,38217,13685,38713,39321,21909,33695,26966,38743,38041,30807,31029,39319,17988,38777,22871,21877,10617,21839,25666,30041,17817,39266,17193,38804,17733,37701,37925,17801,21141,29302,22649,29799,34681,35225,22899,30082,34647,21843,18841,22339,17273,38793,27026,14409,30100,38981,21363,31129,22852,18328,14194,22098,38184,34615,26935,25689,38229,38002,9335,17812,34711,31126,
  31122,22899,31095,29589,38757,30617,22855,35222,37687,35218,38809,17554,26953,39269,30329,25750,29476,30550,37510,26242,30103,13397,39321,18839,25240,38791,30853,39287,26949,38807,39205,31124,21910,22867,39241,35159,39289,10601,39045,26453,22905,22902,39321,30615,38770,18329,34423,29303,38697,13410,39241,14739,37957,10120,37957,39289,10599,38229,39298,37412,30549,21091,10569,25747,
  22423,38697,21845,22341,22345,9513,34450,34457,22662,18581,27031,21865,39287,21657,38807,22914,38041,39239,22873,30617,18807,22421,31127,38295,25655,38263,39321,37512,38809,9337,29223,38264,21111,22082,16962,18295,13401,22852,22935,22885,17303,22937,38295,9625,10549,25241,31027,30807,26005,30585,10615,30840,21081,26518,27030,29301,39284,14744,22338,38745,29737,13609,39266,21911,
  30105,37785,30612,22050,10021,37924,38005,38231,39289,31129,17205,38261,38230,38201,12949,13655,14743,9559,14231,18772,22937,30297,9528,37449,38485,39317,18836,13415,18836,39252,10645,10649,14713,31046,29273,39285,21095,17239,17561,12921,22937,37433,39257,22405,10375,38793,31033,37925,34164,29849,39237,39321,38809,22936,39252,38809,16964,29477,36681,38261,31059,39064,38260,29241,
  18324,39257,38041,31031,17913,22089,21288,38981,21650,9619,30579,10617,31129,30537,18329,20471,21545,39225,39251,9556,35225,27031,21906,38761,30553,39238,30521,22873,16969,22377,34882,10610,39321,38041,27033,39287,39286,31047,8853,30041,30553,38281,39241,30098,25974,37493,39317,17049,31123,22937,30595,38291,14213,22931,22918,40790,22937,29336,31097,22932,39321,12084,39319,38949,
  29268,29285,37461,21909,38229,38297,22898,18514,34341,21909,39314,10135,18729,37717,39218,30329,14674,30615,21106,37431,29545,39202,25235,25974,30056,26166,39316,17778,26441,30585,27017,18805,30041,10565,21287,29525,9557,21801,26998,22403,21337,37495,10130,12855,37463,18754,30102,18836,26009,26963,38258,39289,29524,18838,9049,38549,38484,34709,22647,22419,38809,22930,31125,39205,
  37975,37749,9847,21849,18775,37481,27033,22306,37983,37791,27033,35193,22889,39284,31014,37991,14695,29817,17049,25942,8745,21284,29730,39317,31125,37983,38211,39305,29734,22870,38999,25718,22421,22937,38805,21319,13394,38210,25239,25492,25237,38290,27029,18803,13689,14153,10643,30018,29991,39287,22373,22930,21843,37973,39241,30105,39289,39218,9289,22313,38035,39043,25897,10626,
  31124,38233,39251,21845,37751,31091,9622,39269,31016,14146,10021,29273,22329,30583,21369,17719,9833,14729,38247,10567,22933,37783,37993,30537,30581,39321,34453,21893,10116,10645,21122,38185,22306,38805,38482,39241,37781,14233,30549,22340,21843,8788,14706,22597,34676,21906,39287,39317,21655,31059,35221,21876,22869,39321,39220,29476,10132,63831,29433,26931,18943,10133,8799,9791,
  37497,37625,13719,10598,31125,39315,34612,29256,8823,30583,13689,25385,30104,25401,17267,27027,29986,38437,33843,38741,63107,14679,37462,22114,12872,22361,17303,22169,14169,37698,9621,21890,33618,9557,29495,30519,25241,21795,38212,27001,37525,31058,37417,12949,18297,39205,37779,13656,38261,38441,34649,38296,10628,26953,35155,38760,38263,31026,38005,18809,22072,38994,26402,38196,
  39209,38706,13465,33429,18761,39253,9589,39241,21029,63269,33331,10025,10645,30617,21815,39286,22324,38231,18819,18722,39273,22425,21365,9555,39205,22165,13652,31129,21385,62037,13092,29219,27029,17779,17700,30038,17188,10532,37527,37956,39234,9543,30025,18260,30103,18802,39253,25503,10647,18329,10569,37449,37977,13365,30519,26963,22869,21065,9113,13908,38548,39289,39225,25399,
  38774,25462,22115,38745,18329,38291,26519,39318,14710,10646,29593,26741,26169,21801,39062,26985,30361,13385,13714,22934,34645,30101,22871,38233,14197,18039,22870,18834,18838,21140,37942,29784,37782,25638,33625,31093,13926,14745,10085,30245,17986,31095,29591,37463,35221,22873,37929,31045,26406,27033,22134,26965,22100,10599,26968,31093,38745,29847,22873,21042,29337,38259,31124,21399,
  14179,37717,38211,30039,38803,10617,22931,38451,34201,39224,38451,30245,22359,30519,21801,21912,38738,25413,10583,39316,22899,31092,63383,10135,39237,38249,22818,38761,62551,21076,22902,22935,31090,14165,18742,38693,14629,38265,29283,14706,22675,9513,14713,26681,33623,14210,30611,38470,34083,29992,9593,22424,39319,62809,10569,22391,8789,30553,37526,21799,38743,22867,29747,21369,
  39253,39223,38265,37461,22839,31095,21911,30329,26914,21906,21909,38771,25941,21618,30610,38773,26743,39321,13207,31225,14489,39267,31079,30612,22050,35225,38039,37977,30068,13140,18308,21908,37714,8741,39316,14665,39321,30361,39203,33881,14439,39289,14455,25972,30009,22937,22935,33913,34681,37993,30249,25495,38489,39205,29270,39254,25895,38754,31129,21653,22914,39316,37749,30281,
  13641,21897,10324,38776,37973,8855,22935,21877,31122,39415,29522,39254,37673,22937,14745,17749,30580,30293,21910,39255,40823,30068,38265,30105,29814,38806,17048,30549,38295,30105,38265,10583,30089,8857,39209,37751,10649,9609,21141,21394,31125,37716,39321,38745,37513,21816,9625,21849,38178,14194,22361,29554,18242,26423,22935,21798,22313,38788,22419,14167,12949,21906,22933,17047,
  14742,29269,31093,18841,30100,14674,14711,17001,9845,29560,37746,26963,21315,26420,30103,21093,37492,29337,21813,14231,22677,37443,29269,12947,22405,37973,39316,38770,34713,21653,17700,38761,38261,18215,22856,37961,22935,30034,18743,22389,10569,31017,37720,10583,31127,38041,21145,22841,26949,31027,29843,30324,22356,38985,29506,30281,29993,37459,37490,21847,9298,31017,30617,38547,
  38009,9508,17815,21847,12918,21335,30249,13144,22099,17235,39257,31093,18295,38229,38706,9588,22361,18837,26761,31064,31128,38807,21848,22936,21877,31127,37669,38261,27033,38707,21607,9881,31097,22418,29239,34457,17700,9845,30105,31064,29316,38297,13138,38215,21075,21909,37415,17813,34676,18034,21657,38185,16995,30793,35109,37750,30293,22887,16981,26967,38248,22627,38262,38292,
  39205,22873,39289,35175,30006,31097,13716,21369,38711,21141,38803,22857,31033,22418,38009,14723,39282,29273,22902,38005,21141,17750,33858,31065,31060,35129,22919,18777,22403,38217,39317,29273,38951,38041,18840,30777,21331,22932,31059,21369,30805,38775,39319,34711,10569,37929,39253,25890,39031,39316,13657,39271,39251,39287,31061,37750,38499,30505,37954,37782,38473,38805,38025,12841,
  39321,62617,39257,29734,30553,31127,14457,29849,39060,35223,12836,38738,38297,22887,25974,38297,9527,38553,22855,38807,39287,22393,10041,10073,17559,38809,38035,17751,39209,27010,38807,22309,31127,22167,38297,10585,37461,39319,14681,21845,38037,22857,30041,9369,25719,13719,37785,38761,21396,39289,12953,22898,22307,17269,23028,34133,38292,22649,22872,14233,29810,10089,30082,22937,
  38297,34149,18774,9015,18761,25171,29529,18233,22866,22130,30329,38745,18293,37781,14132,38695,39241,38039,38696,22617,18324,24393,17267,18009,16966,29528,18841,10649,30547,30055,37459,10578,25941,22361,26965,38455,9113,38036,38249,31033,30617,29815,31129,21913,14744,22327,30277,38034,17298,12834,22905,21881,39321,22937,37959,38215,31026,38290,39282,17476,38692,21109,12919,14665,
  24409,18326,13124,26483,34198,16969,38777,21879,21796,22149,38742,17749,13417,14649,10615,17459,14073,38185,21913,26729,62617,22341,9559,39235,62247,21080,21077,21849,30498,39256,26467,38280,30617,38777,22905,9589,17463,31090,17305,37447,31042,29491,37719,21097,39239,30585,21401,38789,38809,13113,35106,38978,30357,38809,22425,25239,9543,22937,21843,22422,17481,38291,16953,22887,
  10633,37526,38246,38742,26215,37525,21913,29257,9863,39031,35221,30759,26243,21831,22421,10101,30069,26676,38245,38777,13619,29591,37780,10614,13906,30354,39271,34615,22873,9049,26930,34966,38290,38791,21140,18805,9765,10053,34130,22934,38293,34089,21095,35154,30103,40745,31039,25913,37464,22821,34645,8820,39289,22825,17813,38745,10597,38297,22869,17702,38505,38217,39065,10645,
  37529,39257,38233,22391,30599,30600,10356,39319,38691,14451,13362,38178,38181,37433,22820,22903,21395,34199,25247,29943,13865,37411,21031,10643,22323,38233,21878,21618,38741,39283,22818,25176,30040,25241,38726,14713,38521,39284,38967,30617,14201,38229,38773,38691,13381,38233,37497,29590,39204,38802,37749,31010,22424,25480,22871,16934,22934,38263,29302,10649,14740,17973,13940,38471,
  13971,9831,39266,21842,40802,25977,18805,37527,38297,21061,25666,13906,22937,29332,25207,38808,29513,38276,13602,29298,29845,30069,30009,18210,31031,38292,38745,39238,13715,18803,14706,10104,37526,38740,39254,30584,25970,10649,35159,17449,38185,39289,25397,26201,30037,18825,63897,9826,29529,18771,38229,17781,17559,8787,26919,34082,29250,14229,21367,21657,29524,37529,21913,14456,
  9332,8744,30004,14710,39239,10616,22934,37464,14326,39321,38263,14745,27029,37522,9849,22867,38485,29337,31129,21813,17463,39060,18329,18039,13431,10617,17785,37721,38695,39001,22393,27033,37753,10612,24405,38805,10135,22935,30055,21911,37417,14680,10135,22825,26487,37783,30041,17970,30359,18777,18805,22642,10615,37449,10388,24407,38261,34453,39017,38183,22905,35160,39314,38181,
  30098,38294,13383,30551,26979,39218,18839,9570,22313,17958,26517,9367,30068,31126,21843,38178,14229,12902,30553,38805,38485,22418,33609,14675,30007,14743,14725,31127,22393,38265,17817,38247,18841,37442,38212,38553,29269,38231,39059,38802,18739,21913,39284,30505,38713,31126,38791,25490,37449,38199,37461,9558,38774,31087,39317,21909,10549,18072,34615,38776,22085,38185,38185,17785,
  30617,30023,31080,21913,30569,9781,39321,39317,34199,30100,22073,34133,17750,22935,21833,21590,21845,30095,26009,21570,39254,37975,39218,18757,9301,22937,10130,30007,24435,18841,25673,10612,38551,8755,31127,39282,39029,31017,38777,38473,17459,22329,29475,30825,14233,21593,38709,38777,8761,30612,13400,9620,9575,13892,38297,21913,30613,39284,18294,22167,30297,30103,38295,17186,
  29591,39289,21817,39202,35125,38019,21369,38774,30293,21913,22659,10564,35187,30617,30359,37977,37427,38441,24356,35157,38550,18805,38697,38547,39283,39271,39063,37769,13669,37748,27033,38693,29989,37527,30105,22391,29849,33913,38457,26180,35225,32553,30598,8994,35221,30578,21849,22935,27031,26265,38489,38482,38546,30614,30616,21111,31047,21321,37973,30552,39321,12839,39061,29237,
  22421,21143,38297,38553,25975,38004,25637,21843,21078,13671,21913,31093,38295,29335,25143,39255,30281,27030,38483,38292,31063,22921,38041,14627,38729,37929,31010,29746,38487,39315,31125,22393,9877,31074,13701,39287,22642,39317,13177,37945,38777,18054,10137,9881,30271,30069,13673,18804,21801,62361,30293,21081,22389,22937,38263,30610,21847,35157,38994,12837,29987,37751,14661,38296,
  21575,14471,12953,39301,8852,39059,21033,35127,29748,22137,10359,22887,21831,31061,37781,8857,30581,22313,21081,13203,29337,37462,26404,21075,10611,38773,31103,8850,39253,21397,30073,39257,33689,9203,38228,39204,26229,30582,26005,39256,38805,22921,30515,18789,17815,30035,30101,22357,37972,10084,38229,18819,30069,38181,13394,38809,22343,37444,31092,38262,18729,39239,22930,39317,
  13209,17783,14645,38948,38805,34681,14741,31123,22935,37481,37785,31094,39321,29735,39316,39241,21321,38995,38757,38292,31129,37497,37671,37528,39321,30532,13433,18244,37957,35193,22166,18836,38947,30101,22681,21113,31059,8760,30553,39207,39250,10057,39252,9273,30039,38802,34105,39273,8855,34649,30105,39315,21911,30101,38722,30617,17529,39059,22643,39319,35145,12905,18841,38473,
  39318,22424,17543,38548,38806,10121,22930,35225,39321,22311,38758,39254,39253,10644,39250,38489,37785,39289,22931,21907,17017,39321,39033,39287,38712,38229,37526,39239,26489,18487,39241,17813,39315,10613,37525,37433,29330,37465,39238,14739,13145,17751,30584,39320,17781,26966,38201,14135,17557,38807,14713,38697,22930,29813,37445,17223,39239,10569,22932,38809,21652,29559,13977,38201,
  34681,31058,27000,21554,39321,10643,14633,26998,39283,26482,22885,31110,38261,17047,22855,38212,17737,21331,13607,38697,39315,17017,39064,13353,38034,30021,37961,37721,9364,37779,8745,18279,25494,25751,9830,9878,26713,39319,18470,39205,33827,31049,38964,37785,14631,25460,13688,25240,21812,38724,22933,38292,10137,10098,38297,34594,26951,33653,22818,38201,37522,21045,14743,22900,
  37417,37529,39225,39287,39317,38706,38303,14633,37449,18729,30777,18754,29267,13640,37942,17817,38233,30025,14169,30547,18722,13623,31033,39321,18809,26514,17049,35218,21913,29843,39287,14169,35106,37671,31065,17013,14489,10053,38809,34647,30105,35187,29735,39255,39315,22823,9043,35189,38777,39047,9814,22611,38777,14743,10135,17750,37721,39221,29845,21397,34199,29522,21394,34647,
  38482,27026,22871,36722,39285,26450,21861,9541,10361,14713,31017,37785,9017,39321,34082,37720,30579,22680,34595,33687,22373,21033,38949,21911,31097,37465,22567,14627,9106,21794,30597,9047,9108,9618,21047,22169,39317,37666,39253,31065,30825,39207,30069,29492,17208,9589,22613,22175,34135,14489,37529,39252,14649,30071,14456,30326,18805,13684,37429,31059,29762,9081,22937,30617,
  38211,30100,31129,38805,39321,39283,22933,10569,31060,30279,29988,22389,8857,18839,14647,39209,38025,38297,39314,38297,13138,22341,38292,17811,21877,37461,29588,30009,21828,18841,31065,22935,21881,25913,37954,10533,31059,39319,38293,29220,21801,8850,12066,29218,26226,39209,29479,9047,39284,18839,39286,35224,39257,14483,22932,9625,39010,38233,29491,35129,22423,26932,38482,38293,
  34680,13895,10645,34713,13177,14424,18681,29305,21369,17735,37413,21319,38297,35154,22921,35170,38711,38946,39319,13347,14153,38552,21140,38793,30841,38038,8850,14743,10583,30613,14745,10069,31081,14489,21030,22933,14485,18327,30569,21337,26930,37497,10562,18777,29304,37490,22931,31045,38037,38295,38292,21860,38293,37673,14645,21828,10580,38265,30610,35143,25977,38802,31059,26937,
  29479,18837,31125,31080,39314,31129,9769,39253,39284,14713,37522,30361,25461,13689,21910,31017,22825,37783,29593,39289,38292,39273,37779,34963,18823,10100,9577,39058,37465,22104,38743,26516,38233,10616,10648,14725,35220,14631,30325,39202,33938,37493,38293,38181,38520,39253,31094,26201,30102,8854,38807,22933,30041,37721,10101,10643,13877,9593,39225,26436,38711,35113,30569,39317,
  39223,14739,14711,37941,31015,37730,18297,13716,18841,22599,40793,34451,22375,18469,31090,35113,38805,39001,31129,38772,10537,30841,38547,31059,21033,27031,21401,38790,9559,18837,21797,22135,10585,22153,31125,30617,31125,39319,39254,9625,30549,18838,31026,30069,37951,38745,35225,37954,22104,10649,10617,21544,9044,39065,22681,31065,38215,38293,22376,17047,37509,38281,22821,10292,
  30037,30549,31077,39282,21849,37720,10642,37782,38803,17813,38950,38021,26007,16965,37717,18838,20371,22069,17785,38969,22329,35155,14665,30105,37780,18290,30341,38983,22164,22355,22932,39209,30361,26434,38791,21877,38553,30599,10613,30583,39316,21892,38775,22932,26777,25689,31093,26943,38517,38040,25205,37462,38709,21081,10023,10600,29267,21141,21145,30105,10130,30021,22391,10647,
  25973,14196,35191,38297,13685,22425,39225,38483,40839,21875,21875,38292,22903,39298,30787,37427,14738,22857,29766,26002,30041,22162,22869,13687,9513,22866,38197,29269,22825,25161,30501,38293,39001,37973,31033,10117,13207,10598,33353,37429,9254,22423,13641,30340,31097,29988,39202,13702,21129,30327,10391,37750,25429,21145,10601,37720,39317,18739,13431,31076,8853,31016,38745,21893,
  38265,13378,13609,21849,30087,38693,9766,21817,21650,38290,29785,21816,38806,14197,14706,9287,38243,38499,34370,22117,22820,33394,37462,39221,21797,21335,14119,39252,8853,39205,12889,38485,30566,10599,30500,29733,22935,14230,31081,9305,18759,37428,24420,30805,10645,30807,39317,39241,31017,38809,30105,63349,22632,37492,34163,39289,34596,63876,38774,10532,18839,25957,37993,21864,
  21571,30101,37529,14665,18258,33909,17784,13715,39289,14745,29299,38805,37719,9625,37747,9529,8856,21843,21394,30550,37945,30068,10537,38777,39223,25490,30617,21401,37465,38999,39285,38809,39314,38291,31081,30018,18809,39316,22674,37433,22393,30520,14743,13622,18841,21909,38805,38487,30615,17817,38036,9618,38292,18226,21625,38297,25938,21913,27033,38547,22899,21906,14626,14659,
  9817,39065,30055,14153,27028,21897,22931,18775,38505,37477,39257,33577,21913,38739,63858,38489,30038,21298,21397,17474,22386,9624,13655,13189,26213,18578,9033,13175,22393,37481,39271,39203,17704,37527,38280,17442,34615,34710,9623,22424,31061,30706,22135,21285,33935,18322,22610,22900,33365,14228,38233,31031,18324,38738,13463,18760,14226,31033,39235,38232,38297,22425,39319,39207,
  29588,18325,18841,18263,13209,30515,21797,13175,30105,13721,34169,21637,10325,17561,30853,39301,34098,38260,31097,37688,39321,39321,34937,21845,9879,18249,29849,37479,25943,29591,38804,13465,18215,30041,34133,21908,34681,22932,37784,26169,21619,30578,13363,30617,21891,9625,39319,14167,30101,8791,29266,37779,22313,22903,12839,29491,13607,31111,38809,14713,39283,21145,33320,14119,
  22644,35109,22930,38291,13858,29522,22937,38260,37522,39224,38452,18500,37961,9363,17031,30041,27033,37480,34649,12921,10105,39305,25657,37481,30357,34899,38808,22834,14119,38713,38229,13090,17769,9364,10053,21097,30297,22377,9108,34598,9524,39218,38713,30614,10627,31129,38777,21401,21033,30616,38743,22905,30057,38233,31033,30850,34661,14457,22393,37443,14681,30036,17767,22680,
  31011,31125,22615,30553,38713,31124,14194,38004,39288,18293,30600,30098,12952,39321,31095,38293,29334,37490,9369,38295,10323,39059,38293,38809,34201,22361,30025,39062,10098,30613,39251,38248,38552,17733,9591,22425,38263,29305,38745,30546,8786,38745,39316,22857,8792,21385,21652,29828,38738,38743,21079,21858,31033,21800,22340,63319,14421,13945,33573,29591,29224,30515,22932,30615,
  37464,38776,22423,21827,10583,26471,22902,18039,21093,25399,17305,9523,38041,38037,38805,30564,9300,39271,35161,38295,10020,10614,14745,16983,38200,18292,30056,22418,38217,38451,37991,22345,30504,38179,37431,38516,37752,14149,30595,9108,39321,38997,22825,18837,21332,34105,31094,38551,38724,18295,30552,21093,31129,39289,13606,14663,38453,9557,38229,39269,14662,33911,22932,8857,
  39284,29337,38217,9591,37779,18841,39287,31047,30295,35159,38040,31095,21079,34148,26455,21113,38293,22937,31017,38185,35143,21815,39273,17465,38805,22852,10066,18775,21847,14742,38213,38201,9048,26404,14741,29730,21832,38969,21844,39321,21844,18549,21831,30073,9529,13924,38773,8755,31128,17267,29271,18546,22393,25234,39318,38260,38212,14708,37525,13715,14231,39206,13428,38809,
  21907,10567,14745,13971,25972,22915,38034,10610,18771,39321,35209,14649,39204,21908,18841,18037,39319,25682,21843,30808,10585,37461,22613,21304,22420,30069,39223,10103,22355,39301,39255,30005,39255,13719,21639,22935,25335,34711,21380,33334,31049,37989,13721,37943,31129,38948,17751,9367,39314,22613,35208,33942,38994,27026,38290,38693,38297,38264,31012,21812,38217,38537,34201,31129,
  39257,39317,26521,26980,22931,21586,31127,25943,26965,31079,13458,39317,38693,38793,18755,17737,21801,39220,26520,29266,37927,13383,25204,39321,22869,39316,21845,37977,17993,21847,21141,21141,29993,22898,26201,29273,22373,30069,26009,22901,38261,18018,26162,30579,22838,12903,26227,25702,17401,33876,21576,25972,37954,35127,14182,39314,26521,22905,37432,10649,37529,14742,13205,38499,
  39282,9881,37506,25481,18838,33588,17017,34967,13175,33593,30585,39033,37977,38793,9625,38009,18777,39321,39270,21909,8791,39234,39209,39209,9560,27031,37525,26921,38809,37785,14633,10578,22850,38949,29337,38761,22167,21332,21587,17015,21545,65433,65535
};
  

#endif
unsigned int us_reverse(unsigned int v)
{
  return((v>>8)|((v&0xFF)<<8));
}

int CompareStrT9(WSHDR *ws, WSHDR *ss, int need_insert_color)
{
  int spos=1;
  int wpos=1;
  int c;
  
  int first_pos=-1;

  //§´§Ñ§Ò§Ý§Ú§è?§Ü§Ý§ð§é§Ö§Û §Õ§Ý§ñ §á§à§Ú§ã§Ü§Ñ §ä§Ö§Ü§ã§ä§Ñ
  static const char key[256]=
    "11111111111111111111111111111111"   
      "10001**0***0000*012345678900***0"
	"0222333444555666777788899991*110"
	  "122233344455566677778889999111*1"
	    "11111111111111111111111111111111"
	      "11111111311111111111111131111111"
		"22223333444455566677778888899999"
		  "22223333444455566677778888899999";

  if (!wslen(ss)) return(1); //§±§å§ã§ä? §ã§ä§â§à§Ü§Ñ §Ó§ã§Ö§Ô§Õ§Ñ §á§Ý§ñ§ê§Ö?;)
  if (!wslen(ws)) return(0); //?§á§å§ã§ä? §Ú§ã§ç§à§Õ§ß? §ß§Ö §ã§ä§â§Ö?§Ö§ä ;)
  do
  {
    c=ws->wsbody[wpos];
    if ((wpos==1)&&(c=='+'))
    {
      wpos=2; //§±§â§à§á§å§ã?§á§Ö§â§Ó§à§Ô?'+'
      continue;
    }
    if (!spos)
    {
      //§ª§ë§Ö§Þ §á§â§à§Ò§Ö§Ý
      if (c==' ') spos=1; //§¯§Ñ§é§Ú§ß§Ñ§Ö§Þ §Ù§Ñ§ß§à§Ó§à
    }
    else
    {
      //§±§â§Ö§à§Ò§â§Ñ§Ù§å§Ö??§Ü§à?§Ü§ß§à§á§Ü§Ú
#ifdef LANG_CN
      unsigned short temp;
      temp=(c >= 0x4E00 && c <= 0x9FA8 )?PinYinTable[(c  >> 2) - 4992]:0xFFFF;
      temp=(temp >> ((c&0x03) << 2))&0x0F;
      if (c>255&&(temp!=0xF)) c=temp+'0';
      else
#endif
      {
      if ((c>=0x410)&&(c<0x450)) c-=0x350;
      if ((c==0x401)) c=0xA8;
      if ((c==0x451)) c=0xB8;
      c&=0xFF;
      c=key[c];
      }
      if (c==ss->wsbody[spos])
      {
	if (first_pos<0) first_pos=wpos;
	spos++;
	if (spos>wslen(ss))
	{
	  if (need_insert_color&&(first_pos>0))
	  {
	    wsInsertChar(ws,us_reverse(((unsigned short *)COLOR_NOTSELECTED)[1]),wpos+1);
	    wsInsertChar(ws,us_reverse(((unsigned short *)COLOR_NOTSELECTED)[0]),wpos+1);
	    wsInsertChar(ws,0xE006,wpos+1);
	    wsInsertChar(ws,us_reverse(((unsigned short *)COLOR_SEARCH_MARK)[1]),first_pos);
	    wsInsertChar(ws,us_reverse(((unsigned short *)COLOR_SEARCH_MARK)[0]),first_pos);
	    wsInsertChar(ws,0xE006,first_pos);
	  }
	  return(1); //§£§ã?§ã§à§Ó§á§Ñ§Ý?	
	}
      }
      else 
      {
	first_pos=-1;
	spos=0; //§ª§ë§Ö§Þ §ß§à§Ó§à?§ã§Ý§à§Ó?      
      }
    }
    wpos++;
  }
  while(wpos<=wslen(ws));
  return(0);
}

//=====================================================
// §¬§à§ß§ã§ä§â§å§Ü§ä§à?§ã§á§Ú§ã§Ü§Ñ
//=====================================================

void ConstructList2(void)
{
  CLIST2 contact;
  WSHDR *sws=AllocWS(50);
  int n;
  int total=0;
  CLIST *cl=(CLIST *)cltop;
//  if(!cl)
//  {
//    hook_state=2;
//    return;
//  }
  
  FreeCLIST2();
  
  LockSched();
  if (e_ws) wstrcpy(sws,(WSHDR *)e_ws);
  if (hook_state==4) hook_state=5;
  UnlockSched();
  
  
  zeromem(&contact,sizeof(contact));
  while(cl)
  {
//    GetCPUClock();
    if (hook_state!=5) break;
    zeromem(&contact,sizeof(contact));
    wstrcpy(contact.name=AllocWS(150),cl->name);
    *((int *)(&contact.next))|=CompareStrT9(contact.name,sws,0);
    contact.icons=AllocWS(NUMBERS_MAX);
    for(n=0;n<NUMBERS_MAX;n++)
    {
      char *nm;
      if(!(nm=cl->num[n])) continue;
      WSHDR *ws=contact.num[n]=AllocWS(50);
      wsAppendChar(contact.icons,utf_symbs[n]);
      num_2ws(ws, nm, 50);
      *((int *)(&contact.next))|=CompareStrT9(ws,sws,0);
    }
    if (!contact.next)
    {
      FreeWS(contact.name);
      for(int i=0;i<NUMBERS_MAX;i++)
      {
	if(contact.num[i]) FreeWS(contact.num[i]);
      }
      FreeWS(contact.icons);
    }
    LockSched();
    if ((hook_state==5)&&(contact.next))
    {
      CLIST2 *p=malloc(sizeof(contact));
      CLIST2 *b=(CLIST2 *)clbot;
      contact.next=0;
      memcpy(p,&contact,sizeof(contact));
      if (b)
      {
	b->next=p;
	clbot=p;
      }
      else
      {
	cltop2=p;
	clbot=p;
      }
      if (curpos<2)
      {
	if (total<5) REDRAW();
      }
      else
      {
	if ((unsigned int)(total-(curpos-2))<5) REDRAW();
      }
      total++;
    }
    UnlockSched();
    cl=cl->next;
  }
  if (contact.next)
  {
    FreeWS(contact.name);
    for(int i=0;i<NUMBERS_MAX;i++)
    {
      if(contact.num[i]) FreeWS(contact.num[i]);
    }
    FreeWS(contact.icons);
  }
  LockSched();
  if (hook_state==5) hook_state=2; else FreeCLIST2();
  UnlockSched();
  REDRAW();
  FreeWS(sws);
}

#pragma optimize=no_inline
void f_dummy(void){}

volatile int scroll_disp;
volatile int max_scroll_disp;

void scroll_timer_proc(void)
{
  int i=max_scroll_disp;
  if (i)
  {
    if (scroll_disp>=i)
    {
      scroll_disp=0;
      GBS_StartTimerProc(&tmr_scroll,TMR_SECOND,scroll_timer_proc);
    }
    else
    {
      scroll_disp++;
      GBS_StartTimerProc(&tmr_scroll,scroll_disp!=i?TMR_SECOND>>3:TMR_SECOND,scroll_timer_proc);
    }
    REDRAW();
  }
}

void DisableScroll(void)
{
  GBS_DelTimer(&tmr_scroll);
  max_scroll_disp=0;
  scroll_disp=0;
}

void my_ed_redraw(void *data)
{
  //  WSHDR *ews=(WSHDR*)e_ws;
  int i=curpos-2;
  int cp;
  CLIST2 *cl=(CLIST2 *)cltop2;
  old_ed_redraw(data);
  
  WSHDR *prws, wsn;//=AllocWS(256);
  unsigned short wsb[256];
  prws=CreateLocalWS(&wsn, wsb, 256);
  
  if (!e_ws) return;
#ifdef LANG_CN
  if(!cl)
  {
    char num[50];
    int wlen;
    extern int GetProvAndCity(unsigned short *pBSTR, char *pNoStr);
    extern int isNum(WSHDR *num);
    extern const char COLOR_CODE_SHOW[4];
    if(!(wlen=e_ws->wsbody[0])) return;
    if(e_ws->wsbody[1]=='0') 
    {
      if(wlen<4) return;
    }
    else if(wlen<7) return;
    if(!isNum((WSHDR *)e_ws)) return;
    int y=ScreenH()-SoftkeyH()-(GetFontYSIZE(FONT_MEDIUM)+1)*5-5;
    ws_2num((WSHDR *)e_ws, num, 49);
    GetProvAndCity(prws->wsbody, num);
    DrawString(prws,3,4*(GetFontYSIZE(FONT_MEDIUM)+1)+y+4,ScreenW()-4,5*(GetFontYSIZE(FONT_MEDIUM)+1)+y+3,FONT_SMALL,TEXT_ALIGNRIGHT|TEXT_NOFORMAT,COLOR_CODE_SHOW,GetPaletteAdrByColorIndex(23));
    return;
  }
#else
  if (!cl) return;
#endif
//  GetCPUClock();
  if (e_ws->wsbody[0]<MAX_ESTR_LEN) //§¦§Ö §Õ§Ý§Ú§ß?<MAX_ESTR_LEN
  {
    int y=ScreenH()-SoftkeyH()-(GetFontYSIZE(FONT_MEDIUM)+1)*5-5;

    DrawRoundedFrame(1,y,ScreenW()-2,ScreenH()-SoftkeyH()-2,0,0,0,COLOR_MENU_BRD,COLOR_MENU_BK);

    if (i<0) cp=curpos; else cp=2;
    while(i>0)
    {
      if (!cl) break;
      cl=(CLIST2 *)(cl->next);
      i--;
    }
    i=0;
    do
    {
      int dy=i*(GetFontYSIZE(FONT_MEDIUM)+1)+y;
      if (!cl) break;
      if (i!=cp)
      {
	wstrcpy(prws,cl->name);
	if (e_ws) CompareStrT9(prws,(WSHDR *)e_ws,1);
	DrawString(prws,3,dy+4,ScreenW()-4,dy+3+GetFontYSIZE(FONT_MEDIUM),FONT_MEDIUM,0x80,COLOR_NOTSELECTED,GetPaletteAdrByColorIndex(23));
	//DrawScrollString(cl->name,3,dy+4,ScreenW()-4,dy+3+GetFontYSIZE(FONT_MEDIUM),1,FONT_MEDIUM,0x80,COLOR_NOTSELECTED,GetPaletteAdrByColorIndex(23));
      }
      else
      {
	int icons_size=Get_WS_width(cl->icons,FONT_MEDIUM_BOLD);
	{
	  int i=Get_WS_width(cl->name,FONT_MEDIUM_BOLD);
	  i-=(ScreenW()-7-icons_size);
	  if (i<0)
	  {
	    DisableScroll();
	  }
	  else
	  {
	    if (!max_scroll_disp)
	    {
	      GBS_StartTimerProc(&tmr_scroll,TMR_SECOND,scroll_timer_proc);
	    }
	    max_scroll_disp=i;
	  }
	}
	DrawRoundedFrame(2,dy+2,ScreenW()-3,dy+3+GetFontYSIZE(FONT_MEDIUM_BOLD),0,0,0,COLOR_SELECTED_BRD,COLOR_SELECTED_BG);
	DrawScrollString(cl->name,3,dy+4,ScreenW()-5-icons_size,dy+3+GetFontYSIZE(FONT_MEDIUM_BOLD),scroll_disp+1,FONT_MEDIUM_BOLD,0x80,COLOR_SELECTED,GetPaletteAdrByColorIndex(23));
	DrawString(cl->icons,ScreenW()-4-icons_size,dy+4,ScreenW()-5,dy+3+GetFontYSIZE(FONT_MEDIUM_BOLD),FONT_MEDIUM_BOLD,0x80,COLOR_SELECTED,GetPaletteAdrByColorIndex(23));
#ifdef LANG_CN
	if(e_ws->wsbody[0]<7)
	for(int z=NUMBERS_MAX-1;z>=0;z--)
	{
	  if(cl->num[z])
	  {
	    extern void AppendInfoW(WSHDR *pWS, WSHDR * pNo);
	    extern const char COLOR_CODE_SHOW[4];
	    CutWSTR(prws, 0);
	    AppendInfoW(prws, cl->num[z]);
	    DrawString(prws,
		       ScreenW()-4-Get_WS_width(prws, FONT_SMALL),
		       y-GetFontYSIZE(FONT_SMALL)-1,
		       ScreenW()-5,
		       y,
		       FONT_SMALL,
		       0x80,
		       COLOR_CODE_SHOW,
		       GetPaletteAdrByColorIndex(23)
			 );
	    break;
	  }
	}
#endif
      }
      cl=(CLIST2 *)cl->next;
      i++;
    }
    while(i<5);
  }
//  FreeWS(prws);
}

void ChangeRC(GUI *gui)
{
#ifdef ELKA
  static const RECT rc={6,80,234,140};
#else
  static const RECT rc={6,40,126,100};
#endif
  if (e_ws)
  {
    if (wslen(e_ws)>=MAX_ESTR_LEN) return;
  }
  if (!gui) return;
  char *p=(char *)gui;
  p+=DISPLACE_OF_EDGUI;
  gui=*((GUI **)p);
  if (!gui) return;
  void **m=GetDataOfItemByID(gui,4);
  if (gui->canvas) memcpy(gui->canvas,&rc,sizeof(rc));
  if (!m) return;
  if (m[0]) memcpy(m[0],&rc,sizeof(rc));
}


int is_sms_need=0;
//WSHDR *ews;

IPC_REQ mss_ipc=
{
  "MySMSYS",
  "MySMSYS",
  NULL
};
#define SMSYS_IPC_NEWSMS_NUM 0x82

void VoiceOrSMS(const char *num)
{
  if (!is_sms_need)
  {
//    #ifdef NEWSGOLD
//    MakeVoiceCall(num,0x10,0x20C0);
//    #else
    MakeVoiceCall(num,0x10,0x2FFF);
//    #endif
  }
  else
  {
    char *data;
    int len;
    if(!num || !(len=strlen(num))) return;
    data=malloc(len);
    strcpy(data, num);
    LockSched();
    mss_ipc.data=data;
    GBS_SendMessage(MMI_CEPID,MSG_IPC,SMSYS_IPC_NEWSMS_NUM,&mss_ipc);
    UnlockSched();

  }
}

typedef struct
{
  void *next;
  int index;
}NUMLIST;

int gotomenu_onkey(void *data, GUI_MSG *msg)
{
  int i;
  NUMLIST *nltop=MenuGetUserPointer(data);
  if ((msg->gbsmsg->msg==KEY_DOWN)&&(msg->gbsmsg->submess==GREEN_BUTTON))
  {
    msg->keys=0x18;
  }
  if (msg->keys==0x18 || msg->keys==0x3D)
  {
    i=GetCurMenuItem(data);
    for(int d=0; d!=i && nltop; d++) nltop=nltop->next;
    if (nltop)
    {
      VoiceOrSMS(dstr[nltop->index]);
      return (1);
    }
  }
  return(0);
}

void gotomenu_ghook(void *data, int cmd)
{
  NUMLIST *nltop=MenuGetUserPointer(data);
  if(cmd==3)
  {
    while(nltop)
    {
      NUMLIST *nl=nltop;
      nltop=nltop->next;
      mfree(nl);
    }
  }
/*  else if(cmd==2)
  {
    WSHDR *hdr_t=AllocWS(64);
#ifdef LANG_CN
    wsprintf(hdr_t, "%t%t...", lgp.LGP_SELECT, lgp.LGP_NUMBER);
#else
    wsprintf(hdr_t, "%t %t...", lgp.LGP_SELECT, lgp.LGP_NUMBER);
#endif
    SetHeaderText(GetHeaderPointer(data), hdr_t, malloc_adr(), mfree_adr());
  }*/
}
    

const HEADER_DESC gotomenu_HDR={0,0,131,21,/*icon*/0,LGP_NULL,LGP_NULL};

#ifdef LANG_CN
void gotomenu_itemhandler(void *data, int curitem, void *user_pointer)
{
  WSHDR *ws1, *ws2;
  NUMLIST *nltop=user_pointer;
  void *item=AllocMLMenuItem(data);
  for(int d=0; d!=curitem && nltop; d++) nltop=nltop->next;
  if (nltop)
  {
    extern void AppendInfoW(WSHDR *pWS, WSHDR * pNo);
    ws1=AllocMenuWS(data,40);
    ws2=AllocMenuWS(data,40);
    num_2ws(ws1,dstr[nltop->index],39);
    AppendInfoW(ws2, ws1);
    SetMenuItemIconArray(data, item, menu_icons);
    //SetMenuItemText(data, item, ws, curitem);
    SetMLMenuItemText(data, item, ws1, ws2, curitem);
    SetMenuItemIcon(data,curitem,nltop->index);
  }
}


ML_MENU_DESC gotomenu_STRUCT=
{
  8,gotomenu_onkey,gotomenu_ghook,NULL,
  menusoftkeys,
  &menu_skt,
  1|0x10,
  gotomenu_itemhandler,
  NULL,
  NULL,
  0,
  1
};

#else

void gotomenu_itemhandler(void *data, int curitem, void *user_pointer)
{
  WSHDR *ws;
  NUMLIST *nltop=user_pointer;
  void *item=AllocMenuItem(data);
  for(int d=0; d!=curitem && nltop; d++) nltop=nltop->next;
  if (nltop)
  {
    ws=AllocMenuWS(data,40);
    str_2ws(ws,dstr[nltop->index],39);
    SetMenuItemIconArray(data, item, menu_icons);
    SetMenuItemText(data, item, ws, curitem);
    SetMenuItemIcon(data,curitem,nltop->index);
  }
}


MENU_DESC gotomenu_STRUCT=
{
  8,gotomenu_onkey,gotomenu_ghook,NULL,
  menusoftkeys,
  &menu_skt,
  1|0x10,
  gotomenu_itemhandler,
  NULL,
  NULL,
  0
};

#endif

int my_ed_onkey(GUI *gui, GUI_MSG *msg)
{
  int key=msg->gbsmsg->submess;
  int m=msg->gbsmsg->msg;
  int r;
  int i=0;
  int n=0;
  
  NUMLIST *nltop=0, *nlbot;
  CLIST2 *cl=(CLIST2 *)cltop2;
  nlbot=(NUMLIST *)&nltop;
  
  is_sms_need=0;
  if ((key==RIGHT_BUTTON)&&(m==KEY_DOWN))
  {
    EDITCONTROL ec;
    ExtractEditControl(gui,1,&ec);
    if (ec.pWS->wsbody[0]==EDIT_GetCursorPos(gui)-1)
    {
//      ShowMSG(1,(int)"Try to write SMS!");
      if(!cl)
      {
	DisableScroll();
	//create new sms
	char *dt=malloc(50);
	ws_2num(ec.pWS, dt, 49);
	LockSched();
	mss_ipc.data=dt;
	GBS_SendMessage(MMI_CEPID,MSG_IPC,SMSYS_IPC_NEWSMS_NUM,&mss_ipc);
	UnlockSched();
	return(1);
      }
      else is_sms_need=1;
    }
  }
  if (key==GREEN_BUTTON||is_sms_need)
  {
    DisableScroll();
    if (!cl) goto L_OLDKEY;
    while(i!=curpos)
    {
      i++;
      cl=(CLIST2 *)cl->next;
      if (!cl) goto L_OLDKEY;
    }
    //§´§Ö§á§Ö§â§î cl §å§Ü§Ñ§Ù§í§Ó§Ñ§Ö?§ß§Ñ §Ó§ç§à§Õ
    r=0;
    do
    {
      if (cl->num[r])
      {
        nlbot=nlbot->next=malloc(sizeof(NUMLIST));
        nlbot->next=0;
        nlbot->index=r;
        ws_2str(cl->num[r],dstr[r],39);
        n++;
      }
      r++;
    }
    while(r<NUMBERS_MAX);
    if (n==1) //§´§à§Ý§î§Ü§à §à§Õ§Ú§ß §ß§à§Þ§Ö?    
    {
      VoiceOrSMS(dstr[nltop->index]);
      mfree(nltop);
      return(1); //§©§Ñ§Ü§â§í§ä?§ß§Ñ?    
    }
    if (n==0) goto L_OLDKEY; //§¯§Ö?§Ó§à§à§Ò§ë§Ö §ä§Ö§Ý§Ö§æ§à§ß§à?    //§¬§à§Ý§Ú§é§Ö§ã§ä§Ó§à §ß§à§Þ§Ö§â§à?§Ò§à§Ý§î§ê§Ö 1, §â§Ú§ã§å§Ö§Þ §Þ§Ö§ß§ð
    patch_header((HEADER_DESC *)&gotomenu_HDR);
    WSHDR *hdr_t=AllocWS(64);
    if(!cl->name || !cl->name->wsbody[0])
    {
#ifdef LANG_CN
      wsprintf(hdr_t, "%t%t...", lgp.LGP_SELECT, lgp.LGP_NUMBER);
#else
      wsprintf(hdr_t, "%t %t...", lgp.LGP_SELECT, lgp.LGP_NUMBER);
#endif
    }
    else wstrcpy(hdr_t, cl->name);
#ifdef LANG_CN
    CreateMLMenuWSHDR(&gotomenu_STRUCT, &gotomenu_HDR, hdr_t, n-1, n, nltop);
#else
    CreateSLMenuWSHDR(&gotomenu_STRUCT, &gotomenu_HDR, hdr_t, n-1, n, nltop);
#endif
    return(1);
  }
  if ((key==UP_BUTTON)||(key==DOWN_BUTTON))
  {
    //§¯§Ö §à§Ò§â§Ñ§Ò§Ñ§ä§í§Ó§Ñ§Ö§Þ §â§Ö§Õ§Ñ§Ü§ä§à§â§à§Þ §Ó§Ó§Ö§â?§Ó§ß§Ú§Ù
    msg->keys=0;
    if ((m==KEY_DOWN)||(m==LONG_PRESS))
    {
      DisableScroll();
      if (key==UP_BUTTON)
      {
	if (curpos) curpos--;
      }
      if (key==DOWN_BUTTON)
      {
	if (cl)
	{
	  do
	  {
	    cl=(CLIST2 *)cl->next;
	    if (!cl) break;
	    i++;
	  }
	  while(i<=curpos);
	}
	curpos=i;
      }
    }
    r=-1; //§±§Ö§â§Ö§â§Ú§ã§à§Ó§Ñ§ä§î
  }
  else
  {
    #ifdef NEWSGOLD
    if ((key>='0'&&key<='9')||(key=='*')||(key=='#')||(key==RIGHT_SOFT))
    #else
    if ((key>='0'&&key<='9')||(key=='*')||(key=='#')||(key==LEFT_SOFT))
    #endif  
    {
      if (m==KEY_DOWN)
      {
	DisableScroll();
	if (hook_state>=2) //§£§à§Ù§Þ§à§Ø§ß§à §Ú§Ù§Þ§Ö§ß§Ö§ß§Ú?§ã§ä§â§à§Ü§Ú §Ó§Ó§à§Õ? §ä§â§Ö§Ò§å§Ö§ä§ã§ñ §á§à§Ú§ã?	
	{
	  hook_state=3;
	}
      }
    }
  L_OLDKEY:
    r=old_ed_onkey(gui,msg);
  }
  ChangeRC(gui);
  return(r);
}

void CloseMegaDial(void);

void *methods[16];
void **old_methods;
void my_ed_ghook(GUI *gui, int cmd)
{
  void **m=GetDataOfItemByID(gui,4);
  if ((hook_state==1)/*&&(cmd==7)*/)
  {
    //§¸§Ö§á§Ý§ñ§Ö§Þ §Þ§Ö§ä§à?onRedraw
    if (m)
    {
      if (m[1])
      {
	//GetCPUClock();
	old_methods=m[1];
	memcpy(methods,old_methods,sizeof(methods));
	old_ed_redraw=(void (*)(void *))(methods[0]);
	methods[0]=(void *)my_ed_redraw;
	m[1]=methods;
	hook_state=3; //§©§Ñ§á§â§à§ã §á§à§Ú§ã§Ü§Ñ
      }
    }
  }
  old_ed_ghook(gui, cmd);
  if (cmd==7)
  {
    EDITCONTROL ec;
    ExtractEditControl(gui,1,&ec);
    //§¯§à§Ó§Ñ§ñ §ã§ä§â§à§Ü§Ñ §á§à§Ú§ã§Ü§Ñ
    if ((e_ws=ec.pWS)->wsbody[0]<MAX_ESTR_LEN) //§¦§Ö §Õ§Ý§Ú§ß?<MAX_ESTR_LEN
    {
      if (hook_state==3)
      {
	curpos=0;
	hook_state=4;
	SUBPROC((void *)ConstructList2);
      }
    }
  }
  else if(cmd==3) //destroy
  {
//    extern int MDgui_id; //main.c
    CloseMegaDial();
//    MDgui_id=0;
  }
  ChangeRC(gui);
}

INPUTDIA_DESC my_ed;
INPUTDIA_DESC *old_ed;
void DoSplices(GUI *gui)
{
  //GetCPUClock();
  old_ed=gui->definition;
  memcpy(&my_ed,old_ed,sizeof(INPUTDIA_DESC));
  old_ed_onkey=my_ed.onKey;
  old_ed_ghook=my_ed.global_hook_proc;
  my_ed.onKey=my_ed_onkey;
  my_ed.global_hook_proc=my_ed_ghook;
  gui->definition=&my_ed;
  scroll_disp=0;
  REDRAW();
}

void DoMegaDial(void *igui)
{
  if(!hook_state)
  {
    //§¯§Ö §Ò§í§Ý§à §Õ§Ú§Ñ§Ý§à§Ô
    DoSplices(igui);
    hook_state=1;
  }
}

void CloseMegaDial(void)
{
  hook_state=0;
  e_ws=0;
  FreeCLIST2();
  DisableScroll();
}

void RestoreMegaDial(void)
{
#define DISPLACE_OF_EDGUI_ID2 0x38 //use number
#define edialgui_id (((int *)icsm)[DISPLACE_OF_EDGUI_ID/4])
#define edialgui_id2 (((int *)icsm)[DISPLACE_OF_EDGUI_ID2/4])
  GUI *gui;
  //GetCPUClock();
  CSM_RAM *icsm=FindCSMbyID(CSM_root()->idle_id);
  if(edialgui_id && (gui=FindGUIbyId(edialgui_id, NULL)))
  {
    if(gui->definition == &my_ed)
    {
      gui->definition=old_ed;
      void **m=GetDataOfItemByID(gui,4);
      if(m && m[1] && m[1]==methods)
      {
	m[1]=old_methods;
      }
    }
  }
  if(edialgui_id2 && (gui=FindGUIbyId(edialgui_id2, NULL)))
  {
    if(gui->definition == &my_ed)
    {
      gui->definition=old_ed;
      void **m=GetDataOfItemByID(gui,4);
      if(m && m[1] && m[1]==methods)
      {
	m[1]=old_methods;
      }
    }
  }
}

#endif
