int mpiFolderType = 200;
int mpiDynamicScript = 500;
int mpiDynamicSyntaxType = 501;
int mpiPreviousItemID = 200104;
int mpiDoNothing = 201100;
char gsSpace = 'Пробел';
char gsDelLastChar = 'Удалить последний символ';
char gsClearSearch = 'Очистить текст поиска';
char gsClearHystoryIn = 'Очистить историю поиска в папке "%s"';
char gsMsgClearHistory = 'История поиска в папке "%s" очищена';
char gsMsgTextSaved = 'Подкаст "%s" добавлен в "%s"';
char gsMsgNothingSaved = 'Текст поиска не набран! Добавлять нечего.';
char gsMsgSearchText = 'Текст поиска: %s';
char gsAddSearchTo = 'Добавить в папку "%s"';
char gsSuggestQuery = 'http://www.google.ru/complete/search?sclient=psy-ab&q=';
char gsSuggestResultCut= '';
char gsSuggestRegExpr = '\\["(.*?)",';
char gsSuggestMethod = 'GET';
int gnSuggestNoUTFEnc = 0;
char gsSuggestMessage = 'Вариант: ';
int gnTotalItems=0; TDateTime gTimeStart = Now; char gsTextSearch, gsMsg='';
THmsScriptMediaItem goRootItem, goCmdItem;
void CreateSearchCommands() {
int i; char sText; THmsScriptMediaItem Item;
CreateDynamicItem(FolderItem, '#', '-SearchCreateChars=From:32To:58');
CreateDynamicItem(FolderItem, 'A-Z', '-SearchCreateChars=From:65To:91');
CreateDynamicItem(FolderItem, 'А-Я', '-SearchCreateChars=From:192To:224');
CreateDynamicItem(FolderItem, gsClearSearch, '-SearchCmd=ClearSearchText');
CreateDynamicItem(FolderItem, Format(gsAddSearchTo, [goRootItem[mpiTitle]]), '-SearchCmd=SaveSearchText');
for (i=0; i<goRootItem.ChildCount; i++) {
Item = goRootItem.ChildItems[i];
if (Item.ItemClassID!=51) continue;
CreateDynamicItem(FolderItem, Format(gsAddSearchTo, [Item[mpiTitle]]), '-SaveSearchTextTo='+Item.ItemID);
}
CreateDynamicItem(FolderItem, Format(gsClearHystoryIn, [goRootItem[mpiTitle]]), '-SearchCmd=ClearSearchHistory');
for (i=0; i<goRootItem.ChildCount; i++) {
Item = goRootItem.ChildItems[i];
if (Item.ItemClassID!=51) continue;
CreateDynamicItem(FolderItem, Format(gsClearHystoryIn, [Item[mpiTitle]]), '-ClearSearchHistoryIn='+Item.ItemID);
}
sText = Format(gsMsgSearchText, [gsTextSearch]);
Item = HmsCreateMediaItem(sText, goCmdItem.ItemID);
Item[mpiTitle ] = sText;
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
}
void AddPodcastSearch(THmsScriptMediaItem prntItem) {
THmsScriptMediaItem Item;
if (Trim(gsTextSearch)=='') {gsMsg = gsMsgNothingSaved; return;}
if (LowerCase(gsTextSearch)==gsTextSearch) gsTextSearch = NameCase(gsTextSearch);
Item = prntItem.AddFolder(gsTextSearch, false);
Item[mpiFilePath ] = Format('search="%s"', [gsTextSearch]);
Item[mpiTitle ] = gsTextSearch;
HmsDatabaseAutoSave(false);
gsMsg = Format(gsMsgTextSaved, [gsTextSearch, prntItem[mpiTitle]]);
}
void CreateDynamicItem(THmsScriptMediaItem prntItem, char sTitle, char sLink) {
char s; THmsScriptMediaItem Folder;
if (Trim(sTitle)=='') sTitle = gsSpace;
Folder = prntItem.AddFolder(sLink, true);
Folder[mpiTitle ] = sTitle;
Folder[mpiCreateDate ] = VarToStr(IncTime(gTimeStart,0,-gnTotalItems,0,0)); gnTotalItems++;
Folder[mpiFolderType ] = prntItem[mpiFolderType];
Folder[mpiDynamicScript ] = prntItem[mpiDynamicScript];
Folder[mpiDynamicSyntaxType] = prntItem[mpiDynamicSyntaxType];
Folder[mpiFolderSortOrder ] = prntItem[mpiFolderSortOrder];
}
{
int i, nCnt; char sCh, sCh1, sCh2, sText; THmsScriptMediaItem Item;
char s, sUrlServer = '', sRequestPage = '/', sPostData = '', sHeaders = '';
if (LeftCopy(mpFilePath, 1) != '-') return;
goRootItem = FolderItem; goCmdItem = FolderItem;
while ((goRootItem.ItemParent != HmsDatabaseRootItem) && (goRootItem.ItemParent != nil)) {
if (goRootItem[mpiFilePath] == '-SearchCommands') {goCmdItem=goRootItem; goRootItem=goCmdItem.ItemParent; break;}
goRootItem = goRootItem.ItemParent;
}
if ((FolderItem.ItemID==goRootItem[mpiPreviousItemID]) && !DebugMode && (FolderItem!=goCmdItem)) return;
FolderItem.DeleteChildItems(); goRootItem[mpiPreviousItemID] = FolderItem.ItemID;
gsTextSearch = HmsGetUserSearchText();
if (goRootItem[mpiDoNothing]=='1') {
goRootItem[mpiDoNothing] = '';
} else if (HmsRegExMatch('-SearchCommands', mpFilePath, sCh1)) {
CreateSearchCommands(); return;
} else if (HmsRegExMatch('-SearchChar=(\\d+)', mpFilePath, sCh1)) {
gsTextSearch += Chr(StrToInt(sCh1));
} else if (HmsRegExMatch('-SetSearchText=(.*)', mpFilePath, gsTextSearch)) {
goRootItem[mpiDoNothing] = '1'; gsSuggestQuery = '';
} else if (HmsRegExMatch('-SaveSearchTextTo=(.*)', mpFilePath, sCh1)) {
Item = goRootItem;
for (i=0; i<goRootItem.ChildCount; i++) {
if (goRootItem.ChildItems[i].ItemID==sCh1) {Item = goRootItem.ChildItems[i]; break;}
}
AddPodcastSearch(Item);
} else if (HmsRegExMatch('-ClearSearchHistoryIn=(.*)', mpFilePath, sCh1)) {
Item = goRootItem;
for (i=0; i<goRootItem.ChildCount; i++) {
if (goRootItem.ChildItems[i].ItemID==sCh1) {Item = goRootItem.ChildItems[i]; break;}
}
for(i=0; i<Item.ChildCount; i++) {
if (LeftCopy(Item.ChildItems[i].Properties[mpiFilePath], 6)=='search') {Item.ChildItems[i].Delete();i--;}
}
gsMsg = Format(gsMsgClearHistory, [Item[mpiTitle]]);
} else if (HmsRegExMatch('-SearchCmd=(\\w+)', mpFilePath, sCh1)) {
if (sCh1=='DeleteLastChar' ) gsTextSearch = LeftCopy(gsTextSearch, Length(gsTextSearch)-1);
else if (sCh1=='SaveSearchText' ) AddPodcastSearch(goRootItem);
else if (sCh1=='ClearSearchText') gsTextSearch = '';
else if (sCh1=='ClearSearchHistory') {
for(i=0; i<goRootItem.ChildCount; i++) {
Item = goRootItem.ChildItems[i];
if (LeftCopy(Item[mpiFilePath], 6)=='search') {goRootItem.ChildItems[i].Delete();i--;}
}
gsMsg = Format(gsMsgClearHistory, [goRootItem[mpiTitle]]);
}
} else if (HmsRegExMatch2('-SearchCreateChars=From:(\\d+)To:(\\d+)', mpFilePath, sCh1, sCh2)) {
CreateDynamicItem(FolderItem, gsDelLastChar, '-SearchCmd=DeleteLastChar Suggestions');
CreateDynamicItem(FolderItem, ' ', '-SearchChar=32 Suggestions');
for (i= StrToInt(sCh1); i<StrToInt(sCh2); i++) CreateDynamicItem(FolderItem, Chr(i), '-SearchChar='+IntToStr(i)+' Suggestions');
}
else return;
HmsSetUserSearchText(gsTextSearch);
Item = HmsCreateMediaItem('-command=none', FolderItem.ItemID);
if (gsMsg=='') {
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
Item[mpiFilePath ] = Format(gsMsgSearchText, [gsTextSearch]);
} else {
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/ok.png';
Item[mpiFilePath ] = gsMsg;
}
Item = HmsCreateMediaItem('-command=none', FolderItem.ItemParent.ItemID);
Item[mpiFilePath] = Format(gsMsgSearchText, [gsTextSearch]);
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
Item = HmsCreateMediaItem('-command=none', goCmdItem.ItemID);
Item[mpiFilePath] = Format(gsMsgSearchText, [gsTextSearch]);
Item[mpiThumbnail] = 'http://wonky.lostcut.net/icons/search-icon1.jpg';
if ((gsSuggestQuery!='') && (Pos('Suggestions', mpFilePath)>0) && (Length(gsTextSearch)>1)) {
sText = gsTextSearch; if (gnSuggestNoUTFEnc==0) sText = HmsUtf8Encode(sText);
sText = HmsHttpEncode(sText);
if (Pos('<TEXT>', gsSuggestQuery)>0) gsSuggestQuery = ReplaceStr(gsSuggestQuery, '<TEXT>', sText);
else gsSuggestQuery = gsSuggestQuery + sText;
HmsRegExMatch2('https?://(.*?)(/.*)', gsSuggestQuery, sUrlServer, sRequestPage);
if (gsSuggestMethod=='POST') HmsRegExMatch2('^(.*?)\\?(.*)', sRequestPage, sRequestPage, sPostData);
sHeaders = 'http://'+sUrlServer+'/\r\n'+
'Accept-Encoding: gzip, deflate\r\n'+
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0\r\n'+
'Connection: Keep-Alive\r\n'+
'Accept: application/json, text/javascript, */*; q=0.01\r\n';
sText = HmsSendRequestEx(sUrlServer, sRequestPage, gsSuggestMethod, 'application/x-www-form-urlencoded; Charset=UTF-8', sHeaders, sPostData, 80, 0, '', true);
sText = HmsUtf8Decode(sText);
if (gsSuggestResultCut!='') HmsRegExMatch(gsSuggestResultCut, sText, sText)
sText = HmsJsonDecode(sText); TRegExpr t = TRegExpr.Create('(<[^>]+>)');
TRegExpr reSearch = TRegExpr.Create(gsSuggestRegExpr, PCRE_SINGLELINE);
if (reSearch.Search(sText)) do {
s = reSearch.Match;
if (t.Search(s)) do s=ReplaceStr(s, t.Match, ''); while (t.SearchAgain())
if (HmsRegExMatch('^(.*?)[/\\(\\|]', s, sCh)) {
if (Pos(LowerCase(gsTextSearch), LowerCase(sCh))>0) s = sCh;
}
if (LowerCase(s)==s) s = NameCase(s);
if (WordCount(s, ' ')>1) {
nCnt = WordCount(s, ' ');
for (i=1; i<=nCnt; i++) {
sCh=ExtractWord(i, s, ' '); if (Trim(sCh)=='') continue;
if (Pos(LowerCase(gsTextSearch), LowerCase(sCh))<1) continue;
if (LowerCase(gsTextSearch)==LowerCase(sCh)) continue;
sCh = ReplaceStr(sCh, ':', ''); sCh=ReplaceStr(sCh, '\\', '');
CreateDynamicItem(FolderItem, gsSuggestMessage+sCh, '-SetSearchText='+sCh);
}
}
if (LowerCase(s)!=LowerCase(gsTextSearch)) CreateDynamicItem(FolderItem, gsSuggestMessage+s, '-SetSearchText='+s);
if (gnTotalItems>100) break;
} while (reSearch.SearchAgain());
}
HmsIncSystemUpdateID();
}