Jump to content

uiofflineshop type and subtype ,


Recommended Posts

hello i have a proplem with combobox text in type of search like :

weapons and armors and stuuf , the text are going out of the combobox i tryed for 2 weaks i read the hole file 5 times and i cant fine the method thats can edit the setpositon , 

this is an image for the problem :

https://metin2.download/picture/Oh6586CxKPUYT29ONgFMJPZafYpm69Vw/.png

$$$$$$$$$$   -  I CAN PAY IF I HAVE TO - $$$$$$$$$$$$$$$

 and if it will make it easer to fix or something this is the ( uiofflineshop.py )

and if coure the file is working fine for english  but i need to setpositon to arabic as you can see

 

if __USE_DYNAMIC_MODULE__:
	import pyapi

import offlineshop
import ui
app = __import__(pyapi.GetModuleName("app"))
import item
player = __import__(pyapi.GetModuleName("player"))
import dbg
import uicommon
import uitooltip
import ime
import snd
import uipickmoney
import grp
import mousemodule
#import renderTarget
import wndMgr
import localeinfo

ENABLE_ITEM_WITHDRAW_QUESTION_SHOP_SAFEBOX = False

SUBTYPE_NOSET = 255
SEARCH_RESULT_LIMIT = 250
COLOR_TEXT_SHORTCUT = grp.GenerateColor(1.0,1.0,0.5,1.0)
YANG_PER_CHEQUE = 1000000000

ENABLE_CHEQUE_SYSTEM = 0
ENABLE_WOLFMAN_CHARACTER = 0
ENABLE_MOUNT_COSTUME_SYSTEM = 0
ENABLE_ACCE_COSTUME_SYSTEM = 0
ENABLE_WEAPON_COSTUME_SYSTEM = 0
ENABLE_MAGIC_REDUCTION_SYSTEM = 0

try:
	if app.ENABLE_CHEQUE_SYSTEM:
		ENABLE_CHEQUE_SYSTEM = 1
except:
	pass
try:
	if app.ENABLE_WOLFMAN_CHARACTER:
		ENABLE_WOLFMAN_CHARACTER = 1
except:
	pass
try:
	if app.ENABLE_MOUNT_COSTUME_SYSTEM:
		ENABLE_MOUNT_COSTUME_SYSTEM = 1
except:
	pass
try:
	if app.ENABLE_ACCE_COSTUME_SYSTEM:
		ENABLE_ACCE_COSTUME_SYSTEM = 1
except:
	pass
try:
	if app.ENABLE_WEAPON_COSTUME_SYSTEM:
		ENABLE_WEAPON_COSTUME_SYSTEM = 1
except:
	pass
try:
	if app.ENABLE_MAGIC_REDUCTION_SYSTEM:
		ENABLE_MAGIC_REDUCTION_SYSTEM = 1
except:
	pass
	

#globals methods used to know if are making a new shop (inventory stuff)
def IsBuildingShop():
	interface = offlineshop.GetOfflineshopBoard()
	if not interface:
		return False
	return interface.IsBuildingShop()


def IsSaleSlot(win,slot):
	interface = offlineshop.GetOfflineshopBoard()
	if not interface:
		return False
	
	return interface.IsForSaleSlot(win,slot)

#auctions
def IsForAuctionSlot(win,slot):
	interface = offlineshop.GetOfflineshopBoard()
	if not interface:
		return False

	return interface.IsForAuctionSlot(win, slot)

def IsBuildingAuction():
	interface = offlineshop.GetOfflineshopBoard()
	if not interface:
		return False

	return interface.IsBuildingAuction()


def PutsError(line):
	dbg.TraceError("offlineshop interface error : %s "%line)



def NumberToString(num):
	if num < 0:
		return "-" + NumberToString(-num)
	parts = []
	while num >= 1000:
		parts.insert(0,"%03d"%(num%1000))
		num = num//1000

	parts.insert(0,"%d"%num)
	return '.'.join(parts)

def GetDurationString(dur):
	days    = dur // (24 * 60)
	hours   = (dur//60)%24
	minutes = dur%60
	
	res = " "
	
	if days > 0:
		res += localeinfo.OFFLINESHOP_DAY_TEXT%days + " "
	
	if hours > 0:
		res += localeinfo.OFFLINESHOP_HOUR_TEXT%hours + " "
	
	if minutes > 0:
		res += localeinfo.OFFLINESHOP_MINUTE_TEXT%minutes
	
	if days == 0 and hours == 0 and minutes == 0:
		return localeinfo.OFFLINESHOP_MINUTE_TEXT%0
	
	
	return res

def MakeSlotInfo(window, slotIndex, yang, cheque=0):
	res = {}
	
	itemIndex = player.GetItemIndex(window, slotIndex)
	itemCount = player.GetItemCount(window, slotIndex)
	
	res["slot"]	 = slotIndex
	res["window"]= window
	res["vnum"]	 = itemIndex
	res["count"] = itemCount
	
	res["socket"]= {}
	res["attr"]  = {}
	
	res['locked_attr'] = player.GetItemAttrLocked(window, slotIndex)

	try:
		if ENABLE_CHANGELOOK_SYSTEM:
			res['trans'] = player.GetItemTransmutation(window, slotIndex)
	except:
		pass

	if ENABLE_CHEQUE_SYSTEM:
		res['cheque'] = cheque
	
	for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM):
		attr = player.GetItemAttribute(window, slotIndex, x)
		
		res['attr'][x] = {}
		res['attr'][x]["type"]  = attr[0]
		res['attr'][x]["value"] = attr[1]
	
	for x in xrange(player.METIN_SOCKET_MAX_NUM):
		res['socket'][x] = player.GetItemMetinSocket(window, slotIndex, x)
	
	res["price"] = yang
	return res


def MakeOfferCancelButton():
	btn = ui.Button()
	btn.SetUpVisual("offlineshop/myoffers/deleteoffer_default.png")
	btn.SetDownVisual("offlineshop/myoffers/deleteoffer_down.png")
	btn.SetOverVisual("offlineshop/myoffers/deleteoffer_over.png")
	btn.Show()
	return btn



def MakeOfferViewImage(isView):
	flag = "0"
	if isView:
		flag="1"

	img = ui.ImageBox()
	img.LoadImage("offlineshop/myoffers/viewicon_%s.png"%flag)
	img.Show()
	return img


def MakeDefaultEmptySlot(event = None):
	slot = Slot(False)
	if event:
		slot.SetOnMouseLeftButtonUpEvent(event)
	return slot



def GetBestOfferPriceYang(lst):
	if not lst:
		return 0

	max =0
	for info in lst:
		if info['price_yang'] > max:
			max = info['price_yang']

	return max



def SortByDatetime(lst):
	def CustomSortByDatetime(a,b):
		def CmpFunc(a,b):
			if a > b:
				return -1
			if b > a:
				return 1
			return 0

		keys = ('year' , 'month' , 'day', 'hour', 'minute')
		for k in keys:
			if a[k] != b[k]:
				return CmpFunc(a[k] , b[k])
		return 0

	lst.sort(cmp=CustomSortByDatetime)


def SortOffersByPrice(lst):
	def CustomSortByOfferPrice(a,b):
		price_a = a.get('price_yang', 0)
		price_b = b.get('price_yang', 0)

		if price_a > price_b:
			return -1

		if price_b < price_b:
			return 1
		return 0

	lst.sort(cmp=CustomSortByOfferPrice)
	return lst





class TableWindow(ui.Window):
	
	def __init__(self, col, row, width, height, realw, realh):
		ui.Window.__init__(self)
		self.rows 			= row
		self.columns		= col

		self.width			= width
		self.height			= height

		ui.Window.SetSize(self, realw, realh)

	
	def __del__(self):
		ui.Window.__del__(self)
	

	def __GetCoordByPos(self, col,row, child):
		stepx = self.width/self.columns
		stepy = self.height/self.rows

		x = stepx * col
		y = stepy * row

		x += stepx/2 - child.GetWidth() /2
		y += stepy/2 - child.GetHeight()/2

		return x,y

	def SetTableElement(self, column , row, child= None):
		if self.rows <= row:
			PutsError("cannot SetTableElement on row %d"%row)
			return
		
		if self.columns <= column:
			PutsError("cannot SetTableElement on column %d (row %d )"%(column,row))
			return

		if child == None:
			return
		
		x,y = self.__GetCoordByPos(column, row, child)

		child.SetParent(self)
		child.SetPosition( x, y)
		child.Show()

		
	

class TableWindowWithScrollbar(TableWindow):

	SCROLLBAR_HORIZONTAL 	= 0
	SCROLLBAR_VERTICAL		= 1

	def __init__(self, w, h , columns, rows, scrollbar=0):
		htable = h if scrollbar == self.SCROLLBAR_VERTICAL else h-18
		wtable = w if scrollbar == self.SCROLLBAR_HORIZONTAL else w -18

		TableWindow.__init__(self , columns, rows , wtable, htable, w ,h)

		self.childrenDict 	= {}
		self.scrollbar 		= None
		self.rows_count 	= rows
		self.columns_count	= columns
		self.total_row		= 0
		self.elementCount	= 0

		self.defaultCreate  	= None
		self.defaultCreateArgs 	= None
		self.defaultChildren 	= []

		self.__loadScrollbar(scrollbar)
		self.ClearElement()
	
	
	def __del__(self):
		self.childrenDict = {}
		self.scrollbar = None
		self.defaultCreate  	= None
		self.defaultCreateArgs 	= None
		self.defaultChildren 	= []
		TableWindow.__del__(self)
	
	
	
	def __loadScrollbar(self, scrollbar):

		if scrollbar == self.SCROLLBAR_VERTICAL:
			template = {
				'button1' 	: {
					'default' 	: 'offlineshop/scrollbar/vertical/button1_default.png',
					'over' 		: 'offlineshop/scrollbar/vertical/button1_over.png',
					'down' 		: 'offlineshop/scrollbar/vertical/button1_down.png',
				},
				'button2' 		: {
					'default'	: 'offlineshop/scrollbar/vertical/button2_default.png',
					'over'		: 'offlineshop/scrollbar/vertical/button2_over.png',
					'down'		: 'offlineshop/scrollbar/vertical/button2_down.png',
				},
				'middle'  		: {
					'default'	: 'offlineshop/scrollbar/vertical/middle_default.png',
					'over'		: 'offlineshop/scrollbar/vertical/middle_over.png',
					'down'		: 'offlineshop/scrollbar/vertical/middle_down.png',
				},
				'base'	  		: "offlineshop/scrollbar/vertical/base_image.png",
				'onscroll'		: self.__refreshViewList,
				'parent'		: self,
				'orientation'	: ui.CustomScrollBar.VERTICAL,
				'align'			: {'mode': ui.CustomScrollBar.RIGHT,},
			}

		else:
			template = {
				'button1' 	: {
					'default' 	: 'offlineshop/scrollbar/horizontal/button1_default.png',
					'over' 		: 'offlineshop/scrollbar/horizontal/button1_over.png',
					'down' 		: 'offlineshop/scrollbar/horizontal/button1_down.png',
				},
				'button2' 		: {
					'default'	: 'offlineshop/scrollbar/horizontal/button2_default.png',
					'over'		: 'offlineshop/scrollbar/horizontal/button2_over.png',
					'down'		: 'offlineshop/scrollbar/horizontal/button2_down.png',
				},
				'middle'  		: {
					'default'	: 'offlineshop/scrollbar/horizontal/middle_default.png',
					'over'		: 'offlineshop/scrollbar/horizontal/middle_over.png',
					'down'		: 'offlineshop/scrollbar/horizontal/middle_down.png',
				},
				'base'	  		: "offlineshop/scrollbar/horizontal/base_image.png",
				'onscroll'		: self.__refreshViewList,
				'parent'		: self,

				'orientation'	: ui.CustomScrollBar.HORIZONTAL,
				'align'			: {'mode':ui.CustomScrollBar.BOTTOM,},
			}
		
		self.scrollbar = ui.CustomScrollBar(template)
	
	
	
	def SetElement(self, column, row, child):
		if not row  in self.childrenDict:
			self.childrenDict[row] = {}
		
		self.childrenDict[row][column] = child
		self.__refreshViewList()
	

	def SetDefaultCreateChild(self, func, *args):
		self.defaultCreate = func
		self.defaultCreateArgs = args

	def __refreshViewList(self):
		if self.scrollbar.orientation == ui.CustomScrollBar.VERTICAL:
			if len(self.childrenDict.keys()) <= self.rows_count:
				self.scrollbar.Hide()
			else:
				self.scrollbar.Show()

			init_row = self.__getInitRow()

			for row, dct in self.childrenDict.items():
				for column, child in dct.items():
					if row < init_row or row >= init_row + self.rows_count:
						child.Hide()
						continue
					self.SetTableElement(column, row-init_row , child)
			
			#updated 25-01-2020 #topatch
			for s in self.defaultChildren:
				s.Destroy()
			
			self.defaultChildren = []
			if self.defaultCreate:
				for row in xrange(init_row, init_row + self.rows_count):
					for col in xrange(self.columns_count):
						if not row in self.childrenDict or not col in self.childrenDict[row]:
							defaultChild = self.defaultCreate(*self.defaultCreateArgs) if self.defaultCreateArgs else self.defaultCreate()
							defaultChild.Show()
							self.SetTableElement(col, row - init_row, defaultChild)
							self.defaultChildren.append(defaultChild)



		elif self.scrollbar.orientation == ui.CustomScrollBar.HORIZONTAL:
			if len(self.childrenDict.get(0, [])) <= self.columns_count:
				self.scrollbar.Hide()
			else:
				self.scrollbar.Show()

			init_column = self.__getInitColumn()
			end_column  = init_column+ self.columns_count
			# norm_column = xrange(0, self.columns_count)

			for dct in self.childrenDict.values():
				for elm in dct.values():
					elm.Hide()

			for col in xrange(init_column, end_column):
				for row, dct in self.childrenDict.items():
					if col in dct:
						self.SetTableElement(col-init_column, row , dct[col])
						dct[col].Show()
			
			#updated 25-01-2020 #topatch
			for s in self.defaultChildren:
				s.Destroy()
			
			self.defaultChildren = []
			if self.defaultCreate:
				for row in xrange(0, self.rows_count):
					for col in xrange(init_column, end_column):
						if not row in self.childrenDict or not col in self.childrenDict[row]:
							defaultChild = self.defaultCreate(*self.defaultCreateArgs) if self.defaultCreateArgs else self.defaultCreate()
							defaultChild.Show()
							self.SetTableElement(col-init_column, row, defaultChild)
							self.defaultChildren.append(defaultChild)




	def __getInitRow(self):
		if not self.scrollbar.IsShow():
			return 0
		
		return int((len(self.childrenDict.keys()) - self.rows_count ) * self.scrollbar.GetPos())


	def __getInitColumn(self):
		if not self.scrollbar.IsShow():
			return 0

		return int((len(self.childrenDict.get(0,[])) - self.columns_count ) * self.scrollbar.GetPos())

		
	def __AdjustScrollbarStep(self):
		total_slots		= self.rows_count*self.columns_count
		extra_element 	= self.elementCount - (total_slots)
		
		if extra_element <= 0:
			return

		if self.scrollbar.orientation == ui.CustomScrollBar.HORIZONTAL:
			extra_col = int(extra_element // self.rows_count)
			if extra_element % self.rows_count != 0:
				extra_col += 1
			self.scrollbar.SetScrollStep(1.0 / float(extra_col+1))

		else:
			extra_row_count = int(extra_element/self.columns_count)
			if extra_element % self.columns_count != 0:
				extra_row_count += 1

			self.scrollbar.SetScrollStep(1.0/float(extra_row_count+1))

	def ClearElement(self):
		for a in self.childrenDict.values():
			for child in a.values():
				child.Hide()
		
		self.childrenDict = {}
		self.elementCount = 0
		self.__refreshViewList()

	
	def AddElement(self, child):
		normElement =  self.columns_count*self.rows_count

		if self.elementCount < normElement or self.scrollbar.orientation == ui.CustomScrollBar.VERTICAL:
			column 	= self.elementCount%self.columns_count
			row		= self.elementCount//self.columns_count

		else:
			index = self.elementCount - normElement
			row   = index % self.rows_count
			column= index //self.rows_count

			column += self.columns_count

		self.SetElement(column, row, child)
		self.elementCount += 1
		
		self.__AdjustScrollbarStep()
	
	def GetElementDict(self):
		return self.childrenDict

class Slot(ui.Window):
	

	
	def __init__(self, isSold=False):
		ui.Window.__init__(self)

		self.background = None
		self.background_sold = None
		self.iconImage = None
		self.countText = None
		self.upgradeImage = None

		self.slotInfo = {}
		self.index = 0
		self.eventClick = None
		self.childrens = []

		self.__loadBackground(isSold)
		
		print("initializing Slot")
	
	#updated 25-01-2020 #topatch
	def __del__(self):
		self.__clear()
		ui.Window.__del__(self)
	
	#updated 25-01-2020 #topatch
	def __clear(self):
		self.background 		= None
		self.iconImage  		= None
		self.countText			= None
		self.upgradeImage		= None
		self.background_sold	= None
		
		ui.Window.SetOnMouseLeftButtonUpEvent(self, None)
		
		if self.background:
			self.background.SetOnMouseLeftButtonUpEvent(None)
		
		if self.iconImage:
			self.iconImage.SetOnMouseLeftButtonUpEvent(None)
		
		if self.countText:
			self.countText.SetOnMouseLeftButtonUpEvent(None)
		
		if self.upgradeImage:
			self.upgradeImage.SetOnMouseLeftButtonUpEvent(None)

		if self.background_sold:
			self.background_sold.SetOnMouseLeftButtonUpEvent(None)
	
		self.slotInfo 		= {}
		self.index			= 0
		self.eventClick		= None
		self.childrens		= []
	
	#updated 25-01-2020 #topatch
	def Destroy(self):
		self.__clear()
	
	
	def __loadBackground(self, isSold):
		bg = ui.ImageBox()
		bg.LoadImage("offlineshop/slot/base_image.png")
		bg.SetParent(self)
		bg.SetPosition(0,0)
		bg.Show()

		self.SetSize(bg.GetWidth(), bg.GetHeight())
		self.background = bg

		sold = ui.ImageBox()
		sold.LoadImage("offlineshop/slot/base_image_sold.png")
		sold.SetParent(self.background)
		sold.SetPosition(0, 0)

		if isSold:
			sold.Show()
		else:
			sold.Hide()

		self.background_sold = sold



	
	def SetInfo(self, info):
		self.slotInfo = info
		self.SetSlot(info["vnum"] , info["count"])
	
	def GetInfo(self):
		return self.slotInfo
	
	def SetSlot(self, itemvnum, itemcount):
		item.SelectItem(itemvnum)
		
		image 	= item.GetIconImageFileName()
		name	= item.GetItemName()
		
		self.__SetItemIconImage(image)
		self.__SetItemCount(itemcount)
		self.__SetUpgradeByName(name)
	
	
	def SetIndex(self, index):
		self.index = index
	
	
	def GetIndex(self):
		return self.index
	

	def SetSold(self, flag):
		if flag:
			self.background_sold.Show()
		else:
			self.background_sold.Hide()


	def __GetIconPosition(self, image):
		w = image.GetWidth()
		h = image.GetHeight()
		
		return (self.background.GetWidth()/2 - w/2,  self.background.GetHeight()/2 - h/2)
	
	def __SetItemIconImage(self, icon):
		image = ui.ImageBox()
		image.LoadImage(icon)
		image.SetParent(self.background)
		
		x,y = self.__GetIconPosition(image)
		
		image.SetPosition(x,y)
		image.Show()
		
		self.iconImage = image
	
	
	def __GetCountPosition(self):
		x,y = self.iconImage.GetLocalPosition()
		x += self.iconImage.GetWidth()/2
		y += self.iconImage.GetHeight()
		
		return (x,y)
	
	
	def __SetItemCount(self, count):
		if count <= 1:
			self.countText = None
			return
		
		countText = ui.TextLine()
		countText.SetParent(self.background)
		
		x,y = self.__GetCountPosition()
		countText.SetPosition(x,y)
		countText.SetHorizontalAlignCenter()
		countText.SetText("x"+str(count))
		countText.Show()
		
		self.countText = countText
	
	
	
	def __GetUpgradeImagePosition(self,img):
		w = img.GetWidth()
		h = img.GetHeight()
		
		bw = self.background.GetWidth()
		bh = self.background.GetHeight()
		
		return (bw - (w+5), bh-(h+5))
	
	
	def __SetUpgradeByName(self, name):
		name = name.strip()
		if len(name) > 2:
			if name[-2] == '+':
				if name[-1].isdigit():
					value = int(name[-1])
					
					upgrade = ui.ImageBox()
					upgrade.LoadImage("offlineshop/slot/upgrade/%d.png"%value)
					upgrade.SetParent(self.background)
					
					x,y = self.__GetUpgradeImagePosition(upgrade)
					upgrade.SetPosition(x,y)
					upgrade.Show()
					
					self.upgradeImage = upgrade
	
	
	def SetOnMouseLeftButtonUpEvent(self, event):
		self.eventClick = event
		ui.Window.SetOnMouseLeftButtonUpEvent(self, self.__OnClick)
		
		if self.background:
			self.background.SetOnMouseLeftButtonUpEvent(self.__OnClick)
		
		if self.iconImage:
			self.iconImage.SetOnMouseLeftButtonUpEvent(self.__OnClick)
		
		if self.countText:
			self.countText.SetOnMouseLeftButtonUpEvent(self.__OnClick)
		
		if self.upgradeImage:
			self.upgradeImage.SetOnMouseLeftButtonUpEvent(self.__OnClick)

		if self.background_sold:
			self.background_sold.SetOnMouseLeftButtonUpEvent(self.__OnClick)


	def __OnClick(self):
		if self.eventClick!=None:
			self.eventClick(self)

	def IsInSlot(self):
		if not self.IsShow():
			return False
		
		if self.IsIn():
			return True
		
		if self.background:
			if self.background.IsIn():
				return True
		
		if self.iconImage:
			if self.iconImage.IsIn():
				return True
		
		if self.countText:
			if self.countText.IsIn():
				return True
		
		if self.upgradeImage:
			if self.upgradeImage.IsIn():
				return True

		if self.background_sold:
			if self.background_sold.IsShow() and self.background_sold.IsIn():
				return True

		if self.childrens:
			for child in self.childrens:
				if child.IsIn():
					return True


		return False


	def AppendChild(self, child):
		child.SetParent(self.background)
		self.childrens.append(child)




class Offer(ui.Window):
	


	def __init__(self, info):
		ui.Window.__init__(self)

		self.bgImage = None
		self.guestName = None
		self.priceText = None
		self.acceptButton = None
		self.deleteButton = None
		self.itemText = None
		self.info = {}
		self.index = 0
		self.is_accept = 0
		self.acceptEvent = None
		self.deniedEvent = None



		self.info  		= info
		self.index 		= info["id"]
		self.is_accept	= info["is_accept"]

		self.__loadBackground()
		self.__loadButtons()
		self.SetGuestName(info['buyer_name'])
		self.SetPriceYang(info["price"])


	def __del__(self):

		self.bgImage = None
		self.guestName = None
		self.priceText = None
		self.acceptButton = None
		self.deleteButton = None
		self.itemText = None
		self.info = {}
		self.index = 0
		self.is_accept = 0
		self.acceptEvent = None
		self.deniedEvent = None

		ui.Window.__del__(self)
	
	def __loadBackground(self):
		bg = ui.ImageBox()
		bg.SetParent(self)
		bg.SetPosition(0,0)
		bg.LoadImage("offlineshop/offer/base_image.png")
		bg.Show()

		self.SetSize(bg.GetWidth(), bg.GetHeight())
		self.bgImage = bg
	
	
	def SetGuestName(self, name):
		text = ui.TextLine()
		text.SetParent(self.bgImage)
		text.SetPosition(77 , 0)
		text.SetHorizontalAlignCenter()
		text.Show()
		text.SetText(name)
		self.guestName = text
	
	
	def SetPriceYang(self, yang):
		text = ui.TextLine()
		text.SetParent(self.bgImage)
		text.SetPosition(355 , 0)
		# text.SetHorizontalAlignCenter()
		text.Show()
		text.SetText(localeinfo.NumberToMoneyString(yang))
		self.priceText = text
	
	
	
	def SetItemName(self, name):
		text = ui.TextLine()
		text.SetParent(self.bgImage)
		text.SetPosition(239 , 0)
		text.SetHorizontalAlignCenter()
		text.Show()
		text.SetText(name)
		self.itemText = text
	
	def __loadButtons(self):
		if self.info["is_accept"]:
			return
		#accept
		button = ui.Button()
		button.SetParent(self.bgImage)
		button.SetPosition(self.bgImage.GetWidth() - 50, 0)
		
		path = "offlineshop/offer/accept_%s.png"
		button.SetUpVisual(path%"default")
		button.SetOverVisual(path%"over")
		button.SetDownVisual(path%"down")
		button.Show()
		
		self.acceptButton = button

		#denied
		button = ui.Button()
		button.SetParent(self.bgImage)
		button.SetPosition(self.bgImage.GetWidth() - 30, 0)
		
		path = "offlineshop/offer/cancel_%s.png"
		button.SetUpVisual(path%"default")
		button.SetOverVisual(path%"over")
		button.SetDownVisual(path%"down")
		button.Show()

		self.deleteButton = button
	
	
	def SetAcceptButtonEvent(self, event):
		if self.acceptButton:
			self.acceptButton.SAFE_SetEvent(self.__OnAccept)
		self.acceptEvent = event
		
	def SetDeleteButtonEvent(self, event):
		if self.deleteButton:
			self.deleteButton.SAFE_SetEvent(self.__OnCancel)
		self.deniedEvent = event

	def GetInfo(self):
		return self.info


	def __OnAccept(self):
		if self.acceptEvent:
			self.acceptEvent(self)

	def __OnCancel(self):
		if self.deniedEvent:
			self.deniedEvent(self)


class AuctionOffer(ui.Window):

	def __init__(self, info):
		ui.Window.__init__(self)

		self.background = None
		self.ownerName = None
		self.offerText = None

		self.__LoadWindow(info)

	def __del__(self):
		self.background = None
		self.ownerName = None
		self.offerText = None
		ui.Window.__del__(self)

	def __LoadWindow(self, info):
		name = info["buyer_name"]
		best_yang = info['price_yang']

		self.__LoadBackground()
		self.__LoadOwnerName(name)
		self.__LoadOfferText(best_yang)

	def GetInfo(self):
		return self.info



	def __LoadBackground(self):
		bg = ui.ImageBox()
		bg.LoadImage("offlineshop/shoplist/shoplist_element_default.png")
		bg.SetParent(self)
		bg.SetPosition(0, 0)
		bg.Show()

		self.SetSize(bg.GetWidth(), bg.GetHeight())
		self.background = bg

	def __LoadOwnerName(self, ownerName):
		if not ownerName:
			return

		text = ui.TextLine()
		text.SetParent(self.background)
		text.SetPosition(186, 1)
		text.SetHorizontalAlignCenter()
		text.SetText(ownerName)
		text.Show()

		self.ownerName = text

	def __LoadOfferText(self, yang):
		text = ui.TextLine()
		text.SetParent(self.background)
		text.SetPosition(403, 1)
		text.SetHorizontalAlignCenter()
		text.SetText(localeinfo.NumberToMoneyString(yang))
		text.Show()

		self.offerText = text



class MyOffer(ui.Window):

	def __init__(self, info):
		ui.Window.__init__(self)
		self.info = info
		self.clear()

		self.__LoadBackground()
		self.__LoadOwnerName()
		self.__LoadOfferText()
		self.__LoadSlot()
		self.__LoadCancelButton()


	def clear(self):
		self.background   		= None
		self.ownerName    		= None
		self.offerText    		= None
		self.slot		  		= None
		self.cancelButton 		= None
		self.cancelButtonEvent	= None
		self.bar1 = None
		self.bar2 = None
		self.text1 = None
		self.text2 = None

	def __del__(self):
		self.clear()
		ui.Window.__del__(self)

	def __LoadBackground(self):
		bg = ui.ImageBox()
		bg.SetParent(self)
		bg.SetPosition(0,0)
		bg.LoadImage("offlineshop/myoffers/offer_base_image.png")
		bg.Show()

		self.SetSize(bg.GetWidth(), bg.GetHeight())
		self.background = bg
		
		bar1 = ui.Bar()
		bar1.SetSize(59, 12)
		bar1.SetColor(0x00000000)
		bar1.SetParent(self.background)
		bar1.Show()
		self.bar1 = bar1
		self.bar1.SetPosition(59, 39)
		
		text1 = ui.TextLine()
		text1.SetParent(self.bar1)
		text1.SetPosition(0, 0)
		text1.SetText(localeinfo.SUBTEXT_OFFLINESHOP_TEXT15)
		text1.Show()
		self.text1 = text1
		
		bar2 = ui.Bar()
		bar2.SetSize(59, 12)
		bar2.SetColor(0x00000000)
		bar2.SetParent(self.background)
		bar2.Show()
		self.bar2 = bar2
		self.bar2.SetPosition(59, 63)
		
		text2 = ui.TextLine()
		text2.SetParent(self.bar2)
		text2.SetPosition(0, 0)
		text2.SetText(localeinfo.SUBTEXT_OFFLINESHOP_TEXT16)
		text2.Show()
		self.text2 = text2

	def __LoadOwnerName(self):
		text = ui.TextLine()
		text.SetParent(self.background)
		text.SetPosition(175, 38)
		text.SetHorizontalAlignCenter()
		text.SetText(self.info.get('shop_name', ""))
		text.Show()

		self.ownerName = text


	def __LoadOfferText(self):
		text = ui.TextLine()
		text.SetParent(self.background)
		text.SetPosition(175, 60)
		text.SetHorizontalAlignCenter()
		text.SetText(NumberToString(self.info.get('price', "")))
		text.Show()

		self.offerText = text

	def __LoadSlot(self):
		slot = Slot(self.info['is_accept'])
		slot.SetInfo(self.info['item'])
		slot.SetParent(self.background)
		slot.SetPosition(9,4)
		slot.Show()

		self.slot = slot


	def __LoadCancelButton(self):
		button = ui.Button()
		button.SetParent(self.background)
		button.SetPosition(self.GetWidth()/2, 46 + 40)

		button.SetUpVisual("d:/ymir work/ui/public/small_button_01.sub")
		button.SetDownVisual("d:/ymir work/ui/public/small_button_03.sub")
		button.SetOverVisual("d:/ymir work/ui/public/small_button_02.sub")

		button.SetText(localeinfo.OFFLINESHOP_MYOFFERS_CANCEL_BUTTON_TEXT)

		button.Show()
		button.SAFE_SetEvent(self.__OnClickCancelButton)
		self.cancelButton = button


	def SetCancelButtonEvent(self, event):
		self.cancelButtonEvent = event



	def __OnClickCancelButton(self):
		if self.cancelButtonEvent:
			self.cancelButtonEvent(self.info['offer_id'])


	def IsInSlot(self):
		return self.slot.IsInSlot()


	def GetIndex(self):
		return self.info['offer_id']
	
	#updated 25-01-2020 #topatch
	def DisableCancelButton(self):
		if self.cancelButton:
			self.cancelButton.Hide()
	


class AuctionListElement(ui.Window):

	def __init__(self, info):
		ui.Window.__init__(self)

		self.ownerName = None
		self.durationText = None
		self.offerCountText = None
		self.owner_id = -1
		self.info = info
		self.button = None
		self.buttonEvent = None
		self.bestYangText = None

		self.__LoadWindow(info)


	def __del__(self):
		self.ownerName = None
		self.durationText = None
		self.offerCountText = None
		self.owner_id = -1
		self.info = {}
		self.button = None
		self.buttonEvent = None
		self.bestYangText = None
		ui.Window.__del__(self)

	def __LoadWindow(self, info):
		owner_id 	= info["owner_id"]
		duration 	= info["duration"]
		count 		= info["offer_count"]
		name 		= info["owner_name"]
		best_yang	= info['best_yang']

		self.owner_id = owner_id


		self.__LoadOpenAuctionButton()
		self.__LoadOwnerName(name)
		self.__LoadDuration(duration)
		self.__LoadCount(count)
		self.__LoadBestYang(best_yang)

	def SetIndex(self,index):
		self.owner_id = index

	def GetIndex(self):
		return self.owner_id

	def GetInfo(self):
		return self.info

	def SetOnClickOpenShopButton(self, event):
		self.openShopButton.SAFE_SetEvent(self.__OnClickOpenShop)
		self.openShopButtonEvent = event

	def __LoadOwnerName(self, ownerName):
		if not ownerName:
			return

		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(85, 0)
		text.SetHorizontalAlignCenter()
		text.SetText(ownerName)
		text.Show()

		self.ownerName = text



	def __LoadDuration(self, duration):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(344, 0)
		text.SetHorizontalAlignCenter()
		text.SetText(GetDurationString(duration))
		text.Show()

		self.durationText = text

	def __LoadCount(self, count):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(480, 0)
		text.SetHorizontalAlignCenter()
		text.SetText(str(count))
		text.Show()

		self.offerCountText = text

	def __LoadBestYang(self, yang):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(217, 0)
		text.SetHorizontalAlignCenter()
		text.SetText(localeinfo.NumberToMoneyString(yang))
		text.Show()

		self.bestYangText = text

	def SetOnClickOpenAuctionButton(self, event):
		self.button.SAFE_SetEvent(self.__OnClickMe)
		self.buttonEvent = event


	def __OnClickMe(self):
		if self.buttonEvent:
			self.buttonEvent(self.owner_id)

	def __LoadOpenAuctionButton(self):
		button = ui.Button()
		button.SetParent(self)
		button.SetUpVisual("offlineshop/shoplist/shoplist_element_default.png")
		button.SetDownVisual("offlineshop/shoplist/shoplist_element_down.png")
		button.SetOverVisual("offlineshop/shoplist/shoplist_element_over.png")

		button.SetPosition(0, 0)
		button.Show()
		self.SetSize(button.GetWidth(), button.GetHeight())
		self.button = button


	def IsInSlot(self):
		if self.IsIn():
			return True

		if self.ownerName:
			if self.ownerName.IsIn():
				return True

		if self.durationText:
			if self.durationText.IsIn():
				return True

		if self.offerCountText:
			if self.offerCountText.IsIn():
				return True

		if self.button:
			if self.button.IsIn():
				return True

		return False













class ShopListElement(ui.Window):
	

	
	def __init__(self , info):
		ui.Window.__init__(self)

		self.ownerName = None
		self.shopName = None
		self.durationText = None
		self.countText = None
		self.openShopButton = None
		self.openShopButtonEvent = None
		self.owner_id = -1

		self.__LoadWindow(info)

	def __del__(self):
		self.ownerName = None
		self.shopName = None
		self.durationText = None
		self.countText = None
		self.openShopButton = None
		self.openShopButtonEvent = None

		self.owner_id = -1
		ui.Window.__del__(self)

	def __LoadWindow(self, info):
		owner_id	= info["owner_id"]
		duration	= info["duration"]
		count		= info["count"]
		name		= info["name"]
		
		ownerName	= name[:name.find('@')] if '@' in name else "NONAME"
		name		= name[name.find('@')+1:] if '@' in name else name
		
		self.owner_id  = owner_id
		
		self.__LoadOpenShopButton()
		self.__LoadOwnerName(ownerName)
		self.__LoadShopName(name)
		self.__LoadDuration(duration)
		self.__LoadCount(count)

	
	
	
	def SetOnClickOpenShopButton(self, event):
		self.openShopButton.SAFE_SetEvent(self.__OnClickOpenShop)
		self.openShopButtonEvent = event
	
	
	def __OnClickOpenShop(self):
		if self.openShopButtonEvent:
			self.openShopButtonEvent(self.owner_id)

	def __LoadOpenShopButton(self):
		button = ui.Button()
		button.SetParent(self)
		button.SetUpVisual("offlineshop/shoplist/shoplist_element_default.png")
		button.SetDownVisual("offlineshop/shoplist/shoplist_element_down.png")
		button.SetOverVisual("offlineshop/shoplist/shoplist_element_over.png")

		button.SetPosition(0, 0)
		button.Show()

		self.SetSize(button.GetWidth(), button.GetHeight())
		self.openShopButton = button



	def __LoadOwnerName(self ,ownerName):
		if not ownerName:
			return
		
		text = ui.TextLine()
		text.SetParent(self.openShopButton)
		text.SetPosition(48 , 2)
		text.SetHorizontalAlignCenter()
		text.SetText(ownerName)
		text.Show()
		
		self.ownerName = text
	
	
	def __LoadShopName(self ,name):
		text = ui.TextLine()
		text.SetParent(self.openShopButton)
		text.SetPosition(198 , 2)
		text.SetHorizontalAlignCenter()
		text.SetText(name)
		text.Show()
		
		self.shopName = text
	
	
	def __LoadDuration(self ,duration):
		text = ui.TextLine()
		text.SetParent(self.openShopButton)
		text.SetPosition(358 , 2)
		text.SetHorizontalAlignCenter()
		text.SetText(GetDurationString(duration))
		text.Show()
		
		self.durationText = text
	
	def __LoadCount(self ,count):
		text = ui.TextLine()
		text.SetParent(self.openShopButton)
		text.SetPosition(480 , 2)
		text.SetHorizontalAlignCenter()
		text.SetText(str(count))
		text.Show()
		
		self.countText = text
	





class Suggestions():
	
	def __init__(self):
		self.inputBox = None
		self.comboBox = None

		self.mainDict = {}
		self.tempDict = {}
		self.isRefreshing = False
		self.isSelecting = False
	
	def SetInputBox(self, box):
		box.OnIMEUpdate = self.__OnUpdateInputBox
		self.inputBox = box
	
	def SetComboBox(self, box):
		box.SetEvent(ui.__mem_func__(self.__OnSelectItem))
		box.ClearItem()
		box.SetCurrentItem(localeinfo.OFFLINESHOP_NAME_SUGGESTION_UNSELECT)
		
		self.comboBox = box
	
	def SetMainDict(self, inDict):
		def getUnrefined(st):
			pos = st.find('+')
			if pos == -1:
				return st
			
			if pos > len(st) -4 and pos > 4:
				return st[:pos]
			return st
		
		cleanDict = {}
		inserted  = []
		
		for name , vnum in inDict.items():
			unrefined = getUnrefined(name).lower().strip()
			if unrefined in inserted:
				continue
			
			cleanDict[unrefined] = vnum
			inserted.append(unrefined)
		
		self.mainDict = cleanDict
	
	
	def __OnUpdateInputBox(self):
		snd.PlaySound("sound/ui/type.wav")
		ui.TextLine.SetText(self.inputBox, ime.GetText(self.inputBox.bCodePage))
		
		self.__RefreshComboBox()
	
	def __RefreshComboBox(self):
		if self.isSelecting:
			return
		
		self.isRefreshing = True
		
		self.tempDict 	= {}
		inputText		= self.inputBox.GetText().lower().strip()
		
		if len(inputText) < 3:
			return
		
		self.comboBox.ClearItem()
		self.comboBox.SetCurrentItem(localeinfo.OFFLINESHOP_NAME_SUGGESTION_UNSELECT)
		
		
		idx = 0
		for k,v in self.mainDict.items():
			if inputText in k.lower():
				self.tempDict[idx] = k
				self.comboBox.InsertItem(idx, k)
				
				idx += 1
				
				if idx == 20:
					break
		
		self.isRefreshing = False
	
	def __OnSelectItem(self, index):
		if self.isRefreshing:
			return
		
		self.isSelecting = True
		self.inputBox.SetText(self.tempDict[index])
		self.isSelecting = False
	
	def __del__(self):
		self.inputBox		= None
		self.comboBox	= None
		
		self.mainDict	= {}
		self.tempDict	= {}
	
	def Clear(self):
		self.comboBox.ClearItem()
		self.comboBox.SetCurrentItem(localeinfo.OFFLINESHOP_NAME_SUGGESTION_UNSELECT)

class SuggestionElement(ui.Button):
	

	
	def __init__(self):
		self.clickEvent = None
		self.index = 0

		ui.Button.__init__(self)
	
	
	def __del__(self):
		self.clickEvent = None
		ui.Button.__del__(self)
	
	def SetClickEvent(self, event):
		self.clickEvent = event
		self.SAFE_SetEvent(self.__OnClickMe)
	
	def __OnClickMe(self):
		if self.clickEvent:
			self.clickEvent(self.index)
	
	
	def SetElement(self, index, text):
		self.index = index
		self.SetText(text)
	
	



class SuggestionSelector(ui.Window):
		
	
	def __init__(self, element = 8, template = 'big'):
		ui.Window.__init__(self)

		self.scrollbar = None
		self.background = None
		self.valuesDict = {}
		self.onSelectEvent = None

		self.elements = []
		self.template = template
		self.__loadBackground()
		self.__loadElements(element)
		self.__loadScrollbar()
	
	
	def __loadBackground(self):
		bg = ui.ImageBox()
		if self.template == 'big':
			bg.LoadImage("offlineshop/searchfilter/attribute_selector_base_image.png")
		else:
			bg.LoadImage("offlineshop/searchfilter/grade_selector_base_image.png")
		bg.SetParent(self)
		bg.SetPosition(0,0)
		
		bg.Show()
		self.background = bg
		self.SetSize(bg.GetWidth() , bg.GetHeight())
	
	
	def __loadElements(self, count):
		for x in xrange(count):
			element = SuggestionElement()
			element.SetParent(self.background)
			element.SetPosition(0, x * 16)
			
			if self.template == 'big':
				element.SetUpVisual("offlineshop/searchfilter/attribute_default.png")
				element.SetDownVisual("offlineshop/searchfilter/attribute_down.png")
				element.SetOverVisual("offlineshop/searchfilter/attribute_over.png")
			
			else:
				element.SetUpVisual("offlineshop/searchfilter/grade_element_default.png")
				element.SetDownVisual("offlineshop/searchfilter/grade_element_down.png")
				element.SetOverVisual("offlineshop/searchfilter/grade_element_over.png")
			
			
			element.Show()
			
			element.SetClickEvent(self.__OnSelectElement)
			self.elements.append(element)
	
	
	def __loadScrollbar(self):
		scroll = ui.ScrollBar()
		scroll.SetParent(self.background)
		scroll.SetPosition(self.GetWidth()-10, 0)
		scroll.SetScrollBarSize(self.GetHeight())
		scroll.SetScrollEvent(self.__OnScroll)
		scroll.Show()
		
		self.scrollbar = scroll
	
	def __OnSelectElement(self, index):
		if self.onSelectEvent:
			self.onSelectEvent(index)
	
	
	
	def __OnScroll(self):
		self.__refreshViewList()
	
	
	def __refreshViewList(self):
		if len(self.elements) >= len(self.valuesDict):
			self.scrollbar.Hide()
		else:
			self.scrollbar.Show()
		
		pos 		= self.scrollbar.GetPos()
		initIndex	= int(pos * (len(self.valuesDict) - len(self.elements) ))
		
		if len(self.elements) >= len(self.valuesDict):
			initIndex = 0
		
		sorted_key = self.valuesDict.keys()
		sorted_key.sort()
		
		for x in xrange(initIndex , initIndex + len(self.elements)):
			index 	= sorted_key[x]
			text	= self.valuesDict[index]
			
			self.elements[x-initIndex].SetElement(index, text)
	
	
	
	
	def SetValueDict(self, dct):
		self.valuesDict = dct
		self.__refreshViewList()
	
	
	def SetSelectEvent(self, event):
		self.onSelectEvent = event	
	
	
	def __del__(self):
		self.background 	= None
		self.elements		= []
		self.scrollbar		= None
		self.onSelectEvent	= None
		
		ui.Window.__del__(self)
	

class FilterHistoryElement(ui.Window):
	

	
	def __init__(self, info):
		ui.Window.__init__(self)

		self.button = None
		self.datetext = None
		self.timetext = None
		self.counttext = None
		self.buttonEvent = None
		self.info = {}



		self.__loadButton()
		self.__loadDateText(info)
		self.__loadTimeText(info)
		self.__loadCountText(info)
	
		self.info = info
	
	
	def GetInfo(self):
		return self.info
	

	def SetButtonEvent(self , event):
		self.buttonEvent = event
		self.button.SAFE_SetEvent(self.__OnClickMe)


	def __OnClickMe(self):
		if self.buttonEvent:
			self.buttonEvent(self)

	def __loadButton(self):
		button = ui.Button()
		button.SetParent(self)
		button.SetPosition(0,0)
		
		path = "offlineshop/searchhistory/element_%s.png"
		
		button.SetUpVisual(path%"default")
		button.SetDownVisual(path%"down")
		button.SetOverVisual(path%"over")
		button.Show()

		self.SetSize(button.GetWidth(), button.GetHeight())
		self.button = button
	
	def __loadDateText(self,info):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(60, 3)
		
		day		= info["day"]
		month	= info["month"]
		year	= info["year"]
		
		text.SetText("%02d - %02d - %d "%(day, month, year))
		text.Show()

		self.datetext = text


	def __loadTimeText(self, info):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(190+75, 3)


		hour 	= info["hour"]
		minute 	= info["minute"]

		text.SetText("%02d : %02d " % (hour, minute))
		text.Show()

		self.timetext = text
	
	def __loadCountText(self, info):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(485, 3)

		count = info["count"]

		text.SetText(" %d " % (count))
		text.SetHorizontalAlignCenter()
		text.Show()

		self.counttext = text
	
	
	
	
	def __del__(self):
		self.button 	= None
		self.datetext	= None
		self.timetext	= None
		self.counttext	= None
		self.buttonEvent= None
		ui.Window.__del__(self)
	
	def IsInSlot(self):
		if not self.IsShow():
			return False

		if self.IsIn():
			return True
		
		if self.button:
			if self.button.IsIn():
				return True
		
		if self.datetext:
			if self.datetext.IsIn():
				return True
		
		if self.timetext:
			if self.timetext.IsIn():
				return True
		
		if self.counttext:
			if self.counttext.IsIn():
				return True
		
		return False

	def GetIndex(self):
		return self.info['id']


class FilterPatternElement(ui.Window):



	def __init__(self, info):
		ui.Window.__init__(self)

		self.button = None
		self.datetext = None
		self.nametext = None
		self.buttonEvent = None
		self.info = {}

		self.__loadButton()
		self.__loadDateText(info)
		self.__loadNameText(info)

		self.info = info


	def GetInfo(self):
		return self.info


	def SetButtonEvent(self , event):
		self.buttonEvent = event
		self.button.SAFE_SetEvent(self.__OnClickMe)


	def __OnClickMe(self):
		if self.buttonEvent:
			self.buttonEvent(self)

	def __loadButton(self):
		button = ui.Button()
		button.SetParent(self)
		button.SetPosition(0,0)

		path = "offlineshop/searchhistory/element_%s.png"

		button.SetUpVisual(path%"default")
		button.SetDownVisual(path%"down")
		button.SetOverVisual(path%"over")
		button.Show()

		self.SetSize(button.GetWidth(), button.GetHeight())
		self.button = button

	def __loadDateText(self,info):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(352, 3)

		day		= info["day"]
		month	= info["month"]
		year	= info["year"]
		hour	= info["hour"]
		minute	= info["minute"]

		text.SetText("%02d - %02d - %d  %02d : %02d"%(day, month, year, hour, minute))
		text.Show()

		self.datetext = text


	def __loadNameText(self, info):
		text = ui.TextLine()
		text.SetParent(self.button)
		text.SetPosition(20, 3)

		text.SetText(info["name"])
		text.Show()

		self.nametext = text




	def __del__(self):
		self.button = None
		self.datetext = None
		self.nametext = None
		self.buttonEvent = None
		ui.Window.__del__(self)

	def IsInSlot(self):
		if not self.IsShow():
			return False

		if self.IsIn():
			return True

		if self.button:
			if self.button.IsIn():
				return True

		if self.datetext:
			if self.datetext.IsIn():
				return True

		if self.nametext:
			if self.nametext.IsIn():
				return True
		return False


	def GetIndex(self):
		return self.info['id']


class NewOfflineShopBoard(ui.ScriptWindow):
	
	
	#constants
	BOARD_KEYS = ("create_shop" , "my_shop", "open_shop", "shop_list", "search_history", )
	
	ITEM_TYPES = {
		item.ITEM_TYPE_NONE		: {
			"name" 		: localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET,
		},
		
		item.ITEM_TYPE_WEAPON		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_WEAPON,
			"subtypes"	: {
				item.WEAPON_SWORD			:	localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_SWORD,
				item.WEAPON_DAGGER			:	localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_DAGGER,
				item.WEAPON_BOW				:	localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_BOW,
				item.WEAPON_TWO_HANDED		:	localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_TWO_HANDED,
				item.WEAPON_BELL			:	localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_BELL,
				item.WEAPON_FAN				:	localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_FAN,
			},
		},
		
		item.ITEM_TYPE_ARMOR		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_ARMOR,
			"subtypes"	: {
				item.ARMOR_BODY			:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_BODY,
				item.ARMOR_HEAD			:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_HEAD,
				item.ARMOR_SHIELD		:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_SHIELD,
				item.ARMOR_WRIST		:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_WRIST,
				item.ARMOR_FOOTS		:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_FOOTS,
				item.ARMOR_NECK			:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_NECK,
				item.ARMOR_EAR			:	localeinfo.OFFLINESHOP_COMBOBOX_ARMOR_EAR,
			},
		},
		
		item.ITEM_TYPE_METIN		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_METIN,
		},
		
		item.ITEM_TYPE_FISH		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_FISH,
		},
		
		item.ITEM_TYPE_SKILLBOOK		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_SKILLBOOK,
		},
		
		item.ITEM_TYPE_BLEND		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_BLEND,
		},
		
		item.ITEM_TYPE_DS		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_DS,
		},
		
		item.ITEM_TYPE_RING		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_RING,
		},
		
		item.ITEM_TYPE_BELT		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_BELT,
		},


		item.ITEM_TYPE_METIN		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_METIN,
		},

		item.ITEM_TYPE_GIFTBOX		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_GIFTBOX,
		},

		item.ITEM_TYPE_COSTUME		: {
			"name" : localeinfo.OFFLINESHOP_TYPE_COMBOBOX_COSTUME,
			"subtypes"	: {
				item.COSTUME_TYPE_BODY			:	localeinfo.OFFLINESHOP_COMBOBOX_COSTUME_BODY,
				item.COSTUME_TYPE_HAIR			:	localeinfo.OFFLINESHOP_COMBOBOX_COSTUME_HAIR,
			},
		},


		item.ITEM_TYPE_MATERIAL		:{
			"name": localeinfo.OFFLINESHOP_TYPE_COMBOBOX_REFINE,
		},
	}
	
	if ENABLE_WOLFMAN_CHARACTER:
		ITEM_TYPES[item.ITEM_TYPE_WEAPON]["subtypes"][item.WEAPON_CLAW] 	= localeinfo.OFFLINESHOP_COMBOBOX_WEAPON_CLAW
	
	if ENABLE_MOUNT_COSTUME_SYSTEM:
		ITEM_TYPES[item.ITEM_TYPE_COSTUME][item.COSTUME_TYPE_MOUNT] 	=	localeinfo.OFFLINESHOP_COMBOBOX_COSTUME_MOUNT
	
	if ENABLE_ACCE_COSTUME_SYSTEM:
		ITEM_TYPES[item.ITEM_TYPE_COSTUME][item.COSTUME_TYPE_ACCE] 		=	localeinfo.OFFLINESHOP_COMBOBOX_COSTUME_ACCE
	
	if ENABLE_WEAPON_COSTUME_SYSTEM:
		ITEM_TYPES[item.ITEM_TYPE_COSTUME][item.COSTUME_TYPE_WEAPON] 	=	localeinfo.OFFLINESHOP_COMBOBOX_COSTUME_WEAPON
	
	
	RARITY_GRADES = {
		-1 : localeinfo.OFFLINESHOP_RARITY_ITEM_UNSET,
		item.RARITY_COMMON : localeinfo.RARITY_ITEM_COMMON,
		item.RARITY_EPIC : localeinfo.RARITY_ITEM_EPIC,
		item.RARITY_LEGENDARY : localeinfo.RARITY_ITEM_LEGENDARY,
		item.RARITY_ANTIQUE : localeinfo.RARITY_ITEM_ANTIQUE,
		item.RARITY_MISTIC : localeinfo.RARITY_ITEM_MISTIC,
	}
	
	
	#members
	
	ATTRIBUTES = {
		0	: localeinfo.OFFLINESHOP_ATTR_UNSET,
		
		item.APPLY_MAX_HP 				: localeinfo.OFFLINESHOP_ATTR_MAX_HP,
		item.APPLY_MAX_SP 				: localeinfo.OFFLINESHOP_ATTR_MAX_SP,
		item.APPLY_CON 					: localeinfo.OFFLINESHOP_ATTR_CON,
		item.APPLY_INT 					: localeinfo.OFFLINESHOP_ATTR_INT,
		item.APPLY_STR 					: localeinfo.OFFLINESHOP_ATTR_STR,
		item.APPLY_DEX 					: localeinfo.OFFLINESHOP_ATTR_DEX,
		item.APPLY_ATT_SPEED 			: localeinfo.OFFLINESHOP_ATTR_ATT_SPEED,
		item.APPLY_MOV_SPEED 			: localeinfo.OFFLINESHOP_ATTR_MOV_SPEED,
		item.APPLY_CAST_SPEED 			: localeinfo.OFFLINESHOP_ATTR_CAST_SPEED,
		item.APPLY_HP_REGEN 			: localeinfo.OFFLINESHOP_ATTR_HP_REGEN,
		item.APPLY_SP_REGEN 			: localeinfo.OFFLINESHOP_ATTR_SP_REGEN,
		item.APPLY_POISON_PCT 			: localeinfo.OFFLINESHOP_ATTR_APPLY_POISON_PCT,
		item.APPLY_STUN_PCT 			: localeinfo.OFFLINESHOP_ATTR_APPLY_STUN_PCT,
		item.APPLY_SLOW_PCT 			: localeinfo.OFFLINESHOP_ATTR_APPLY_SLOW_PCT,
		item.APPLY_CRITICAL_PCT 		: localeinfo.OFFLINESHOP_ATTR_APPLY_CRITICAL_PCT,
		item.APPLY_PENETRATE_PCT 		: localeinfo.OFFLINESHOP_ATTR_APPLY_PENETRATE_PCT,

		item.APPLY_ATTBONUS_WARRIOR 	: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_WARRIOR,
		item.APPLY_ATTBONUS_ASSASSIN 	: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_ASSASSIN,
		item.APPLY_ATTBONUS_SURA 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_SURA,
		item.APPLY_ATTBONUS_SHAMAN 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_SHAMAN,
		item.APPLY_ATTBONUS_MONSTER 	: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_MONSTER,

		item.APPLY_ATTBONUS_HUMAN 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_HUMAN,
		item.APPLY_ATTBONUS_ANIMAL 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_ANIMAL,
		item.APPLY_ATTBONUS_ORC 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_ORC,
		item.APPLY_ATTBONUS_MILGYO 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_MILGYO,
		item.APPLY_ATTBONUS_UNDEAD 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_UNDEAD,
		item.APPLY_ATTBONUS_DEVIL 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_DEVIL,
		item.APPLY_STEAL_HP 			: localeinfo.OFFLINESHOP_ATTR_APPLY_STEAL_HP,
		item.APPLY_STEAL_SP 			: localeinfo.OFFLINESHOP_ATTR_APPLY_STEAL_SP,
		item.APPLY_MANA_BURN_PCT 		: localeinfo.OFFLINESHOP_ATTR_APPLY_MANA_BURN_PCT,
		item.APPLY_DAMAGE_SP_RECOVER 	: localeinfo.OFFLINESHOP_ATTR_APPLY_DAMAGE_SP_RECOVER,
		item.APPLY_BLOCK 				: localeinfo.OFFLINESHOP_ATTR_APPLY_BLOCK,
		item.APPLY_DODGE 				: localeinfo.OFFLINESHOP_ATTR_APPLY_DODGE,
		item.APPLY_RESIST_SWORD 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_SWORD,
		item.APPLY_RESIST_TWOHAND 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_TWOHAND,
		item.APPLY_RESIST_DAGGER 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_DAGGER,
		item.APPLY_RESIST_BELL 			: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_BELL,
		item.APPLY_RESIST_FAN 			: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_FAN,
		item.APPLY_RESIST_BOW 			: localeinfo.OFFLINESHOP_ATTR_RESIST_BOW,
		# item.APPLY_RESIST_FIRE 		: localeinfo.OFFLINESHOP_ATTR_RESIST_FIRE,
		# item.APPLY_RESIST_ELEC 		: localeinfo.OFFLINESHOP_ATTR_RESIST_ELEC,
		item.APPLY_RESIST_MAGIC 		: localeinfo.OFFLINESHOP_ATTR_RESIST_MAGIC,
		# item.APPLY_RESIST_WIND 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_WIND,
		item.APPLY_REFLECT_MELEE 		: localeinfo.OFFLINESHOP_ATTR_APPLY_REFLECT_MELEE,
		# item.APPLY_REFLECT_CURSE 		: localeinfo.OFFLINESHOP_ATTR_APPLY_REFLECT_CURSE,
		item.APPLY_POISON_REDUCE 		: localeinfo.OFFLINESHOP_ATTR_APPLY_POISON_REDUCE,
		# item.APPLY_KILL_SP_RECOVER 	: localeinfo.OFFLINESHOP_ATTR_APPLY_KILL_SP_RECOVER,
		item.APPLY_EXP_DOUBLE_BONUS 	: localeinfo.OFFLINESHOP_ATTR_APPLY_EXP_DOUBLE_BONUS,
		item.APPLY_GOLD_DOUBLE_BONUS 	: localeinfo.OFFLINESHOP_ATTR_APPLY_GOLD_DOUBLE_BONUS,
		item.APPLY_ITEM_DROP_BONUS 		: localeinfo.OFFLINESHOP_ATTR_APPLY_ITEM_DROP_BONUS,
		# item.APPLY_POTION_BONUS 		: localeinfo.OFFLINESHOP_ATTR_APPLY_POTION_BONUS,
		# item.APPLY_KILL_HP_RECOVER 	: localeinfo.OFFLINESHOP_ATTR_APPLY_KILL_HP_RECOVER,
		item.APPLY_IMMUNE_STUN 			: localeinfo.OFFLINESHOP_ATTR_APPLY_IMMUNE_STUN,
		item.APPLY_IMMUNE_SLOW 			: localeinfo.OFFLINESHOP_ATTR_APPLY_IMMUNE_SLOW,
		item.APPLY_IMMUNE_FALL 			: localeinfo.OFFLINESHOP_ATTR_APPLY_IMMUNE_FALL,
		# item.APPLY_BOW_DISTANCE 		: localeinfo.OFFLINESHOP_ATTR_BOW_DISTANCE,
		item.APPLY_DEF_GRADE_BONUS 		: localeinfo.OFFLINESHOP_ATTR_DEF_GRADE,
		item.APPLY_ATT_GRADE_BONUS 		: localeinfo.OFFLINESHOP_ATTR_ATT_GRADE,
		# item.APPLY_MAGIC_ATT_GRADE 	: localeinfo.OFFLINESHOP_ATTR_MAGIC_ATT_GRADE,
		# item.APPLY_MAGIC_DEF_GRADE 	: localeinfo.OFFLINESHOP_ATTR_MAGIC_DEF_GRADE,
		# item.APPLY_MAX_STAMINA 		: localeinfo.OFFLINESHOP_ATTR_MAX_STAMINA,
		# item.APPLY_MALL_ATTBONUS 		: localeinfo.OFFLINESHOP_ATTR_MALL_ATTBONUS,
		# item.APPLY_MALL_DEFBONUS 		: localeinfo.OFFLINESHOP_ATTR_MALL_DEFBONUS,
		# item.APPLY_MALL_EXPBONUS 		: localeinfo.OFFLINESHOP_ATTR_MALL_EXPBONUS,
		# item.APPLY_MALL_ITEMBONUS 	: localeinfo.OFFLINESHOP_ATTR_MALL_ITEMBONUS,
		# item.APPLY_MALL_GOLDBONUS 	: localeinfo.OFFLINESHOP_ATTR_MALL_GOLDBONUS,
		item.APPLY_SKILL_DAMAGE_BONUS 	: localeinfo.OFFLINESHOP_ATTR_SKILL_DAMAGE_BONUS,
		
		
		item.APPLY_NORMAL_HIT_DAMAGE_BONUS 	: localeinfo.OFFLINESHOP_ATTR_NORMAL_HIT_DAMAGE_BONUS,
		item.APPLY_SKILL_DEFEND_BONUS 		: localeinfo.OFFLINESHOP_ATTR_SKILL_DEFEND_BONUS,
		item.APPLY_NORMAL_HIT_DEFEND_BONUS 	: localeinfo.OFFLINESHOP_ATTR_NORMAL_HIT_DEFEND_BONUS,
		# item.APPLY_PC_BANG_EXP_BONUS 		: localeinfo.OFFLINESHOP_ATTR_MALL_EXPBONUS_P_STATIC,
		# item.APPLY_PC_BANG_DROP_BONUS 	: localeinfo.OFFLINESHOP_ATTR_MALL_ITEMBONUS_P_STATIC,
		# item.APPLY_RESIST_WARRIOR 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_WARRIOR,
		# item.APPLY_RESIST_ASSASSIN 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_ASSASSIN,
		# item.APPLY_RESIST_SURA 			: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_SURA,
		# item.APPLY_RESIST_SHAMAN 			: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_SHAMAN,
		# item.APPLY_MAX_HP_PCT 			: localeinfo.OFFLINESHOP_ATTR_APPLY_MAX_HP_PCT,
		# item.APPLY_MAX_SP_PCT 			: localeinfo.OFFLINESHOP_ATTR_APPLY_MAX_SP_PCT,
		# item.APPLY_ENERGY 				: localeinfo.OFFLINESHOP_ATTR_ENERGY,
		# item.APPLY_COSTUME_ATTR_BONUS 	: localeinfo.OFFLINESHOP_ATTR_COSTUME_ATTR_BONUS,
		

		# item.APPLY_MAGIC_ATTBONUS_PER 		: localeinfo.OFFLINESHOP_ATTR_MAGIC_ATTBONUS_PER,
		# item.APPLY_MELEE_MAGIC_ATTBONUS_PER 	: localeinfo.OFFLINESHOP_ATTR_MELEE_MAGIC_ATTBONUS_PER,
		# item.APPLY_RESIST_ICE 				: localeinfo.OFFLINESHOP_ATTR_RESIST_ICE,
		# item.APPLY_RESIST_EARTH 				: localeinfo.OFFLINESHOP_ATTR_RESIST_EARTH,
		# item.APPLY_RESIST_DARK 				: localeinfo.OFFLINESHOP_ATTR_RESIST_DARK,
		# item.APPLY_ANTI_CRITICAL_PCT 			: localeinfo.OFFLINESHOP_ATTR_ANTI_CRITICAL_PCT,
		# item.APPLY_ANTI_PENETRATE_PCT 		: localeinfo.OFFLINESHOP_ATTR_ANTI_PENETRATE_PCT,
	}
	if ENABLE_WOLFMAN_CHARACTER:
		ATTRIBUTES.update({
			item.APPLY_BLEEDING_PCT 		: localeinfo.OFFLINESHOP_ATTR_APPLY_BLEEDING_PCT,
			item.APPLY_BLEEDING_REDUCE 		: localeinfo.OFFLINESHOP_ATTR_APPLY_BLEEDING_REDUCE,
			item.APPLY_ATTBONUS_WOLFMAN 	: localeinfo.OFFLINESHOP_ATTR_APPLY_ATTBONUS_WOLFMAN,
			item.APPLY_RESIST_CLAW 			: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_CLAW,
			item.APPLY_RESIST_WOLFMAN 		: localeinfo.OFFLINESHOP_ATTR_APPLY_RESIST_WOLFMAN,
		})

	if ENABLE_MAGIC_REDUCTION_SYSTEM:
		ATTRIBUTES.update({
			item.APPLY_RESIST_MAGIC_REDUCTION : localeinfo.OFFLINESHOP_ATTR_RESIST_MAGIC_REDUCTION,
		})

	try:
		if app.__ENABLE_FIFTH_STATUS__:
			ATTRIBUTES[item.APPLY_RES] 				= localeinfo.OFFLINESHOP_ATTR_RES
			ATTRIBUTES[item.APPLY_HARDNESS_GRADE] 	= localeinfo.OFFLINESHOP_ATTR_HARDNESS_GRADE
	except:
		pass


		
	
	
	
	
	




	def __init__(self):
		ui.ScriptWindow.__init__(self)

		self.clear()

		offlineshop.SetOfflineshopBoard(self)
		self.__loadWindow()

	def clear(self):
		# menu
		self.MyShopButton = None
		self.ListOfShopButton = None
		self.SearchFilterButton = None
		self.SearchHistoryButton = None
		self.MyPatternsButton = None

		self.MyAuctionButton = None
		self.ListOfAuctionsButton = None
		


		# common
		self.pageBoards = {}
		self.pageCategory = "my_shop"
		self.updateEvents = {}
		self.itemTooltip = None
		self.popupMessage = None
		self.ShopItemForSale = []
		self.ShopItemSold = []
		self.EditPriceSlot = None
		self.AddItemSlotIndex = -1
		self.CommonInputPriceDlg = None
		self.CommonQuestionDlg = None
		self.CommonPickValuteDlg = None
		self.TitleBar = None
		

		# filtering
		self.SearchFilterShopItemResult = []
		self.FilterHistory = []
		self.FilterPatterns = {}

		# shoplist
		self.ShopList = []
		self.ShopOpenInfo = {}
		self.ShopListTable = None

		# create shop member
		self.InsertedItems = []
		self.CreateShopNameEdit = None
		self.CreateShopDaysCountText = None
		self.CreateShopHoursCountText = None
		self.CreateShopItemsTable = None
		self.CreateShopItemsInfos = {}

		# myshop page member
		self.MyShopItemsTable = None
		self.MyShopShopTitle = None
		self.MyShopShopDuration = None
		self.MyShopCloseButton = None
		self.MyShopEditNameDlg = None
		self.MyShopOffers = None
		self.MyShopOffersTable = None

		# open shop page member
		self.OpenShopItemsTable = None
		self.OpenShopBackToListButton = None
		self.OpenShopShopTitle = None
		self.OpenShopShopDuration = None
		self.OpenShopBuyItemID = -1
		self.BuyPriceSeenTotal = 0

		# search & filter page
		self.SearchFilterItemsNameDict = {}
		self.SearchFilterCheckBoxesRace = {}
		self.SearchFilterCheckBoxes = {}
		self.SearchFilterAttributeButtons = []

		self.SearchFilterComboBoxSuggestion = None
		self.SearchFilterSuggestionObj = None
		self.SearchFilterItemNameInput = None
		self.SearchFilterItemLevelStart = None
		self.SearchFilterItemLevelEnd = None
		self.SearchFilterItemYangMin = None
		self.SearchFilterItemYangMax = None
		self.SearchFilterResetFilterButton = None
		self.SearchFilterSavePatternButton = None
		self.SearchFilterStartSearch = None
		
		self.ShowGradeFilterButton = None
		self.GradeFilterWindow = None
		self.HideGradeFilterButton = None
		self.GradeFilterBackground = None
		self.GradeFilterCheckBox = None
		self.GradeFilterSuggestions = None
		self.GradeFilterButtonSelect = None
		self.GradeFilterWindowSettings = {}
		self.GradeFilterSuggestionsIndex = -1
		

		self.SearchFilterResultItemsTable = None

		# Search History page
		self.SearchHistoryTable = None

		# mypattern page
		self.SearchPatternsTable = None
		self.SearchPatternsInputNameDlg = None

		# shop safebox
		self.ShopSafeboxItems = []
		self.ShopSafeboxItemsTable = None
		self.ShopSafeboxValuteAmount=0
		self.ShopSafeboxValuteText = None
		self.ShopSafeboxWithdrawYangButton = None
		if ENABLE_CHEQUE_SYSTEM:
			self.ShopSafeboxValuteTextCheque = None

		# my offers page
		self.MyOffersList = None
		self.MyOffersTable = None

		# my auction page
		self.MyAuctionInfo = {}
		self.MyAuctionOffers = []
		self.MyAuctionOfferTable = None

		self.MyAuctionOwnerName = None
		self.MyAuctionDuration = None
		self.MyAuctionBestOffer = None
		self.MyAuctionMinRaise = None
		self.MyAuctionSlot = None

		# open auction page
		self.OpenAuctionInfo = {}
		self.OpenAuctionOffers = []
		self.OpenAuctionOfferTable = None

		self.OpenAuctionOwnerName = None
		self.OpenAuctionDuration = None
		self.OpenAuctionBestOffer = None
		self.OpenAuctionMinRaise = None
		self.OpenAuctionSlot = None


		# auctionlist
		self.AuctionListInfo = {}
		self.AuctionListTable = None

		# create auction page
		self.CreateAuctionCreateAuctionButton = None
		self.CreateAuctionDaysInput = None
		self.CreateAuctionStartingPriceInput = None
		self.CreateAuctionSlot = None
		self.CreateAuctionDaysIncreaseButton = None
		self.CreateAuctionDaysDecreaseButton = None

		#refresh symbol
		self.RefreshSymbol = None
		
		if app.KASMIR_PAKET_SYSTEM:
			#self.wndRender = None
			#self.wndRenderPreview = None
			self.KasmirNpc = 0
			self.btnIncRender = None
			self.btnDecRender = None

	def Destroy(self):
		self.Hide()
		self.clear()
		self.ClearDictionary()

	#offlineshop-updated 05/08/19
	def OnPressEscapeKey(self):
		self.Close()
		return True

	def __del__(self):
		self.Destroy()
		print("------------ DESTROYED OFFLINESHOP INTERFACE ------------")
		ui.ScriptWindow.__del__(self)
	
	
	def __loadWindow(self):
		pyLoader = ui.PythonScriptLoader()
		pyLoader.LoadScriptFile(self , "uiscript/offlineshopwindow.py")
		
		childDict = {
			"create_shop"		: "MyShopBoardNoShop",
			"my_shop"			: "MyShopBoard",
			"open_shop"			: "ListOfShop_OpenShop",
			"shop_list"			: "ListOfShop_List",
			"shop_safebox"		: "ShopSafeboxPage",
			"my_offers"			: "MyOffersPage",

			"search_history"	: "SearchHistoryBoard",
			"my_patterns"		: "MyPatternsBoard",
			"search_filter"		: "SearchFilterBoard",

			"my_auction"		: "MyAuction",
			"auction_list"		: "AuctionList",
			"open_auction"		: "OpenAuction",
			"create_auction"	: "CreateAuction",

		}
		
		
		self.pageBoards = {}
		
		for k, v in childDict.items():
			self.pageBoards[k] = self.GetChild(v)
			self.pageBoards[k].Hide()
		
		if app.KASMIR_PAKET_SYSTEM:
			self.KasmirNpc = 30000
			
			self.btnIncRender = self.GetChild("IncreaseStyleButton")
			self.btnDecRender = self.GetChild("DecreaseStyleButton")
			self.btnIncRender.Hide()
			self.btnIncRender.SAFE_SetEvent(self.OnClickIncBtn)
			self.btnDecRender.SAFE_SetEvent(self.OnClickDecBtn)
			self.btnDecRender.Hide()
			
			#self.wndRender = ui.ThinBoard()
			#self.wndRender.SetParent(self.pageBoards["create_shop"])
			#self.wndRender.SetSize(100, 100)
			#self.wndRender.SetPosition(self.pageBoards["create_shop"].GetWidth() - 160, 12)
			#self.wndRender.Show()
			
			#self.wndRenderPreview = ui.RenderTarget()
			#self.wndRenderPreview.SetParent(self.wndRender)
			#self.wndRenderPreview.SetSize(90, 90)
			#self.wndRenderPreview.SetPosition(4, 4)
			#self.wndRenderPreview.SetRenderTarget(2)
			#self.wndRenderPreview.Show()
			
			#renderTarget.SetBackground(2, "d:/ymir work/ui/game/myshop_deco/model_view_bg.sub")
			#renderTarget.SetVisibility(2, True)
			#renderTarget.SelectModel(2, self.KasmirNpc)
		
		#refresh symbol
		self.RefreshSymbol = self.GetChild("RefreshSymbol")


		#create shop page
		# self.HowToInsertItemText			= self.GetChild("HowToInsertItems")
		self.CreateShopNameEdit				= self.GetChild("ShopNameInput")
		self.CreateShopDaysCountText		= self.GetChild("DaysCountText")
		self.CreateShopHoursCountText		= self.GetChild("HoursCountText")
		
		self.CreateShopIncreaseDaysButton	= self.GetChild("IncreaseDaysButton")
		self.CreateShopDecreaseDaysButton	= self.GetChild("DecreaseDaysButton")
		
		self.CreateShopIncreaseHoursButton	= self.GetChild("IncreaseHoursButton")
		self.CreateShopDecreaseHoursButton	= self.GetChild("DecreaseHoursButton")
		
		self.CreateShopButton				= self.GetChild("CreateShopButton")
		
		self.CreateShopIncreaseDaysButton.SAFE_SetEvent(self.__OnClickCreateShopIncreaseDaysButton)
		self.CreateShopDecreaseDaysButton.SAFE_SetEvent(self.__OnClickCreateShopDecreaseDaysButton)
		
		self.CreateShopIncreaseHoursButton.SAFE_SetEvent(self.__OnClickCreateShopIncreaseHoursButton)
		self.CreateShopDecreaseHoursButton.SAFE_SetEvent(self.__OnClickCreateShopDecreaseHoursButton)
		
		
		self.CreateShopButton.SAFE_SetEvent(self.__OnClickCreateShopButton)
		self.__MakeCreateShopItemsTable()
		
		
		#myshop page
		self.MyShopShopDuration		= self.GetChild("MyShopShopDuration")
		self.MyShopShopTitle		= self.GetChild("MyShopShopTitle")
		self.MyShopCloseButton		= self.GetChild("MyShopCloseButton")
		self.MyShopEditTitleButton	= self.GetChild("MyShopEditTitleButton")
		self.__MakeMyShopItemsTable()
		self.__MakeMyShopOffersTable()
		
		self.MyShopCloseButton.SAFE_SetEvent(self.__OnClickCloseButton)
		self.MyShopEditTitleButton.SAFE_SetEvent(self.__OnClickMyShopEditNameButton)
		
		self.MyShopEditNameDlg	= uicommon.InputDialogWithDescription()
		self.MyShopEditNameDlg.SetMaxLength(35)
		self.MyShopEditNameDlg.SetDescription(localeinfo.OFFLINESHOP_EDIT_SHOPNAME_DESCRIPTION)
		self.MyShopEditNameDlg.SetAcceptEvent(self.__OnAcceptChangeShopNameDlg)
		self.MyShopEditNameDlg.SetCancelEvent(self.__OnCancelChangeShopNameDlg)
		self.MyShopEditNameDlg.SetTitle(localeinfo.OFFLINESHOP_EDIT_SHOPNAME_TITLE)
		self.MyShopEditNameDlg.Hide()
		
		
		
		
		#shoplist page
		self.__MakeShopListTable()
		
		
		#OpenShop page
		self.OpenShopBackToListButton	= self.GetChild("OpenShopBackToListButton")
		self.OpenShopShopTitle			= self.GetChild("OpenShopShopTitle")
		self.OpenShopShopDuration		= self.GetChild("OpenShopShopDuration")
		
		self.CommonQuestionDlg 	= uicommon.QuestionDialog()

		self.CommonPickValuteDlg = uipickmoney.PickMoneyDialog()
		self.CommonPickValuteDlg.LoadDialog()

		self.OpenShopBackToListButton.SAFE_SetEvent(self.__OnClickShopListPage)
		self.__MakeOpenShopItemsTable()


		self.TitleBar = self.GetChild("TitleBar")
		self.TitleBar.SetCloseEvent(self.Close)

		#changepage buttons
		self.MyShopButton			= self.GetChild("MyShopButton")
		self.ListOfShopButton		= self.GetChild("ListOfShopButton")
		self.ShopSafeboxButton		= self.GetChild("ShopSafeboxButton")
		self.MyOffersPageButton		= self.GetChild("MyOffersPageButton")

		self.SearchFilterButton		= self.GetChild("SearchFilterButton")
		self.SearchHistoryButton	= self.GetChild("SearchHistoryButton")
		self.MyPatternsButton		= self.GetChild("MyPatternsButton")
		
		self.MyAuctionButton		= self.GetChild("MyAuctionButton")
		self.ListOfAuctionsButton	= self.GetChild("ListOfAuctionsButton")
		
		
		
		
		#events setting
		self.MyShopButton.SAFE_SetEvent(self.__OnClickMyShopPage)
		self.ListOfShopButton.SAFE_SetEvent(self.__OnClickShopListPage)
		self.ShopSafeboxButton.SAFE_SetEvent(self.__OnClickShopSafeboxPage)
		self.MyOffersPageButton.SAFE_SetEvent(self.__OnClickMyOffersPage)

		self.SearchFilterButton.SAFE_SetEvent(self.__OnClickSearchFilterPage)
		self.SearchHistoryButton.SAFE_SetEvent(self.__OnClickSearchHistoryPage)
		self.MyPatternsButton.SAFE_SetEvent(self.__OnClickMyPatternsPage)
		
		self.MyAuctionButton.SAFE_SetEvent(self.__OnClickMyAuctionPage)
		self.ListOfAuctionsButton.SAFE_SetEvent(self.__OnClickAuctionListPage)
		
		
		
		

		
		
		#updateEvents
		self.updateEvents = {
			"my_shop"		: self.__OnUpdateMyShopPage,
			"create_shop"	: self.__OnUpdateCreateShopPage,
			"open_shop"		: self.__OnUpdateOpenShopPage,
			"search_filter"	: self.__OnUpdateSearchFilterPage,
			"shop_safebox"	: self.__OnUpdateShopSafeboxPage,
			"my_offers"		: self.__OnUpdateMyOffersPage,
			"search_history": self.__OnUpdateSearchHistoryPage,
			"my_patterns"	: self.__OnUpdateMyPatternPage,
			"create_auction": self.__OnUpdateCreateAuctionPage,
			"my_auction"	: self.__OnUpdateMyAuctionPage,
			"open_auction"	: self.__OnUpdateOpenAuctionPage,
			"auction_list"  : self.__OnUpdateAuctionListPage,
		}
		
		
		#item tooltip
		tooltip = uitooltip.ItemToolTip(width=300)
		tooltip.ClearToolTip()
		tooltip.SetFollow(True)
		tooltip.Hide()
		self.itemTooltip = tooltip
		
		#popup message
		popup = uicommon.PopupDialog()
		popup.SetWidth(250)
		popup.Hide()
		self.popupMessage = popup
		
		#input price
		self.CommonInputPriceDlg =  uicommon.MoneyInputDialogCheque() if ENABLE_CHEQUE_SYSTEM  else uicommon.MoneyInputDialog()
		self.CommonInputPriceDlg.SetAcceptEvent(self.__OnAcceptInputPrice)
		self.CommonInputPriceDlg.SetCancelEvent(self.__OnCancelInputPrice)
		
		
		#search filter page
		offlineshop.RefreshItemNameMap()
		self.__MakeSearchFilterResultItemsTable()

		self.SearchFilterItemNameInput 		= self.GetChild("SearchFilterItemNameInput")
		self.SearchFilterItemLevelStart		= self.GetChild("SearchFilterItemLevelStart")
		self.SearchFilterItemLevelEnd		= self.GetChild("SearchFilterItemLevelEnd")
		self.SearchFilterItemYangMin		= self.GetChild("SearchFilterItemYangMin")
		self.SearchFilterItemYangMax		= self.GetChild("SearchFilterItemYangMax")
		self.SearchFilterResetFilterButton	= self.GetChild("SearchFilterResetFilterButton")
		self.SearchFilterSavePatternButton	= self.GetChild("SearchFilterSavePatternButton")
		self.SearchFilterStartSearch		= self.GetChild("SearchFilterStartSearch")
		self.__MakeGradeFilterWindow()
		
		self.__MakeSearchFilterCheckBoxes()
		self.SearchFilterComboBoxSuggestion	= ui.ComboBox()
		self.SearchFilterComboBoxSuggestion.SetParent(self.pageBoards["search_filter"])
		self.SearchFilterComboBoxSuggestion.SetPosition(75,50)
		self.SearchFilterComboBoxSuggestion.SetSize(130,17)
		self.SearchFilterComboBoxSuggestion.Show()
		
		
		self.SearchFilterSuggestionObj = Suggestions()
		self.SearchFilterSuggestionObj.SetComboBox(self.SearchFilterComboBoxSuggestion)
		self.SearchFilterSuggestionObj.SetInputBox(self.SearchFilterItemNameInput)
		self.SearchFilterSuggestionObj.SetMainDict(self.SearchFilterItemsNameDict)
		
		self.SearchFilterResetFilterButton.SAFE_SetEvent(self.__OnClickSearchFilterResetFilterButton)
		self.SearchFilterSavePatternButton.SAFE_SetEvent(self.__OnClickSearchFilterSavePatternButton)
		self.SearchFilterStartSearch.SAFE_SetEvent(self.__OnClickSearchFilterStartSearch)
		
		
		#subtype
		self.SearchFilterSubTypeComboBox = ui.ComboBox()
		self.SearchFilterSubTypeComboBox.SetParent(self.pageBoards["search_filter"])
		self.SearchFilterSubTypeComboBox.SetPosition(220,50)
		self.SearchFilterSubTypeComboBox.SetSize(100,17)
		self.SearchFilterSubTypeComboBox.Show()
		self.SearchFilterSubTypeComboBox.InsertItem(SUBTYPE_NOSET , localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
		self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
		
		#type
		self.SearchFilterTypeComboBox = ui.ComboBox()
		self.SearchFilterTypeComboBox.SetParent(self.pageBoards["search_filter"])
		self.SearchFilterTypeComboBox.SetPosition(220,29)
		self.SearchFilterTypeComboBox.SetSize(100,17)
		self.SearchFilterTypeComboBox.Show()
		
		#insert types
		for k,v in self.ITEM_TYPES.items():
			self.SearchFilterTypeComboBox.InsertItem(k, v["name"])
		
		self.SearchFilterTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
		
		
		
		
		self.SearchFilterTypeComboBox.SetEvent(self.__OnSelectSearchFilterTypeComboBox)
		self.SearchFilterSubTypeComboBox.SetEvent(self.__OnSelectSearchFilterSubTypeComboBox)
		
		self.SearchFilterTypeComboBoxIndex = 0
		self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET
		
		
		#attributes
		for i in xrange(player.ATTRIBUTE_SLOT_NORM_NUM):
			self.SearchFilterAttributeButtons.append(self.GetChild("SearchFilterAttributeButton%d"%(i+1)))
			self.SearchFilterAttributeButtons[i].SAFE_SetEvent(self.__OnClickSearchFilterAttributeButton, i)
			self.SearchFilterAttributeButtons[i].SetText(self.ATTRIBUTES[0])
		
		selector = SuggestionSelector()
		selector.SetParent(self.pageBoards["search_filter"])
		selector.SetSelectEvent(self.__OnSelectSearchFilterSuggestionSelector)
		selector.SetValueDict(self.ATTRIBUTES)
		selector.Hide()
		
		
		self.SearchFilterSuggestionSelector = selector
		self.SearchFilterAttributeSetting = [0 for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM)]
		
		#search history page
		self.__MakeSearchHistoryTable()


		#search pattern page
		self.__MakeSearchPatternsTable()
		self.SearchPatternsInputNameDlg = uicommon.InputDialogWithDescription()
		self.SearchPatternsInputNameDlg.SetMaxLength(25)
		self.SearchPatternsInputNameDlg.SetDescription(localeinfo.OFFLINESHOP_MY_PATTERN_INSERT_NAME_DESC)
		self.SearchPatternsInputNameDlg.SetAcceptEvent(self.__OnAcceptMyPatternInputName)
		self.SearchPatternsInputNameDlg.SetCancelEvent(self.__OnCancelMyPatternInputName)
		self.SearchPatternsInputNameDlg.SetTitle(localeinfo.OFFLINESHOP_MY_PATTERN_INSERT_NAME_TITLE)
		self.SearchPatternsInputNameDlg.Hide()



		#safebox page
		self.__MakeShopSafeboxItemsTable()
		self.ShopSafeboxValuteText 			= self.GetChild("ShopSafeboxValuteText")
		self.ShopSafeboxWithdrawYangButton	= self.GetChild("ShopSafeboxWithdrawYangButton")

		self.ShopSafeboxWithdrawYangButton.SAFE_SetEvent(self.__OnClickShopSafeboxWithdrawYang)
		if ENABLE_CHEQUE_SYSTEM:
			self.ShopSafeboxValuteTextCheque= self.GetChild("ShopSafeboxValuteTextCheque")

		#myoffers page
		self.__MakeMyOffersTable()


		#myAuction page
		self.MyAuctionOwnerName 	= self.GetChild("MyAuction_OwnerName")
		self.MyAuctionDuration 		= self.GetChild("MyAuction_Duration")
		self.MyAuctionBestOffer 	= self.GetChild("MyAuction_BestOffer")
		self.MyAuctionMinRaise 		= self.GetChild("MyAuction_MinRaise")
		
		self.__MakeMyAuctionOffersTable()


		#open auction page
		self.OpenAuctionOwnerName	= self.GetChild("OpenAuction_OwnerName")
		self.OpenAuctionDuration 	= self.GetChild("OpenAuction_Duration")
		self.OpenAuctionBestOffer 	= self.GetChild("OpenAuction_BestOffer")
		self.OpenAuctionMinRaise 	= self.GetChild("OpenAuction_MinRaise")
		#updated 11.01.2020
		self.OpenAuctionBackToListButton = self.GetChild("OpenAuctionBackToListButton")
		self.OpenAuctionBackToListButton.SAFE_SetEvent(self.__OnClickAuctionListPage)

		if ENABLE_CHEQUE_SYSTEM:
			self.ShopSafeboxValuteTextCheque= self.GetChild("ShopSafeboxValuteTextCheque")
		self.__MakeOpenAuctionOffersTable()

		#auction list page
		self.__MakeAuctionListTable()


		#create auction page
		self.CreateAuctionCreateAuctionButton 	= self.GetChild("CreateAuctionCreateAuctionButton")
		self.CreateAuctionDaysInput 			= self.GetChild("CreateAuctionDaysInput")
		self.CreateAuctionStartingPriceInput 	= self.GetChild("CreateAuctionStartingPriceInput")

		self.CreateAuctionWindowPos =-1
		self.CreateAuctionSlotPos=-1

		self.CreateAuctionDaysDecreaseButton	= self.GetChild("CreateAuctionIncreaseDaysButton")
		self.CreateAuctionDaysIncreaseButton	= self.GetChild("CreateAuctionDecreaseDaysButton")

		self.CreateAuctionCreateAuctionButton.SAFE_SetEvent(self.__OnClickCreateAuctionButton)
		self.CreateAuctionDaysDecreaseButton.SAFE_SetEvent(self.__OnClickCreateAuctionDaysDecreaseButton)
		self.CreateAuctionDaysIncreaseButton.SAFE_SetEvent(self.__OnClickCreateAuctionDaysIncreaseButton)
		
		self.CloseMyAuction = self.GetChild("MyAuction_Close")
		self.CloseMyAuction.SAFE_SetEvent(self.__OnClickMyAuctionClose)
		
		self.__MakeCreateAuctionSlot()

		#fixing escape key
		items = (
			self.CreateShopNameEdit,
			self.SearchFilterItemNameInput,
			self.SearchFilterItemLevelStart,
			self.SearchFilterItemLevelEnd,
			self.SearchFilterItemYangMin,
			self.SearchFilterItemYangMax,
			self.CreateAuctionStartingPriceInput,
		)

		autokill = lambda arg: arg.KillFocus()

		for item in items:
			item.OnPressEscapeKey = lambda : autokill(item)
		
		
		self.__UpdateAttachedWindows()

	if app.KASMIR_PAKET_SYSTEM:
		def OnClickIncBtn(self):
			if self.pageBoards["create_shop"].IsShow():
				if self.KasmirNpc >= 30007:
					self.KasmirNpc = 30000
				else:
					self.KasmirNpc += 1
			
				#renderTarget.SelectModel(2, self.KasmirNpc)

		def OnClickDecBtn(self):
			if self.pageBoards["create_shop"].IsShow():
				if self.KasmirNpc <= 30000:
					self.KasmirNpc = 30007
				else:
					self.KasmirNpc -= 1
			
				#renderTarget.SelectModel(2, self.KasmirNpc)

	def OnTop(self):
		if self.pageCategory == "search_filter":
			if self.ShowGradeFilterButton and self.ShowGradeFilterButton.IsShow():
				self.ShowGradeFilterButton.SetTop()


	def Open(self):
		events = {
			"my_shop"			: self.__OnClickMyShopPage,
			"open_shop"			: self.__OnClickShopListPage,
			"shop_list"			: self.__OnClickShopListPage,
			"shop_safebox"		: self.__OnClickShopSafeboxPage,
			"my_offers"			: self.__OnClickMyOffersPage,

			"search_history"	: self.__OnClickSearchHistoryPage,
			"my_patterns"		: self.__OnClickMyPatternsPage,
			"search_filter"		: self.__OnClickSearchFilterPage,

			"my_auction"		: self.__OnClickMyAuctionPage,
			"auction_list"		: self.__OnClickAuctionListPage,
			"open_auction"		: self.__OnClickAuctionListPage,
		}

		if self.pageCategory in events.keys():
			events[self.pageCategory]()
		
		if app.KASMIR_PAKET_SYSTEM:
			if self.pageBoards["create_shop"].IsShow() or self.pageCategory == "my_shop":
				#if self.wndRenderPreview:
				self.KasmirNpc = 30000
					#renderTarget.SelectModel(2, self.KasmirNpc)
		
		self.Show()


	def Close(self):
		self.Hide()
		self.itemTooltip.Hide()
		self.MyShopEditNameDlg.Hide()
		self.CommonQuestionDlg.Hide()
		self.CommonPickValuteDlg.Hide()
		self.CommonInputPriceDlg.Hide()

		offlineshop.SendCloseBoard()
		
		if self.pageCategory == "search_filter":
			if self.ShowGradeFilterButton:
				self.ShowGradeFilterButton.Hide()
			
			if self.GradeFilterWindow:
				self.GradeFilterWindow.Hide()
			
			if self.GradeFilterSuggestions:
				self.GradeFilterSuggestions.Hide()







	def __ResetCreateShopPage(self):
		# self.HowToInsertItemText.Show()
		self.CreateShopItemsTable.ClearElement()
		self.CreateShopItemsInfos = {}
		


	def OnMoveWindow(self, x, y):
		if self.pageCategory == "search_filter":
			self.__UpdateAttachedWindows()


	
	def __MakeCreateShopItemsTable(self):
		board = self.pageBoards["create_shop"]
		
		table = TableWindowWithScrollbar(575, 325, 11,3, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
		table.SetParent(board)
		table.SetPosition(25, 115)
		table.SetDefaultCreateChild(MakeDefaultEmptySlot, self.__OnClickCreateShopEmptySlot)
		
		table.Show()
		self.CreateShopItemsTable = table
	
	
	def __MakeMyShopItemsTable(self):
		board = self.pageBoards["my_shop"]
		
		table = TableWindowWithScrollbar(588, 324, 11,3, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
		table.SetParent(board)
		table.SetPosition(17, 49)
		table.SetDefaultCreateChild(MakeDefaultEmptySlot, self.__OnClickMyShopEmptySlot)

		table.Show()
		self.MyShopItemsTable = table
	
	def __MakeMyShopOffersTable(self):
		board = self.pageBoards["my_shop"]

		table = TableWindowWithScrollbar(585, 114, 1,5 , TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(20, 395)

		table.Show()
		self.MyShopOffersTable = table


	def __MakeShopListTable(self):
		board = self.pageBoards["shop_list"]
		
		table = TableWindowWithScrollbar(570, 476, 1, 23, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(30, 26)
		
		table.Show()
		self.ShopListTable = table
	
	
	def __MakeOpenShopItemsTable(self):
		board = self.pageBoards["open_shop"]
		
		table = TableWindowWithScrollbar(584, 440, 11,4, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
		table.SetParent(board)
		table.SetPosition(20,55)
		table.SetDefaultCreateChild(MakeDefaultEmptySlot)
		
		table.Show()
		self.OpenShopItemsTable = table

	def __MakeOpenAuctionOffersTable(self):
		board = self.pageBoards["open_auction"]

		table = TableWindowWithScrollbar(580, 340, 1, 20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(16, 159)

		table.Show()
		self.OpenAuctionOfferTable = table

	def __MakeMyAuctionOffersTable(self):
		board = self.pageBoards["my_auction"]

		table = TableWindowWithScrollbar(580, 340, 1,20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(16, 159)

		table.Show()
		self.MyAuctionOfferTable = table

	def __MakeAuctionListTable(self):
		board = self.pageBoards["auction_list"]

		table = TableWindowWithScrollbar(581, 471, 1, 20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(21, 28)

		table.Show()
		self.AuctionListTable = table

	def __GradeFilterOnTop(self):
		if self.GradeFilterSuggestions and self.GradeFilterSuggestions.IsShow():
			self.GradeFilterSuggestions.SetTop()
	
	
	def __MakeGradeFilterWindow(self):
		button = ui.Button()
		button.SetUpVisual("offlineshop/searchfilter/grade_filter/expand_grade_filter_default.png")
		button.SetDownVisual("offlineshop/searchfilter/grade_filter/expand_grade_filter_down.png")
		button.SetOverVisual("offlineshop/searchfilter/grade_filter/expand_grade_filter_over.png")
		button.SAFE_SetEvent(self.__OnClickShowGradeFilterButton)
		button.Hide()
		button.AddFlag("float")
		self.ShowGradeFilterButton = button
		
		window = ui.Board()
		window.SetSize(132,86)
		window.AddFlag("float")
		window.OnTop = self.__GradeFilterOnTop
		self.GradeFilterWindow = window
		
		hide_button = ui.Button()
		hide_button.SAFE_SetEvent(self.__OnClickHideGradeFilterButton)
		hide_button.SetUpVisual("offlineshop/searchfilter/grade_filter/reduce_grade_filter_default.png")
		hide_button.SetDownVisual("offlineshop/searchfilter/grade_filter/reduce_grade_filter_down.png")
		hide_button.SetOverVisual("offlineshop/searchfilter/grade_filter/reduce_grade_filter_over.png")
		hide_button.SetParent(self.GradeFilterWindow)
		hide_button.SetPosition(self.GradeFilterWindow.GetWidth()-hide_button.GetWidth(), 4)
		hide_button.Show()
		self.HideGradeFilterButton = hide_button
		
		background = ui.ImageBox()
		background.LoadImage("offlineshop/searchfilter/grade_filter.png")
		background.Show()
		background.SetParent(self.GradeFilterWindow)
		background.SetWindowHorizontalAlignCenter()
		background.SetWindowVerticalAlignCenter()
		background.SetPosition(-1,0)
		self.GradeFilterBackground = background
		
		checkbox = ui.OfflineShopCheckBox({'base' : "offlineshop/checkbox/base.png", 'tip' : "offlineshop/checkbox/tip.png",})
		checkbox.SetParent(self.GradeFilterBackground)
		checkbox.SetPosition(9,3)
		checkbox.Show()
		self.GradeFilterCheckBox = checkbox
		
		select_button = ui.Button()
		select_button.SetUpVisual("offlineshop/searchfilter/grade_filter/grade_selector_default.png")
		select_button.SetDownVisual("offlineshop/searchfilter/grade_filter/grade_selector_down.png")
		select_button.SetOverVisual("offlineshop/searchfilter/grade_filter/grade_selector_over.png")
		select_button.SetParent(self.GradeFilterBackground)
		select_button.SetPosition(0,0)
		select_button.SetWindowHorizontalAlignCenter()
		select_button.SetWindowVerticalAlignCenter()
		select_button.SetText(self.RARITY_GRADES[-1])
		select_button.SAFE_SetEvent(self.__OnClickGradeSelectButton)
		select_button.Show()
		self.GradeFilterButtonSelect = select_button
		
		selector = SuggestionSelector(len(self.RARITY_GRADES), 'small')
		selector.AddFlag("float")
		selector.SetSelectEvent(self.__OnSelectSearchFilterGradeSelector)
		selector.SetValueDict(self.RARITY_GRADES)
		selector.Hide()
		self.GradeFilterSuggestions = selector
		
		
		self.GradeFilterWindowSettings = {'state': 'hidden', 'x' : self.GetWidth() - self.GradeFilterWindow.GetWidth() , 'y' : 50}
	
	
	def __MakeSearchFilterCheckBoxes(self):
		positions = {
			"name" 	: { "x" : 20, 	"y" : 9, 	},
			"type" 	: { "x" : 222, 	"y" : 9, 	},
			"price" : { "x" : 224, 	"y" : 83, 	},
			"level" : { "x" : 338, 	"y" : 9, 	},
			"wear" 	: { "x" : 20, 	"y" : 83, 	},
			"attr" 	: { "x" : 404, 	"y" : 9, 	},
		}

		if ENABLE_WOLFMAN_CHARACTER:
			race = {
				"warrior" : { "x" 	: 66+18, 	"y" : 88, 	},
				"assassin" 	: { "x" : 66+18, 	"y" : 114, 	},
				"sura" 		: { "x" : 139+10, 	"y" : 88, 	},
				"shaman" 	: { "x" : 139+10, 	"y" : 114, 	},
				"wolfman"	: { "x" : 20, 		"y" : 114,  },
			}

		else:
			race = {
				"warrior" 	: { "x" : 66, 	"y" : 88, 	},
				"assassin" 	: { "x" : 66, 	"y" : 114, 	},
				"sura" 		: { "x" : 139, 	"y" : 88, 	},
				"shaman" 	: { "x" : 139, 	"y" : 114, 	},
			}
		
		for k, v in positions.items():
			checkbox = ui.OfflineShopCheckBox({'base' : "offlineshop/checkbox/base.png", 'tip' : "offlineshop/checkbox/tip.png",})
			checkbox.SetParent(self.pageBoards["search_filter"])
			checkbox.SetPosition(v["x"] , v["y"])
			checkbox.Show()
			
			self.SearchFilterCheckBoxes[k] = checkbox
		
		
		for k, v in race.items():
			checkbox = ui.OfflineShopCheckBox({'base' : "offlineshop/checkbox/%s_base.png"%k , 'tip' : "offlineshop/checkbox/%s_tip.png"%k,})
			checkbox.SetParent(self.pageBoards["search_filter"])
			checkbox.SetPosition(v["x"] , v["y"])
			checkbox.Show()
			checkbox.Enable()
			
			self.SearchFilterCheckBoxesRace[k] = checkbox
		
		
	def __MakeSearchFilterResultItemsTable(self):
		board = self.pageBoards["search_filter"]
		
		table = TableWindowWithScrollbar(585, 329, 11, 3, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
		table.SetParent(board)
		table.SetPosition(14,153)
		table.SetDefaultCreateChild(MakeDefaultEmptySlot)

		table.ClearElement()

		table.Show()
		self.SearchFilterResultItemsTable = table


	def __MakeSearchHistoryTable(self):
		board = self.pageBoards["search_history"]

		table = TableWindowWithScrollbar(585, 470, 1, 20 , TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(13, 32)

		table.Show()
		self.SearchHistoryTable = table


	def __MakeSearchPatternsTable(self):
		board = self.pageBoards["my_patterns"]

		table = TableWindowWithScrollbar(585, 470, 1, 20, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(13, 36)

		table.Show()
		self.SearchPatternsTable = table


	def __MakeShopSafeboxItemsTable(self):
		board = self.pageBoards["shop_safebox"]

		table = TableWindowWithScrollbar(582, 443, 11, 4, TableWindowWithScrollbar.SCROLLBAR_HORIZONTAL)
		table.SetParent(board)
		table.SetPosition(18, 50)
		table.SetDefaultCreateChild(MakeDefaultEmptySlot)

		table.Show()
		self.ShopSafeboxItemsTable = table



	def __MakeMyOffersTable(self):
		board = self.pageBoards["my_offers"]

		table = TableWindowWithScrollbar(584, 445, 2, 4, TableWindowWithScrollbar.SCROLLBAR_VERTICAL)
		table.SetParent(board)
		table.SetPosition(18, 50)

		table.Show()
		self.MyOffersTable = table

	def OnClickAuctionSlot(self, slot):
		if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL) and self.CreateAuctionSlotPos != -1:
			if mousemodule.mouseController.isAttached():
				mousemodule.mouseController.DeattachObject()
			
			self.CreateAuctionWindowPos =-1
			self.CreateAuctionSlotPos=-1
			self.__MakeCreateAuctionSlot()
			
			if self.itemTooltip:
				self.itemTooltip.ClearToolTip()
				self.itemTooltip.Hide()
		else:
			if mousemodule.mouseController.isAttached():
				attachedSlotType = mousemodule.mouseController.GetAttachedType()
				attachedSlotPos = mousemodule.mouseController.GetAttachedSlotNumber()
				itemIndex = player.GetItemIndex(attachedSlotPos)
				item.SelectItem(itemIndex)
				if not item.IsAntiFlag(item.ANTIFLAG_GIVE) and not item.IsAntiFlag(item.ANTIFLAG_MYSHOP):
					if app.ENABLE_EXTRA_INVENTORY:
						if attachedSlotType != player.SLOT_TYPE_INVENTORY and attachedSlotType != SLOT_TYPE_EXTRA_INVENTORY:
							mousemodule.mouseController.DeattachObject()
							return
					else:
						if attachedSlotType != player.SLOT_TYPE_INVENTORY:
							mousemodule.mouseController.DeattachObject()
							return
					self.AuctionBuilding_AddInventoryItem(attachedSlotPos)
				else:
					chat.AppendChat(chat.CHAT_TYPE_INFO, localeinfo.OFFLINESHOP_CANT_SELECT_ITEM_DURING_BUILING)
				
				mousemodule.mouseController.DeattachObject()

	def __MakeCreateAuctionSlot(self):
		if self.CreateAuctionSlot:
			self.CreateAuctionSlot.Destroy()
			del self.CreateAuctionSlot

		slot = Slot()
		slot.Show()
		slot.SetParent(self.pageBoards['create_auction'])
		slot.SetPosition(430,152)
		slot.SetOnMouseLeftButtonUpEvent(self.OnClickAuctionSlot)

		self.CreateAuctionSlot = slot


	def __MakeMyAuctionSlot(self, info):
		if self.MyAuctionSlot:
			del self.MyAuctionSlot

		slot = Slot()
		slot.SetParent(self.pageBoards['my_auction'])
		slot.SetPosition(339+54,97-73)
		slot.SetInfo(info)
		slot.Show()

		self.MyAuctionSlot = slot

	def __MakeOpenAuctionSlot(self, info):
		if self.OpenAuctionSlot:
			del self.OpenAuctionSlot

		slot = Slot()
		slot.SetParent(self.pageBoards['open_auction'])
		slot.SetPosition(339+54,97-73)
		slot.SetInfo(info)
		slot.Show()

		slot.SetOnMouseLeftButtonUpEvent(self.__OnClickOpenAuctionMakeOffer)
		self.OpenAuctionSlot = slot
	
	def __UpdateGradeFilterEffect(self):
		state = self.GradeFilterWindowSettings.get('state', None)
		if state == 'showing':
			x,y   = self.GetGlobalPosition()
			max_x = self.GetWidth() -3
			
			xpos = self.GradeFilterWindowSettings.get('x', 0)
			ypos = self.GradeFilterWindowSettings.get('y', 0)
			xpos = min(max_x, xpos + 3)
			
			self.GradeFilterWindowSettings['x'] = xpos
			self.GradeFilterWindow.SetPosition(x + xpos, y + ypos)
			self.SetTop()
			
			if max_x == xpos:
				self.GradeFilterWindowSettings['state'] = 'on_view'
		
		elif state == 'hiding':
			x,y = self.GetGlobalPosition()			
			min_x = self.GetWidth() - self.GradeFilterWindow.GetWidth()
			
			xpos = self.GradeFilterWindowSettings.get('x', 0)
			ypos = self.GradeFilterWindowSettings.get('y', 0)
			xpos = max(min_x, xpos - 3)
			
			self.GradeFilterWindowSettings['x'] = xpos
			self.GradeFilterWindow.SetPosition(x + xpos, y + ypos)
			self.SetTop()
			
			if min_x == xpos:
				self.GradeFilterWindowSettings['state'] = 'hidden'
				self.ShowGradeFilterButton.Show()
				self.ShowGradeFilterButton.SetTop()
			
		
	
	def __UpdateAttachedWindows(self):
		x,y = self.GetGlobalPosition()
		
		if self.ShowGradeFilterButton:
			self.ShowGradeFilterButton.SetPosition(x + self.GetWidth() - 10, y + 61 - 6)
			self.ShowGradeFilterButton.SetTop()
		
		if self.GradeFilterWindow:
			xpos = self.GradeFilterWindowSettings.get('x', 0)
			ypos = self.GradeFilterWindowSettings.get('y', 0)
			self.GradeFilterWindow.SetPosition(x + xpos, y + ypos)
		
			if self.GradeFilterSuggestions and self.GradeFilterSuggestions.IsShow():
				x,y = self.GradeFilterButtonSelect.GetGlobalPosition()
				self.GradeFilterSuggestions.SetPosition(x, y + 17)
		
		
	def __OnClickCreateShopIncreaseDaysButton(self):
		days = int(self.CreateShopDaysCountText.GetText())
		
		if days == offlineshop.OFFLINESHOP_MAX_DAYS:
			self.CreateShopDaysCountText.SetText("0")
		
		else:
			self.CreateShopDaysCountText.SetText(str(days+1))
		
	
	def __OnClickCreateShopDecreaseDaysButton(self):
		days = int(self.CreateShopDaysCountText.GetText())
		
		if days == 0:
			self.CreateShopDaysCountText.SetText(str(offlineshop.OFFLINESHOP_MAX_DAYS))
		
		else:
			self.CreateShopDaysCountText.SetText(str(days-1))
	
	
		
	def __OnClickCreateShopIncreaseHoursButton(self):
		hours = int(self.CreateShopHoursCountText.GetText())
		
		if hours == offlineshop.OFFLINESHOP_MAX_HOURS:
			self.CreateShopHoursCountText.SetText("0")
		
		else:
			self.CreateShopHoursCountText.SetText(str(hours+1))
	
	def __OnClickCreateShopDecreaseHoursButton(self):
		hours = int(self.CreateShopHoursCountText.GetText())
		
		if hours == 0:
			self.CreateShopHoursCountText.SetText(str(offlineshop.OFFLINESHOP_MAX_HOURS))
		
		else:
			self.CreateShopHoursCountText.SetText(str(hours-1))
	
	
	def __OnClickCloseButton(self):
		offlineshop.SendForceCloseShop()
	
	def __OnClickMyShopEditNameButton(self):
		self.MyShopEditNameDlg.inputValue.SetText("")
		self.MyShopEditNameDlg.Open()
	
	def __OnClickMyShopPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		offlineshop.SendOpenShopOwner()
		self.EnableRefreshSymbol()
	
	
	def __OnClickShopListPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		offlineshop.SendRequestShopList()
		self.EnableRefreshSymbol()


	def __OnClickShopSafeboxPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		offlineshop.SendSafeboxOpen()
		self.EnableRefreshSymbol()


	def __OnClickMyOffersPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		offlineshop.SendOfferListRequest()
		self.EnableRefreshSymbol()


	def __OnClickSearchFilterPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		self.pageCategory = "search_filter"
		for page in self.pageBoards.values():
			page.Hide()
		
		self.pageBoards["search_filter"].Show()
		if self.ShowGradeFilterButton and self.GradeFilterWindowSettings['state'] == 'hidden':
			self.ShowGradeFilterButton.Show()
			self.ShowGradeFilterButton.SetTop()
		
		if self.GradeFilterWindowSettings['state'] != 'hidden':
			self.GradeFilterWindow.Show()
		
		self.__UpdateAttachedWindows()
	
	
	def __OnSelectSearchFilterTypeComboBox(self, index):
		self.SearchFilterSubTypeComboBox.ClearItem()
		self.SearchFilterSubTypeComboBox.InsertItem(SUBTYPE_NOSET , localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
		
		if index == 0:
			self.SearchFilterTypeComboBoxIndex = 0
			self.SearchFilterTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
			self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
			self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET
			return
		
		self.SearchFilterTypeComboBoxIndex = index
		self.SearchFilterTypeComboBox.SetCurrentItem(self.ITEM_TYPES[index]['name'])
		
		if self.ITEM_TYPES.has_key(index) and self.ITEM_TYPES[index].has_key('subtypes'):
			for sub, name in self.ITEM_TYPES[index]['subtypes'].items():
				self.SearchFilterSubTypeComboBox.InsertItem(sub, name)
		
		else:
			self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
			self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET
	
	def __OnSelectSearchFilterSubTypeComboBox(self, index):
		if index == SUBTYPE_NOSET:
			self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
			self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET
			return
		
		self.SearchFilterSubTypeComboBoxIndex = index
		self.SearchFilterSubTypeComboBox.SetCurrentItem(self.ITEM_TYPES[self.SearchFilterTypeComboBoxIndex]['subtypes'][index])
	
	
	def __OnSelectSearchFilterGradeSelector(self, index):
		self.GradeFilterButtonSelect.SetText(self.RARITY_GRADES[index])
		self.GradeFilterSuggestionsIndex = index
		self.GradeFilterSuggestions.Hide()
	
	
	def __OnSelectSearchFilterSuggestionSelector(self, index):
		self.SearchFilterAttributeButtons[self.SearchFilterAttributeButtonIndex].SetText(self.ATTRIBUTES[index])
		self.SearchFilterAttributeSetting[self.SearchFilterAttributeButtonIndex] = index
		
		self.SearchFilterAttributeButtonIndex = -1
		self.SearchFilterSuggestionSelector.Hide()
		
	def __OnClickSearchFilterAttributeButton(self, index):
		if self.SearchFilterSuggestionSelector.IsShow():
			self.SearchFilterSuggestionSelector.Hide()
			self.SearchFilterAttributeButtonIndex = -1
		
		else:
			self.SearchFilterAttributeButtonIndex = index
			
			x,y = self.SearchFilterAttributeButtons[index].GetLocalPosition()
			y += self.SearchFilterAttributeButtons[index].GetHeight()
			
			self.SearchFilterSuggestionSelector.SetPosition(x,y)
			self.SearchFilterSuggestionSelector.Show()
	
	
	
	
	
	
	def __OnClickSearchHistoryPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		self.pageCategory = "search_history"

		for v in self.pageBoards.values():
			v.Hide()

		self.pageBoards["search_history"].Show()
		self.RefreshSearchHistoryPage()
		
		
	def __OnClickMyPatternsPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		for v in self.pageBoards.values():
			v.Hide()

		self.pageBoards["my_patterns"].Show()
		self.pageCategory = "my_patterns"
		self.RefreshMyPatternsPage()


	def __OnClickSearchPatternElement(self, element):
		info = element.GetInfo()
		self.__SetSearchFilterPattern(info)

		offlineshop.UpdateLastUseFilterPattern(info["id"])
		
	def __OnClickMyAuctionPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		offlineshop.SendAuctionOpenMy()
		self.EnableRefreshSymbol()
		self.__OnCheckCreateAuctionSlot()

	def __OnClickAuctionListPage(self):
		self.__OnChangePage()
		offlineshop.SendCloseBoard()
		offlineshop.SendAuctionListRequest()
		self.EnableRefreshSymbol()
	
	
	
	def __OnChangePage(self):
		if self.pageCategory == "search_filter":
			self.ShowGradeFilterButton.Hide()
			self.GradeFilterWindow.Hide()
			self.GradeFilterSuggestions.Hide()
			self.__UpdateAttachedWindows()
	
	
	
	def __OnClickCreateAuctionButton(self):
		if self.CreateAuctionWindowPos == -1:
			return

		if self.CreateAuctionSlotPos == -1:
			return


		daystext = self.CreateAuctionDaysInput.GetText()
		days = int(daystext) if daystext and daystext.isdigit() else 0

		if 0 == days or offlineshop.OFFLINESHOP_MAX_DAYS<days:
			self.__PopupMessage(localeinfo.OFFLINESHOP_CREATE_SHOP_INVALID_DURATION)
			return

		pricetext = self.CreateAuctionStartingPriceInput.GetText()
		price = long(pricetext) if pricetext and pricetext.isdigit() else 0

		if price <= 0:
			self.__PopupMessage(localeinfo.OFFLINESHOP_CREATE_AUCTION_INVALID_PRICE)
			return

		offlineshop.SendAuctionCreate(self.CreateAuctionWindowPos, self.CreateAuctionSlotPos, price, days*24*60)
		self.EnableRefreshSymbol()

	def __OnClickCreateAuctionDaysDecreaseButton(self):
		days = int(self.CreateAuctionDaysInput.GetText())
		if days ==0:
			self.CreateAuctionDaysInput.SetText(str(offlineshop.OFFLINESHOP_MAX_DAYS))
		else:
			self.CreateAuctionDaysInput.SetText(str(days-1))

	def __OnClickMyAuctionClose(self):
		offlineshop.CloseMyAuction()

	def __OnClickCreateAuctionDaysIncreaseButton(self):
		days = int(self.CreateAuctionDaysInput.GetText())
		if days == offlineshop.OFFLINESHOP_MAX_DAYS:
			self.CreateAuctionDaysInput.SetText("0")
		else:
			self.CreateAuctionDaysInput.SetText(str(days + 1))

	def __OnClickSearchFilterResetFilterButton(self):
		# combobox
		for k, v in self.SearchFilterCheckBoxes.items():
			v.Disable()

		# raceflags
		for v in self.SearchFilterCheckBoxesRace.values():
			v.Enable()

		# type/subtype
		self.SearchFilterTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
		self.SearchFilterTypeComboBoxIndex = 0
		self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
		self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET

		# name
		self.SearchFilterItemNameInput.SetText("")
		self.SearchFilterSuggestionObj.Clear()

		# level
		self.SearchFilterItemLevelStart.SetText("")
		self.SearchFilterItemLevelEnd.SetText("")

		# price
		self.SearchFilterItemYangMin.SetText("")
		self.SearchFilterItemYangMax.SetText("")

		# attributes
		for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM):
			self.SearchFilterAttributeButtons[x].SetText(localeinfo.OFFLINESHOP_ATTR_UNSET)
			self.SearchFilterAttributeSetting[x] = 0

		self.SearchFilterResultItemsTable.ClearElement()
		#offlineshop-updated 04/08/19
		self.__OnSelectSearchFilterTypeComboBox(0)
		self.__OnSelectSearchFilterSubTypeComboBox(SUBTYPE_NOSET)
	
	def __OnClickSearchFilterSavePatternButton(self):
		bActiveOne = False

		for v in self.SearchFilterCheckBoxes.values():
			if v.IsEnabled():
				bActiveOne = True
				break
				
		if self.GradeFilterWindow and self.GradeFilterWindow.IsShow() and self.GradeFilterCheckBox.IsEnabled():
			bActiveOne = True

		if not bActiveOne:
			self.__PopupMessage(localeinfo.OFFLINESHOP_NO_FILTER_ACTIVE_MESSAGE)
			return

		if not self.SearchPatternsInputNameDlg.IsShow():
			self.SearchPatternsInputNameDlg.inputValue.SetText("")
			self.SearchPatternsInputNameDlg.Open()

	
	def __OnClickSearchFilterStartSearch(self):
		bActiveOne = False
		
		for v in self.SearchFilterCheckBoxes.values():
			if v.IsEnabled():
				bActiveOne = True
				break
		
		if self.GradeFilterWindow and self.GradeFilterWindow.IsShow() and self.GradeFilterCheckBox.IsEnabled():
			bActiveOne = True
		
		if not bActiveOne:
			self.__PopupMessage(localeinfo.OFFLINESHOP_NO_FILTER_ACTIVE_MESSAGE)
			return

		if self.SearchFilterCheckBoxes["name"].IsEnabled():
			if not self.SearchFilterItemNameInput.GetText():
				self.__PopupMessage(localeinfo.OFFLINESHOP_SEARCH_FILTER_NAME_NOSET)
				return

		if self.SearchFilterCheckBoxes["price"].IsEnabled():
			if self.SearchFilterItemYangMin.GetText()=="0" and self.SearchFilterItemYangMax.GetText()=="0":
				self.__PopupMessage(localeinfo.OFFLINESHOP_SEARCH_PRICE_ERROR)
				return

		if self.SearchFilterCheckBoxes["level"].IsEnabled():
			if self.SearchFilterItemLevelStart.GetText() == "0" and self.SearchFilterItemLevelEnd.GetText() == "0":
				self.__PopupMessage(localeinfo.OFFLINESHOP_SEARCH_LEVEL_ERROR)
				return
		
		if self.GradeFilterWindow and self.GradeFilterCheckBox.IsEnabled():
			grade = self.GradeFilterSuggestionsIndex
			if grade == -1:
				self.__PopupMessage(localeinfo.OFFLINESHOP_SEARCH_RARITY_ERROR)
				return
		
		
		self.SearchFilterLastUsedSetting = self.GetSearchFilterSettings()
		offlineshop.SendFilterRequest(*self.SearchFilterLastUsedSetting)
		self.EnableRefreshSymbol()

	
	def __OnClickShowGradeFilterButton(self):
		self.GradeFilterWindowSettings['state'] = 'showing'
		self.ShowGradeFilterButton.Hide()
		self.GradeFilterWindow.Show()
		self.SetTop()
		
	
	def __OnClickGradeSelectButton(self):
		self.GradeFilterSuggestions.Show()
		self.GradeFilterSuggestions.SetTop()
		x,y = self.GradeFilterButtonSelect.GetGlobalPosition()
		self.GradeFilterSuggestions.SetPosition(x, y + 17)
	
	def __OnClickHideGradeFilterButton(self):
		self.GradeFilterWindowSettings['state'] = 'hiding'
		if self.GradeFilterSuggestions:
			self.GradeFilterSuggestions.Hide()
	
	
	def __OnClickFilterHistoryElement(self , element):
		info = element.GetInfo()
		self.__SetSearchFilterPattern(info)



	def __OnClickDeleteMyOfferButton(self, id):
		offer = None

		for element in self.MyOffersList:
			if element["offer_id"] == id:
				offer = element
				break

		if not offer:
			return

		accepttext = localeinfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_ACCEPT
		canceltext = localeinfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_CANCEL

		question   = localeinfo.OFFLINESHOP_CANCEL_OFFER_QUESTION

		self.MyOffersCancelOfferInfo = (offer['offer_id'], offer['owner_id'])
		self.__OpenQuestionDialog(len(question)*6 , accepttext, canceltext, self.__OnAcceptCancelOfferQuestion, self.__OnCancelCancelOfferQuestion, question)








	def __SetSearchFilterPattern(self, info):
		self.__OnClickSearchFilterPage()

		# combobox
		for k, v in self.SearchFilterCheckBoxes.items():
			v.Disable()

		# raceflags
		raceFlags = {
			"warrior" :item.ITEM_ANTIFLAG_WARRIOR,
			"assassin" :item.ITEM_ANTIFLAG_ASSASSIN,
			"sura" :item.ITEM_ANTIFLAG_SURA,
			"shaman": item.ITEM_ANTIFLAG_SHAMAN,
		}

		flag = info["filter_wearflag"]

		for k, v in raceFlags.items():
			if flag & v != 0:
				self.SearchFilterCheckBoxesRace[k].Disable()
				if not self.SearchFilterCheckBoxes["wear"].IsEnabled():
					self.SearchFilterCheckBoxes["wear"].Enable()

			else:
				self.SearchFilterCheckBoxesRace[k].Enable()

		# type/subtype
		if info["filter_type"] == 0:
			self.SearchFilterTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
			self.SearchFilterTypeComboBoxIndex = 0
			self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
			self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET

		else:
			if not self.SearchFilterCheckBoxes["type"].IsEnabled():
				self.SearchFilterCheckBoxes["type"].Enable()

			typeCategory = self.ITEM_TYPES[info["filter_type"]]
			self.SearchFilterTypeComboBox.SetCurrentItem(typeCategory["name"])
			self.SearchFilterTypeComboBoxIndex = info["filter_type"]

			subtype = info["filter_subtype"]
			if subtype != SUBTYPE_NOSET and typeCategory.has_key('subtypes'):
				self.SearchFilterSubTypeComboBox.SetCurrentItem(typeCategory['subtypes'][subtype])
				self.SearchFilterSubTypeComboBoxIndex = subtype
			else:
				self.SearchFilterSubTypeComboBox.SetCurrentItem(localeinfo.OFFLINESHOP_TYPE_COMBOBOX_NOSET)
				self.SearchFilterSubTypeComboBoxIndex = SUBTYPE_NOSET

		# name
		if info["filter_name"]:
			self.SearchFilterCheckBoxes["name"].Enable()
			self.SearchFilterItemNameInput.SetText(info["filter_name"])

		# level

		levelmin = info["level"]["start"]
		levelmax = info["level"]["end"]

		if levelmin != 0:
			self.SearchFilterCheckBoxes["level"].Enable()
			self.SearchFilterItemLevelStart.SetText(str(levelmin))
		if levelmax != 0:
			self.SearchFilterCheckBoxes["level"].Enable()
			self.SearchFilterItemLevelEnd.SetText(str(levelmax))

		# price
		yangmin = info["price"]["start"]
		yangmax = info["price"]["end"]

		if yangmin != 0:
			self.SearchFilterCheckBoxes["price"].Enable()
			self.SearchFilterItemYangMin.SetText(str(yangmin))
		if yangmax != 0:
			self.SearchFilterCheckBoxes["price"].Enable()
			self.SearchFilterItemYangMax.SetText(str(yangmax))
		
		#rarity
		rarity = info['rarity']
		
		if rarity == -1 or not rarity in self.RARITY_GRADES:
			if self.GradeFilterCheckBox and self.GradeFilterCheckBox.IsEnabled():
				self.GradeFilterCheckBox.Disable()
			if self.GradeFilterWindow and self.GradeFilterWindow.IsShow():
				self.__OnClickHideGradeFilterButton()
		else:
			if self.GradeFilterCheckBox and not self.GradeFilterCheckBox.IsEnabled():
				self.GradeFilterCheckBox.Enable()
			if self.GradeFilterButtonSelect:
				self.GradeFilterButtonSelect.SetText(self.RARITY_GRADES[rarity])
			if self.GradeFilterWindow and self.GradeFilterWindow.IsShow() == False:
				self.__OnClickShowGradeFilterButton()
			self.GradeFilterSuggestionsIndex = rarity
		

		# attributes
		attrs = info["attr"]["type"]
		attr_actived = [v for v in attrs if v != 0]

		for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM):
			self.SearchFilterAttributeButtons[x].SetText(localeinfo.OFFLINESHOP_ATTR_UNSET)
			self.SearchFilterAttributeSetting[x] = 0

		if attr_actived:
			self.SearchFilterCheckBoxes["attr"].Enable()
			idx = 0
			for attr in attr_actived:
				self.SearchFilterAttributeButtons[idx].SetText(self.ATTRIBUTES[attr])
				self.SearchFilterAttributeSetting[idx] = attr
				idx += 1

	def __PopupMessage(self, message):
		self.popupMessage.SetText(message)
		self.popupMessage.Open()


	def __OpenQuestionDialog(self , width, accepttext, canceltext, acceptevent, cancelevent, text):
		self.CommonQuestionDlg.SetAcceptText(accepttext)
		self.CommonQuestionDlg.SetCancelText(canceltext)
		self.CommonQuestionDlg.SAFE_SetAcceptEvent(acceptevent)
		self.CommonQuestionDlg.SAFE_SetCancelEvent(cancelevent)
		self.CommonQuestionDlg.SetText(text)
		self.CommonQuestionDlg.SetWidth(width)

		self.CommonQuestionDlg.Open()

	if ENABLE_CHEQUE_SYSTEM:
		def __OnPickValute(self, title, acceptEvent, maxValue, maxCheque, max=13):
			self.CommonPickValuteDlg.SetMax(max)
			self.CommonPickValuteDlg.SetTitleName(title)
			self.CommonPickValuteDlg.SetAcceptEvent(acceptEvent)
			self.CommonPickValuteDlg.Open(maxValue, maxCheque)

	
	else:
		def __OnPickValute(self, title, acceptEvent, maxValue, max=13):
			self.CommonPickValuteDlg.SetMax(max)
			self.CommonPickValuteDlg.SetTitleName(title)
			self.CommonPickValuteDlg.SetAcceptEvent(acceptEvent)
			self.CommonPickValuteDlg.Open(maxValue)
	
	
	
	def OnShowPage(self):
		showEvents = {
			"my_shop"		: self.__OnClickMyShopPage,
		}
		
		if self.pageCategory in showEvents:
			showEvents[self.pageCategory]()
	

	def BINARY_EnableRefreshSymbol(self):
		if self.IsShow():
			self.EnableRefreshSymbol()

	def EnableRefreshSymbol(self):
		self.RefreshSymbol.Show()
	
	
	def DisableRefreshSymbol(self):
		self.RefreshSymbol.Hide()

	
	
	def ShopListClear(self):
		self.ShopList = []



	def ShopListAddItem( self, owner_id, duration , count , name):
		newelement = {}
		newelement["owner_id"]		= owner_id
		newelement["duration"]		= duration
		newelement["count"]			= count
		newelement["name"]			= name
		
		self.ShopList.append(newelement)
	



	def ShopListShow(self):
		self.RefreshShopListPage()
		self.DisableRefreshSymbol()
	



	def OpenShop( self, owner_id, duration, count, name):
		self.ShopItemSold 		= []
		self.ShopItemForSale 	= []
		
		self.ShopOpenInfo["owner_id"]	= owner_id
		self.ShopOpenInfo["duration"]	= duration
		self.ShopOpenInfo["count"]		= count
		self.ShopOpenInfo["name"]		= name
		self.ShopOpenInfo["my_shop"]	= False
	
	
	def OpenShopItem_Alloc(self):
		self.ShopItemForSale.append({})
	
	
	def OpenShopItem_SetValue( self, key,	index,	*args):
		if key == "id":
			self.ShopItemForSale[index][key] = args[0]
		
		elif key == "vnum" or key == 'trans' or key == 'locked_attr':
			self.ShopItemForSale[index][key] = args[0]
		
		elif key == "count":
			self.ShopItemForSale[index][key] = args[0]

		elif key == "attr":
			if not key in self.ShopItemForSale[index]:
				self.ShopItemForSale[index][key] = {}
			
			attr_index = args[0]
			attr_type  = args[1]
			attr_value = args[2]
			
			self.ShopItemForSale[index][key][attr_index] = {}
			self.ShopItemForSale[index][key][attr_index]["type"]  = attr_type
			self.ShopItemForSale[index][key][attr_index]["value"] = attr_value
		
		elif key == "socket":
			if not key in self.ShopItemForSale[index]:
				self.ShopItemForSale[index][key] = {}
			
			socket_index = args[0]
			socket_val	 = args[1]
			
			self.ShopItemForSale[index][key][socket_index] = socket_val
		
		elif key == "price" or key == 'cheque':
			self.ShopItemForSale[index][key] = args[0]
	
	
	def OpenShop_End(self):
		self.RefreshOpenShopPage()
		self.DisableRefreshSymbol()

		if not self.IsShow():
			self.Show()

	
	def OpenShopOwner_Start( self, owner_id, duration , count , name):
		self.ShopItemSold 		= []
		self.ShopItemForSale 	= []
		self.MyShopOffers		= []
		
		
		self.ShopOpenInfo["owner_id"]	= owner_id
		self.ShopOpenInfo["duration"]	= duration
		self.ShopOpenInfo["count"]		= count
		self.ShopOpenInfo["name"]		= name
		self.ShopOpenInfo["my_shop"]	= True
	
	def OpenShopOwner_End(self):
		self.DisableRefreshSymbol()
		self.RefreshMyShopPage()

		if not self.IsShow():
			self.Show()
	
	def OpenShopOwnerItem_Alloc(self):
		self.ShopItemForSale.append({})
	
	def OpenShopOwnerItem_SetValue( self, key, index, *args):
		if key == "id":
			self.ShopItemForSale[index][key] = args[0]
		
		elif key == "vnum" or key == 'trans' or key == 'locked_attr':
			self.ShopItemForSale[index][key] = args[0]
		
		elif key == "count":
			self.ShopItemForSale[index][key] = args[0]
		
		elif key == "attr":
			if not key in self.ShopItemForSale[index]:
				self.ShopItemForSale[index][key] = {}
			
			attr_index = args[0]
			attr_type  = args[1]
			attr_value = args[2]
			
			self.ShopItemForSale[index][key][attr_index] = {}
			self.ShopItemForSale[index][key][attr_index]["type"]  = attr_type
			self.ShopItemForSale[index][key][attr_index]["value"] = attr_value
		
		elif key == "socket":
			if not key in self.ShopItemForSale[index]:
				self.ShopItemForSale[index][key] = {}
			
			socket_index = args[0]
			socket_val	 = args[1]
			
			self.ShopItemForSale[index][key][socket_index] = socket_val
		
		elif key == "price" or key == 'cheque':
			self.ShopItemForSale[index][key] = args[0]

	def OpenShopOwner_SetOffer(self, itemid , buyerid, offerid, price, is_accept, buyer_name ):
		newoffer = {}
		newoffer["id"] 			= offerid
		newoffer["item_id"]		= itemid
		newoffer["buyer_id"]	= buyerid
		newoffer["price"]		= price
		newoffer["is_accept"]	= is_accept
		newoffer['buyer_name']  = buyer_name

		self.MyShopOffers.append(newoffer)

	def OpenShopOwnerItemSold_Alloc( self ):
		self.ShopItemSold.append({})
	
	def OpenShopOwnerItemSold_SetValue( self,  key , index , *args):
		if key == "id":
			self.ShopItemSold[index][key] = args[0]
		
		elif key == "vnum" or key == 'trans' or key == 'locked_attr':
			self.ShopItemSold[index][key] = args[0]
		
		elif key == "count":
			self.ShopItemSold[index][key] = args[0]
		
		elif key == "attr":
			if not key in self.ShopItemSold[index]:
				self.ShopItemSold[index][key] = {}
			
			attr_index = args[0]
			attr_type  = args[1]
			attr_value = args[2]
			
			self.ShopItemSold[index][key][attr_index] = {}
			self.ShopItemSold[index][key][attr_index]["type"]  = attr_type
			self.ShopItemSold[index][key][attr_index]["value"] = attr_value
		
		elif key == "socket":
			if not key in self.ShopItemSold[index]:
				self.ShopItemSold[index][key] = {}
			
			socket_index = args[0]
			socket_val	 = args[1]
			
			self.ShopItemSold[index][key][socket_index] = socket_val
		
		elif key == "price" or key == 'cheque':
			self.ShopItemSold[index][key] = args[0]
	
	def OpenShopOwnerItemSold_Show( self):
		pass
	
	
	def OpenShopOwnerNoShop(self):
		for v in self.pageBoards.values():
			v.Hide()
		
		self.pageBoards["create_shop"].Show()
		self.pageCategory = "create_shop"

		self.DisableRefreshSymbol()
		self.__ResetCreateShopPage()
	
	
	
	
	
	def ClearItemNames(self):
		self.SearchFilterItemsNameDict = {}
	
	
	def AppendItemName(self, vnum, name):
		self.SearchFilterItemsNameDict[name] = vnum
	
	
	def ShopClose( self):
		pass
	
	
	def ShopFilterResult( self , size):
		self.SearchFilterShopItemResult = []
	
	def ShopFilterResultItem_Alloc(self):
		self.SearchFilterShopItemResult.append({})
	
	
	def ShopFilterResultItem_SetValue( self,  key, index, *args):
		if key in ( "id", "vnum", "count", "price", "owner", 'trans', 'cheque', 'locked_attr'):
			self.SearchFilterShopItemResult[index][key] = args[0]
		
		elif key == "attr":
			if not key in self.SearchFilterShopItemResult[index]:
				self.SearchFilterShopItemResult[index][key] = {}
			
			attr_index = args[0]
			attr_type  = args[1]
			attr_value = args[2]
			
			self.SearchFilterShopItemResult[index][key][attr_index] = {}
			self.SearchFilterShopItemResult[index][key][attr_index]["type"]  = attr_type
			self.SearchFilterShopItemResult[index][key][attr_index]["value"] = attr_value
		
		elif key == "socket":
			if not key in self.SearchFilterShopItemResult[index]:
				self.SearchFilterShopItemResult[index][key] = {}
			
			socket_index = args[0]
			socket_val	 = args[1]
			
			self.SearchFilterShopItemResult[index][key][socket_index] = socket_val
		
		
	
	
	def ShopFilterResult_Show(self):
		self.SearchFilterResultItemsTable.ClearElement()
		
		for info in self.SearchFilterShopItemResult:
			slot = Slot()
			slot.SetInfo(info)
			slot.SetIndex((info["id"], info["owner"]))
			slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickSearchFilterShopResultItem)
			slot.Show()
			
			self.SearchFilterResultItemsTable.AddElement(slot)

		if len(self.SearchFilterShopItemResult) == SEARCH_RESULT_LIMIT:
			self.__PopupMessage(localeinfo.OFFLINESHOP_SEARCH_RISE_LIMIT%SEARCH_RESULT_LIMIT)

		setting = self.GetSearchFilterSettings()
		setting = (len(self.SearchFilterShopItemResult),) + setting

		offlineshop.AppendNewFilterHistory(*setting)
		self.DisableRefreshSymbol()
	
	def OfferReceived( self, offer_id , notified, accepted, owner_id, offerer_id, item_id, yang):
		pass
	
	def OfferAccept( self, offer_id , notified, accepted, owner_id, offerer_id, item_id, yang):
		pass
	
	
	def ClearFilterHistory(self):
		self.FilterHistory = []
	
	def AllocFilterHistory( self):
		self.FilterHistory.append({'id' : len(self.FilterHistory)})
	
	def SetFilterHistoryValue( self, key, *args):
		elm = self.FilterHistory[-1]
		
		if key == "datetime":
			elm["minute"]	= args[0]
			elm["hour"]		= args[1]
			elm["day"]		= args[2]
			elm["month"]	= args[3]
			elm["year"]		= args[4]
		
		elif key in ('count' , 'filter_type' , 'filter_subtype', 'filter_name' ,'filter_wearflag','rarity'):
			elm[key] = args[0]
		
		elif key in ('filter_price_yang_start', 'filter_price_yang_end'):
			if not 'price' in elm:
				elm['price'] = {}
			
			elm['price'][key.replace('filter_price_yang_', '')] = args[0]		
		
		elif key in ('filter_level_start', 'filter_level_end'):
			if not 'level' in elm:
				elm['level'] = {}
			
			elm['level'][key.replace('filter_level_', '')] = args[0]		
		
		elif key in ('filter_attr_type' , 'filter_attr_value'):
			if not 'attr' in elm:
				elm['attr'] = {}
				elm['attr']['type']  = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
				elm['attr']['value'] = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
			
			elm['attr'][key.replace('filter_attr_', '')][args[0]] = args[1]


	
	def ClearFilterPatterns( self):
		self.FilterPatterns = {}
	
	def AllocFilterPattern( self , id):
		self.FilterPatterns[id] = {"id": id,}
	
	def SetFilterPatternValue( self, key, idx, *args):
		elm = self.FilterPatterns[idx]
		
		if key == "datetime":
			elm["minute"]	= args[0]
			elm["hour"]		= args[1]
			elm["day"]		= args[2]
			elm["month"]	= args[3]
			elm["year"]		= args[4]
		
		elif key in ('filter_type' , 'filter_subtype', 'filter_name' ,'filter_wearflag', 'name', 'rarity'):
			elm[key] = args[0]
		
		
		elif key in ('filter_price_yang_start', 'filter_price_yang_end'):
			if not 'price' in elm:
				elm['price'] = {}
			
			elm['price'][key.replace('filter_price_yang_', '')] = args[0]
		
		
		elif key in ('filter_level_start', 'filter_level_end'):
			if not 'level' in elm:
				elm['level'] = {}
			
			elm['level'][key.replace('filter_level_', '')] = args[0]
		
		
		elif key in ('filter_attr_type' , 'filter_attr_value'):
			if not 'attr' in elm:
				elm['attr'] = {}
				elm['attr']['type']  = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
				elm['attr']['value'] = [0 for x in xrange(offlineshop.FILTER_ATTRIBUTE_NUM)]
			
			elm['attr'][key.replace('filter_attr_', '')][args[0]] = args[1]
	
	
	def GetSearchFilterSettings(self):
		name		= ""
		raceflag	= 0
		type		= 0
		subtype		= SUBTYPE_NOSET
		levelmin	= 0
		levelmax	= 0
		
		yangmin		= 0
		yangmax		= 0
		rarity		= -1
		attributes	= tuple([(0,0) for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM)])
		
		
		
		if self.SearchFilterCheckBoxes["name"].IsEnabled():
			name = self.SearchFilterItemNameInput.GetText()
		
		if self.SearchFilterCheckBoxes["type"].IsEnabled():
			type	= self.SearchFilterTypeComboBoxIndex
			subtype = self.SearchFilterSubTypeComboBoxIndex
		
		if self.SearchFilterCheckBoxes["price"].IsEnabled():
			yangminst 	= self.SearchFilterItemYangMin.GetText()
			yangmaxst 	= self.SearchFilterItemYangMax.GetText()
			
			if yangminst and yangminst.isdigit():
				yangmin = long(yangminst)
			if yangmaxst and yangmaxst.isdigit():
				yangmax = long(yangmaxst)
		
		if self.SearchFilterCheckBoxes["level"].IsEnabled():
			levelminst = self.SearchFilterItemLevelStart.GetText()
			levelmaxst = self.SearchFilterItemLevelEnd.GetText()
			
			if levelminst and levelminst.isdigit():
				levelmin = int(levelminst)
			if levelmaxst and levelmaxst.isdigit():
				levelmax = int(levelmaxst)
		
		
		if self.SearchFilterCheckBoxes["wear"].IsEnabled():
			raceFlagDct = {
				"warrior"	: item.ITEM_ANTIFLAG_WARRIOR,
				"assassin"	: item.ITEM_ANTIFLAG_ASSASSIN,
				"sura" 		: item.ITEM_ANTIFLAG_SURA,
				"shaman" 	: item.ITEM_ANTIFLAG_SHAMAN,
			}
			
			if ENABLE_WOLFMAN_CHARACTER:
				raceFlagDct.update({
					"wolfman" : item.ITEM_ANTIFLAG_WOLFMAN,
				})
			
			
			for k,v in raceFlagDct.items():
				if not self.SearchFilterCheckBoxesRace[k].IsEnabled():
					raceflag |= v
			
			
		if self.SearchFilterCheckBoxes["attr"].IsEnabled():
			attributes = tuple([(self.SearchFilterAttributeSetting[x],0) for x in xrange(player.ATTRIBUTE_SLOT_NORM_NUM)])
		
		if self.GradeFilterWindow and self.GradeFilterWindow.IsShow() and self.GradeFilterCheckBox.IsEnabled():
			rarity = self.GradeFilterSuggestionsIndex
		
		
		return (type, subtype, name, (yangmin,yangmax), (levelmin, levelmax), raceflag, attributes, rarity)



	def __IsSaleableSlot(self, win , pos):
		if win == player.INVENTORY:
			if player.IsEquipmentSlot(pos):
				return False

		if self.pageCategory in ("create_shop", "my_shop" ) and self.IsForSaleSlot(win, pos):
			return False

		if self.pageCategory == "create_auction" and self.IsForAuctionSlot(win,pos):
			return False

		
		try:
			if app.ENABLE_EXTRA_INVENTORY:
				if not win in (player.INVENTORY, player.DRAGON_SOUL_INVENTORY, player.EXTRA_INVENTORY):
					return False
			else:
				if not win in (player.INVENTORY, player.DRAGON_SOUL_INVENTORY):
					return False
		
		except:
			if not win in (player.INVENTORY, player.DRAGON_SOUL_INVENTORY):
				return False
		
		try:
			if ENABLE_SOULBIND_SYSTEM:
				itemSealDate = player.GetItemSealDate(win, pos)
				if itemSealDate != item.E_SEAL_DATE_DEFAULT_TIMESTAMP:
					return False
		except:
			pass

		itemIndex = player.GetItemIndex(win,pos)
		if itemIndex == 0:
			return False


		item.SelectItem(itemIndex)
		if item.IsAntiFlag(item.ITEM_ANTIFLAG_MYSHOP) or item.IsAntiFlag(item.ITEM_ANTIFLAG_GIVE):
			return False


		return True


	def ShopBuilding_AddInventoryItem(self, slot):
		if player.GetItemIndex(player.INVENTORY, slot) ==0:
			return

		if player.IsEquipmentSlot(slot):
			return

		if self.IsForSaleSlot(player.INVENTORY,slot):
			return
		
		if self.__IsSaleableSlot(player.INVENTORY, slot):
			self.OpenInsertPriceDialog(player.INVENTORY,slot)


	def ShopBuilding_AddItem(self, win, pos):
		if self.__IsSaleableSlot(win, pos):
			self.OpenInsertPriceDialog(win,pos)



	def AuctionBuilding_AddInventoryItem(self, slot):
		if player.GetItemIndex(player.INVENTORY, slot) ==0:
			return

		if player.IsEquipmentSlot(slot):
			return

		if self.IsForAuctionSlot(player.INVENTORY, slot):
			return

		self.__OnSetCreateAuctionSlot(player.INVENTORY, slot)


	def AuctionBuilding_AddItem(self, win, pos):
		if self.__IsSaleableSlot(win, pos):
			self.__OnSetCreateAuctionSlot(win, pos)

	def SearchFilter_BuyFromSearch(self, ownerid, itemid): #patchme
		if self.pageCategory != 'search_filter':
			return

		for item in self.SearchFilterShopItemResult:
			if item['id'] == itemid and item['owner'] == ownerid:
				self.SearchFilterShopItemResult.remove(item)
				break

		self.SearchFilterResultItemsTable.ClearElement()

		for info in self.SearchFilterShopItemResult:
			slot = Slot()
			slot.SetInfo(info)
			slot.SetIndex((info["id"], info["owner"]))
			slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickSearchFilterShopResultItem)
			slot.Show()

			self.SearchFilterResultItemsTable.AddElement(slot)


	def ShopSafebox_Clear(self):
		self.ShopSafeboxItems = []
		self.ShopSafeboxItemsTable.ClearElement()


	if ENABLE_CHEQUE_SYSTEM:
		def ShopSafebox_SetValutes(self, yang, cheque):
			self.ShopSafeboxValuteAmount = (yang, cheque)
			self.ShopSafeboxValuteText.SetText(localeinfo.NumberToMoneyString(yang))
			self.ShopSafeboxValuteTextCheque.SetText(localeinfo.NumberToChequeString(cheque))
	else:
		def ShopSafebox_SetValutes(self, yang):
			self.ShopSafeboxValuteAmount = yang
			self.ShopSafeboxValuteText.SetText(localeinfo.NumberToMoneyString(yang))

	def ShopSafebox_AllocItem(self):
		self.ShopSafeboxItems.append({})

	def ShopSafebox_SetValue(self, key , *args):
		elm = self.ShopSafeboxItems[-1]

		if key in ("id", "vnum", "count", 'trans', 'cheque', 'locked_attr'):
			elm[key] = args[0]

		elif key == "socket":
			if not key in elm:
				elm[key] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
			elm[key][args[0]] = args[1]

		elif key in ("attr_type", "attr_value"):
			if not 'attr' in elm:
				elm['attr'] = {}

			if not args[0] in elm['attr']:
				elm['attr'][args[0]] = {}

			elm['attr'][args[0]][key.replace('attr_','')] = args[1]

	def ShopSafebox_RefreshEnd(self):
		for item in self.ShopSafeboxItems:
			slot = Slot()
			slot.SetIndex(item["id"])
			slot.SetInfo(item)
			slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickShopSafeboxItem)
			slot.Show()

			self.ShopSafeboxItemsTable.AddElement(slot)

		if not self.pageBoards["shop_safebox"].IsShow():
			self.pageCategory = "shop_safebox"

			for page in self.pageBoards.values():
				page.Hide()

			self.pageBoards["shop_safebox"].Show()

		self.DisableRefreshSymbol()



	def OfferList_Clear(self):
		self.MyOffersList = []

	def OfferList_AddOffer(self , shopname, offer_id, buyer_id, owner_id, item_id, yang, is_notified, is_accept):
		self.MyOffersList.append({})
		elm = self.MyOffersList[-1]

		if '@' in shopname:
			shopname = shopname[shopname.find('@') + 1:]

		elm["shop_name"] 	= shopname
		elm["offer_id"]		= offer_id
		elm["buyer_id"]		= buyer_id
		elm["owner_id"]		= owner_id
		elm["item_id"]		= item_id
		elm["price"]		= yang
		elm["is_notified"]	= is_notified
		elm["is_accept"]	= is_accept

	def	OfferList_ItemSetValue(self, key , *args):
		offer = self.MyOffersList[-1]
		if not offer.has_key('item'):
			offer['item']={}

		elm = offer['item']

		if key in ("id", "vnum", "count", "owner", "price", 'trans', 'locked_attr'):
			elm[key] = args[0]

		elif key == "socket":
			if not key in elm:
				elm[key] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]
			elm[key][args[0]] = args[1]

		elif key in ("attr_type", "attr_value"):
			if not 'attr' in elm:
				elm['attr'] = {}

			if not args[0] in elm['attr']:
				elm['attr'][args[0]] = {}

			elm['attr'][args[0]][key.replace('attr_','')] = args[1]

	def OfferList_End(self):
		self.RefreshMyOffersPage()
		self.DisableRefreshSymbol()


	def AuctionList_Clear(self):
		self.AuctionListInfo = []
		self.AuctionListTable.ClearElement()

	def AuctionList_Alloc(self):
		self.AuctionListInfo.append({"item":{},})

	def AuctionList_SetInto(self, ownerid, owner_name, duration, init_yang, best_yang, offer_count):
		elm = self.AuctionListInfo[-1]

		info = {
			"owner_id" 		: ownerid,
			"owner_name"	: owner_name,
			"duration"		: duration,
			"init_yang"		: init_yang,
			"best_yang"		: best_yang,
			"offer_count"	: offer_count,
		}

		for k,v in info.items():
			elm[k] = v



	def AuctionList_SetItemInfo(self, vnum, count, *args):
		elm = self.AuctionListInfo[-1]['item']
		elm['count'] 	= count
		elm['vnum']		= vnum

		try:
			if ENABLE_CHANGELOOK_SYSTEM and len(args) !=0 :
				elm['trans'] = args[0]
		except:
			pass

	if app.ATTR_LOCK:
		def AuctionList_SetItemLockedAttr(self, attr):
			elm = self.AuctionListInfo[-1]['item']
			elm['locked_attr'] = attr


	def AuctionList_SetItemSocket(self, index, value):
		elm = self.AuctionListInfo[-1]['item']
		if not 'socket' in elm:
			elm['socket'] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]

		elm['socket'][index] = value

	def AuctionList_SetItemAttribute(self, key, index, value):
		elm = self.AuctionListInfo[-1]['item']
		if not 'attr' in elm:
			elm['attr'] = [{'type' :0, 'value': 0,} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
		elm['attr'][index][key] = value


	def AuctionList_End(self):
		self.RefreshAuctionListPage()
		self.DisableRefreshSymbol()

	def AuctionList_End_Owner(self):
		self.RefreshAuctionListPage()
		self.CreateAuctionWindowPos =-1
		self.CreateAuctionSlotPos=-1
		self.CreateAuctionDaysInput.SetText("0")
		self.CreateAuctionStartingPriceInput.SetText("")
		self.__MakeCreateAuctionSlot()
		self.MyAuction_NoAuction()


	def MyAuction_Clear(self):
		self.MyAuctionInfo = {'item':{},}


	def MyAuction_SetInto(self, owner_id, owner_name, duration, init_yang):
		info = {
			"owner_id" 		: owner_id,
			"owner_name"	: owner_name,
			"duration"		: duration,
			"init_yang"		: init_yang,
		}

		for k ,v in info.items():
			self.MyAuctionInfo[k] = v


	def MyAuction_SetItemInfo(self, vnum, count, *args):
		elm = self.MyAuctionInfo['item']
		elm['vnum']  = vnum
		elm['count'] = count

		try:
			if ENABLE_CHANGELOOK_SYSTEM and len(args)>0:
				elm['trans'] = args[0]
		except:
			pass
	
	if app.ATTR_LOCK:
		def MyAuction_SetItemLockedAttr(self, attr):
			elm = self.MyAuctionInfo['item']
			elm['locked_attr'] = attr

	def MyAuction_SetItemSocket(self, index , value):
		elm = self.MyAuctionInfo['item']
		if not 'socket' in elm:
			elm['socket'] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]

		elm['socket'][index] = value

	def MyAuction_SetItemAttribute(self, key , index , value):
		elm = self.MyAuctionInfo['item']
		if not 'attr' in elm:
			elm['attr'] = [{'type' :0, 'value': 0,} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
		elm['attr'][index][key] = value


	def MyAuction_AddOffer(self, buyer_id, buyer_name, owner_id, price_yang):
		if not 'offers' in self.MyAuctionInfo:
			self.MyAuctionInfo['offers'] = []

		new = {}
		new['buyer_name'] = buyer_name
		new['price_yang'] = price_yang

		self.MyAuctionInfo['offers'].append(new)



	def MyAuction_End(self):
		self.RefreshMyAuctionPage()
		self.DisableRefreshSymbol()



	def OpenAuction_Clear(self):
		self.OpenAuctionInfo = {'item':{},}


	def OpenAuction_SetInto(self, owner_id, owner_name, duration, init_yang):
		info = {
			"owner_id" 		: owner_id,
			"owner_name"	: owner_name,
			"duration"		: duration,
			"init_yang"		: init_yang,
		}

		for k ,v in info.items():
			self.OpenAuctionInfo[k] = v
	
	if app.ATTR_LOCK:
		def OpenAuction_SetItemLockedAttr(self, attr):
			elm = self.OpenAuctionInfo['item']
			elm['locked_attr'] = attr

	def OpenAuction_SetItemInfo(self, vnum, count, *args):
		elm = self.OpenAuctionInfo['item']
		elm['vnum']  = vnum
		elm['count'] = count

		try:
			if ENABLE_CHANGELOOK_SYSTEM and len(args!=0):
				elm['trans'] = args[0]
		except:
			pass


	def OpenAuction_SetItemSocket(self, index , value):
		elm = self.OpenAuctionInfo['item']
		if not 'socket' in elm:
			elm['socket'] = [0 for x in xrange(player.METIN_SOCKET_MAX_NUM)]

		elm['socket'][index] = value

	def OpenAuction_SetItemAttribute(self, key , index , value):
		elm = self.OpenAuctionInfo['item']
		if not 'attr' in elm:
			elm['attr'] = [{'type' :0, 'value': 0,} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
		elm['attr'][index][key] = value


	def OpenAuction_AddOffer(self, buyer_id, buyer_name, owner_id, price_yang):
		if not 'offers' in self.OpenAuctionInfo:
			self.OpenAuctionInfo['offers'] = []

		new = {}
		new['buyer_name'] = buyer_name
		new['price_yang'] = price_yang

		self.OpenAuctionInfo['offers'].append(new)



	def OpenAuction_End(self):
		self.RefreshOpenAuctionPage()
		self.DisableRefreshSymbol()

	def MyAuction_NoAuction(self):
		self.pageCategory = "create_auction"
		for page in self.pageBoards.values():
			page.Hide()

		self.pageBoards['create_auction'].Show()
		self.DisableRefreshSymbol()


	def OpenInsertPriceDialog(self, win, slot):
		self.AddItemSlotIndex = (win,slot)
		self.CommonInputPriceDlg.Open()
	
	def __OnAcceptMyShopAcceptOffer(self):
		offlineshop.SendOfferAccept(self.MyShopAcceptOfferID)
		self.CommonQuestionDlg.Hide()
		self.MyShopAcceptOfferID = -1


	def __OnCancelMyShopAcceptOffer(self):
		self.CommonQuestionDlg.Hide()
		self.MyShopAcceptOfferID = -1

	def __OnAcceptMyShopCancelOffer(self):
		offlineshop.SendOfferCancel(self.MyShopCancelOfferID, self.ShopOpenInfo['owner_id'])
		self.CommonQuestionDlg.Hide()
		self.MyShopCancelOfferID = -1

	def __OnCancelMyShopCancelOffer(self):
		self.CommonQuestionDlg.Hide()
		self.MyShopCancelOfferID = -1




	def __OnCancelCancelOfferQuestion(self):
		self.CommonQuestionDlg.Hide()
		self.MyOffersCancelOfferInfo = []


	def __OnAcceptCancelOfferQuestion(self):
		info = self.MyOffersCancelOfferInfo
		offlineshop.SendOfferCancel(info[0], info[1])

		self.CommonQuestionDlg.Hide()
		self.MyOffersCancelOfferInfo = []

	def __OnAcceptInputPrice(self):
		yang = self.CommonInputPriceDlg.GetText()
		if not yang.isdigit():
			return
		
		yang = int(yang)
		if not ENABLE_CHEQUE_SYSTEM:
			if yang == 0:
				return
		
		if ENABLE_CHEQUE_SYSTEM:
			cheque = self.CommonInputPriceDlg.GetChequeText()
			if cheque.isdigit():
				cheque = int(cheque)
			else:
				cheque = 0
		
		
			if yang == 0 and cheque == 0:
				return
		
		
		if self.pageCategory == "create_shop" and self.AddItemSlotIndex != -1:
			slot = Slot()
			slot.SetIndex(self.AddItemSlotIndex)
			if ENABLE_CHEQUE_SYSTEM:
				slot.SetInfo(MakeSlotInfo(self.AddItemSlotIndex[0] , self.AddItemSlotIndex[1], yang, cheque))
			else:
				slot.SetInfo(MakeSlotInfo(self.AddItemSlotIndex[0] , self.AddItemSlotIndex[1], yang))
			slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickInsertedItem)
			slot.Show()
			
			self.CreateShopItemsTable.AddElement(slot)
			self.CreateShopItemsInfos[slot.GetIndex()] = slot.GetInfo()
			self.CommonInputPriceDlg.Hide()
			
			# if self.HowToInsertItemText.IsShow():
			# 	self.HowToInsertItemText.Hide()
			
			self.AddItemSlotIndex = -1
		
		
		elif self.pageCategory == "create_shop" and self.EditPriceSlot != None:
			slot  = self.EditPriceSlot
			index = slot.GetIndex()
			
			info 			= slot.GetInfo()
			info["price"] 	= yang
			if ENABLE_CHEQUE_SYSTEM:
				info['cheque'] = cheque
			self.CreateShopItemsInfos[slot.GetIndex()] = info
			self.EditPriceSlot = None
			self.CommonInputPriceDlg.Hide()
		
		
		elif self.pageCategory == "my_shop" and self.AddItemSlotIndex != -1:
			if ENABLE_CHEQUE_SYSTEM:
				offlineshop.SendAddItem(self.AddItemSlotIndex[0],  self.AddItemSlotIndex[1],  yang, cheque)
			else:
				offlineshop.SendAddItem(self.AddItemSlotIndex[0],  self.AddItemSlotIndex[1],  yang)
			self.AddItemSlotIndex = -1
			self.CommonInputPriceDlg.Hide()
		
		elif self.pageCategory == "my_shop" and self.EditPriceSlot != None:
			slot  = self.EditPriceSlot
			index = slot.GetIndex()
			if ENABLE_CHEQUE_SYSTEM:
				offlineshop.SendEditItem(index, yang, cheque)
			else:
				offlineshop.SendEditItem(index, yang)
			self.CommonInputPriceDlg.Hide()
			self.EditPriceSlot = None
	
	def __OnCancelInputPrice(self):
		self.CommonInputPriceDlg.Hide()
		self.AddItemSlotIndex 	= -1
		self.EditPriceSlot		= None
	
	
	
	def __OnAcceptOpenShopBuyItemQuestion(self):
		self.CommonQuestionDlg.Hide()
		offlineshop.SendBuyItem(self.ShopOpenInfo["owner_id"], self.OpenShopBuyItemID, self.BuyPriceSeenTotal)
		import chat
		chat.AppendChat(1, "%s %s %s" % (self.ShopOpenInfo["owner_id"], self.OpenShopBuyItemID, str(self.BuyPriceSeenTotal)))
		self.OpenShopBuyItemID = -1

	
	def __OnCancelOpenShopBuyItemQuestion(self):
		self.CommonQuestionDlg.Hide()
		self.OpenShopBuyItemID = -1

	def __OnAcceptSearchFilterBuyItemQuestion(self):
		id,owner = self.SearchFilterResultClickedInfo
		offlineshop.SendBuyItemFromSearch(owner, id, self.BuyPriceSeenTotal)
		self.CommonQuestionDlg.Hide()
		self.SearchFilterResultClickedInfo = []

	def __OnCancelSearchFilterBuyItemQuestion(self):
		self.CommonQuestionDlg.Hide()
		self.SearchFilterResultClickedInfo = []

	def __OnAcceptChangeShopNameDlg(self):
		newname = self.MyShopEditNameDlg.GetText()
		self.MyShopEditNameDlg.Hide()
		
		offlineshop.SendChangeName(newname)
	
	def __OnCancelChangeShopNameDlg(self):
		self.MyShopEditNameDlg.Hide()


	def __OnAcceptMyPatternInputName(self):
		name = self.SearchPatternsInputNameDlg.GetText()
		self.SearchPatternsInputNameDlg.Hide()
		if name:
			setting = self.GetSearchFilterSettings()
			setting = (name,) + setting
			offlineshop.AppendNewFilterPattern(*setting)
			self.__PopupMessage(localeinfo.OFFLINESHOP_PATTERN_SAVED_SUCCESS)

	def __OnCancelMyPatternInputName(self):
		self.SearchPatternsInputNameDlg.Hide()


	def __OnAcceptShopSafeboxGetItemQuestion(self):
		self.CommonQuestionDlg.Hide()
		offlineshop.SendSafeboxGetItem(self.ShopSafeboxGetItemIndex)
		self.ShopSafeboxGetItemIndex = -1



	def __OnCancelShopSafeboxGetItemQuestion(self):
		self.CommonQuestionDlg.Hide()
		self.ShopSafeboxGetItemIndex = -1


	if ENABLE_CHEQUE_SYSTEM:
		def __OnAcceptShopSafeboxGetValuteInput(self , yang, cheque):
			offlineshop.SendSafeboxGetValutes(yang, cheque)
	else:
		def __OnAcceptShopSafeboxGetValuteInput(self , yang):
			offlineshop.SendSafeboxGetValutes(yang)

	if ENABLE_CHEQUE_SYSTEM:
		def __OnAcceptMakeOffer(self, yang,  cheque):
			offlineshop.SendOfferCreate(self.MakeOfferOwnerID, self.MakeOfferItemID, yang, cheque)
			self.MakeOfferOwnerID 	= -1
			self.MakeOfferItemID	= -1
	else:
		def __OnAcceptMakeOffer(self, yang):
			offlineshop.SendOfferCreate(self.MakeOfferOwnerID, self.MakeOfferItemID, yang)
			self.MakeOfferOwnerID 	= -1
			self.MakeOfferItemID	= -1

	def __OnClickCreateShopButton(self):
		
		
		
		
		
		
		shopname = self.CreateShopNameEdit.GetText()
		if not shopname:
			self.__PopupMessage(localeinfo.OFFLINESHOP_CREATE_SHOP_NO_NAME_INSERTED)
			return
		
		days  = int(self.CreateShopDaysCountText.GetText())
		hours = int(self.CreateShopHoursCountText.GetText())
		
		totaltime = days * 24 * 60
		totaltime += hours * 60
		
		if totaltime > offlineshop.OFFLINESHOP_MAX_MINUTES or totaltime <= 0:
			self.__PopupMessage(localeinfo.OFFLINESHOP_CREATE_SHOP_INVALID_DURATION)
			return
		
		elements = self.CreateShopItemsTable.GetElementDict()
		if not elements:
			self.__PopupMessage(localeinfo.OFFLINESHOP_CREATE_SHOP_NO_ITEMS_INSERTED)
			return
		
		itemLst = []
		
		for dct in elements.values():
			for item in dct.values():
				info = item.GetInfo()
				
				if ENABLE_CHEQUE_SYSTEM:
					tupleinfo = (info["window"], info["slot"] , info["price"] , info.get('cheque', 0))
				else:
					tupleinfo = (info["window"], info["slot"] , info["price"] )
				itemLst.append(tupleinfo)
		itemTuple = tuple(itemLst)
		if app.KASMIR_PAKET_SYSTEM:
			offlineshop.SendShopCreate(shopname, totaltime, self.KasmirNpc, itemTuple)
		else:
			offlineshop.SendShopCreate(shopname, totaltime, itemTuple)
		
		self.EnableRefreshSymbol()

	if app.KASMIR_PAKET_SYSTEM:
		def OpeningFailded(self):
			self.DisableRefreshSymbol()
			if self.pageBoards["create_shop"].IsShow():
				self.KasmirNpc = 30000
				#renderTarget.SelectModel(2, self.KasmirNpc)

	def __OnLeftClickInsertedItem(self, slot):
		if mousemodule.mouseController.isAttached():
			if self.pageCategory == "create_shop":
				self.__OnClickCreateShopEmptySlot()
			elif self.pageCategory == "my_shop":
				self.__OnClickMyShopEmptySlot()
			return


		if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
			self.__OnRemoveShopItem(slot)
		
		else:
			self.EditPriceSlot = slot
			self.CommonInputPriceDlg.Open()
	
	
	def __OnLeftClickShopItem(self, slot):
		if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_RCONTROL):
			itemid  = slot.GetIndex()
			ownerid = self.ShopOpenInfo["owner_id"]

			self.__OnMakeShopItemOffer(itemid, ownerid)


		else:
			self.OpenShopBuyItemID = slot.GetIndex()
			info = slot.GetInfo()
			self.BuyPriceSeenTotal = info['price']
			if ENABLE_CHEQUE_SYSTEM:
				self.BuyPriceSeenTotal += info.get('cheque', 0) * YANG_PER_CHEQUE
			item.SelectItem(info["vnum"])
			name 	= item.GetItemName()
			count	= info["count"]
			yang	= info["price"]
			if ENABLE_CHEQUE_SYSTEM:
				cheque	= info["cheque"]

			if count > 1:
				if ENABLE_CHEQUE_SYSTEM:
					text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_COUNT2 % (name, count, yang, cheque)
				else:
					text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_COUNT % (name, count, yang)
			else:
				if ENABLE_CHEQUE_SYSTEM:
					text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION2 % (name, yang, cheque)
				else:
					text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION % (name, yang)


			width		= 6 * len(text)
			accept_text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_ACCEPT
			cancel_text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_CANCEL
			accept_event= self.__OnAcceptOpenShopBuyItemQuestion
			cancel_event= self.__OnCancelOpenShopBuyItemQuestion

			self.__OpenQuestionDialog(width, accept_text, cancel_text, accept_event, cancel_event, text)


	
	
	def __OnLeftClickSearchFilterShopResultItem(self, slot):
		if app.IsPressed(app.DIK_LCONTROL) or app.IsPressed(app.DIK_LCONTROL):
			itemid,ownerid = slot.GetIndex()
			self.__OnMakeShopItemOffer(itemid, ownerid)
		else:
			self.SearchFilterResultClickedInfo = slot.GetIndex()
			info = slot.GetInfo()
			
			self.BuyPriceSeenTotal = info['price']
			if ENABLE_CHEQUE_SYSTEM:
				self.BuyPriceSeenTotal += info.get('cheque', 0) * YANG_PER_CHEQUE

			item.SelectItem(info["vnum"])
			name = item.GetItemName()
			count = info["count"]
			yang = info["price"]
			if ENABLE_CHEQUE_SYSTEM:
				cheque	= info["cheque"]

			if count > 1:
				if ENABLE_CHEQUE_SYSTEM:
					text = localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_COUNT2 % (name, count, yang, cheque)
				else:
					text = localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_COUNT % (name, count, yang)

			else:
				if ENABLE_CHEQUE_SYSTEM:
					text = localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION2 % (name, yang, cheque)
				else:
					text = localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION % (name, yang)

			width = 6 * len(text)
			accept_text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_ACCEPT
			cancel_text	= localeinfo.OFFLINESHOP_BUY_ITEM_QUESTION_CANCEL
			accept_event = self.__OnAcceptSearchFilterBuyItemQuestion
			cancel_event = self.__OnCancelSearchFilterBuyItemQuestion

			self.__OpenQuestionDialog(width, accept_text, cancel_text, accept_event, cancel_event, text)
	

	


	def __OnClickCreateShopEmptySlot(self, *args):
		if not mousemodule.mouseController.isAttached():
			return

		type = mousemodule.mouseController.GetAttachedType()
		slot = mousemodule.mouseController.GetAttachedSlotNumber()
		
		#tofix slot type to window type
		type = player.SlotTypeToInvenType(type)
		
		
		mousemodule.mouseController.DeattachObject()
		self.ShopBuilding_AddItem(type,slot)


	def __OnClickMyShopEmptySlot(self, *args):
		# todebug
		print("my shop shop empty slot")

		if not mousemodule.mouseController.isAttached():
			return

		type = mousemodule.mouseController.GetAttachedType()
		slot = mousemodule.mouseController.GetAttachedSlotNumber()
		
		#tofix slot type to window type
		type = player.SlotTypeToInvenType(type)
		
		mousemodule.mouseController.DeattachObject()
		self.ShopBuilding_AddItem(type,slot)




	def __OnClickShopListOpenShop(self, id):
		offlineshop.SendOpenShop(id)
	

	def __OnClickOpenAuctionMakeOffer(self, slot):
		if ENABLE_CHEQUE_SYSTEM:
			self.__OnPickValute(localeinfo.OFFLINESHOP_AUCTION_MAKE_OFFER, self.__OnClickAcceptOpenAuctionPickValute, player.GetElk(), player.GetCheque())
		else:
			self.__OnPickValute(localeinfo.OFFLINESHOP_AUCTION_MAKE_OFFER, self.__OnClickAcceptOpenAuctionPickValute, player.GetElk())


	if ENABLE_CHEQUE_SYSTEM:
		def __OnClickAcceptOpenAuctionPickValute(self, yang, cheque):
			if not self.OpenAuctionInfo.has_key('min_raise'):
				return

			if (yang + (cheque * YANG_PER_CHEQUE)) < self.OpenAuctionInfo['min_raise']:
				self.__PopupMessage(localeinfo.OFFLINESHOP_AUCTION_MIN_RAISE%NumberToString(self.OpenAuctionInfo['min_raise']) )
				return

			offlineshop.SendAuctionAddOffer(self.OpenAuctionInfo['owner_id'] , yang, cheque)
	else:
		def __OnClickAcceptOpenAuctionPickValute(self, yang):
			if not self.OpenAuctionInfo.has_key('min_raise'):
				return

			if yang < self.OpenAuctionInfo['min_raise']:
				self.__PopupMessage(localeinfo.OFFLINESHOP_AUCTION_MIN_RAISE%NumberToString(self.OpenAuctionInfo['min_raise']) )
				return

			offlineshop.SendAuctionAddOffer(self.OpenAuctionInfo['owner_id'] , yang)


	def __OnClickShopSafeboxWithdrawYang(self):
		maxval = self.ShopSafeboxValuteAmount
		if ENABLE_CHEQUE_SYSTEM:
			self.__OnPickValute(localeinfo.OFFLINESHOP_SAFEBOX_GET_VALUTE_TITLE, self.__OnAcceptShopSafeboxGetValuteInput, maxval[0], maxval[1])
		else:
			self.__OnPickValute(localeinfo.OFFLINESHOP_SAFEBOX_GET_VALUTE_TITLE, self.__OnAcceptShopSafeboxGetValuteInput, maxval)


	def __OnClickMyShopOfferAcceptButton(self, offer):
		self.MyShopAcceptOfferID = offer.GetInfo()['id']

		question 	= localeinfo.OFFLINESHOP_ACCEPT_OFFER_QUESTION
		accepttext 	= localeinfo.OFFLINESHOP_ACCEPT_OFFER_QUESTION_ACCEPT
		canceltext 	= localeinfo.OFFLINESHOP_ACCEPT_OFFER_QUESTION_CANCEL

		self.__OpenQuestionDialog(len(question)*6 , accepttext, canceltext, self.__OnAcceptMyShopAcceptOffer, self.__OnCancelMyShopAcceptOffer, question)


	def __OnClickMyShopOfferCancelButton(self, offer):
		self.MyShopCancelOfferID = offer.GetInfo()['id']
		question 	= localeinfo.OFFLINESHOP_CANCEL_OFFER_QUESTION
		accepttext 	= localeinfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_ACCEPT
		canceltext 	= localeinfo.OFFLINESHOP_CANCEL_OFFER_QUESTION_CANCEL

		self.__OpenQuestionDialog(len(question) * 6, accepttext, canceltext, self.__OnAcceptMyShopCancelOffer, self.__OnCancelMyShopCancelOffer, question)

	def __OnClickOpenAuctionButton(self, idx):
		offlineshop.SendAuctionOpenAuction(idx)
		self.EnableRefreshSymbol()




	def __OnLeftClickShopSafeboxItem(self, slot):
		id = slot.GetIndex()
		self.ShopSafeboxGetItemIndex = id


		if ENABLE_ITEM_WITHDRAW_QUESTION_SHOP_SAFEBOX:
			info = slot.GetInfo()

			vnum = info["vnum"]
			count = info["count"]

			item.SelectItem(vnum)
			name = item.GetItemName()
			if count > 1:
				text = localeinfo.OFFLINESHOP_SHOP_SAFEBOX_QUESTION_GET_ITEM_COUNT%(name,count)
			else:
				text = localeinfo.OFFLINESHOP_SHOP_SAFEBOX_QUESTION_GET_ITEM%name

			width = len(text)*6
			self.__OpenQuestionDialog(width, localeinfo.OFFLINESHOP_SHOP_SAFEBOX_ACCEPT, localeinfo.OFFLINESHOP_SAFEBOX_CANCEL, self.__OnAcceptShopSafeboxGetItemQuestion, self.__OnCancelShopSafeboxGetItemQuestion, text)

		else:
			self.__OnAcceptShopSafeboxGetItemQuestion()


	def __OnRemoveShopItem(self, slot):
		if self.pageCategory == "create_shop":
			self.__OnRemoveShopItemCreateShopPage(slot)
		
		elif self.pageCategory == "my_shop":
			self.__OnRemoveShopItemMyShop(slot)
	
	
	def __OnRemoveShopItemCreateShopPage(self, slot):
		slot.Hide()
		del self.CreateShopItemsInfos[slot.GetIndex()]
		self.CreateShopItemsTable.ClearElement()
		
		for k, v in self.CreateShopItemsInfos.items():
			newslot = Slot()
			newslot.SetIndex(k)
			newslot.SetInfo(v)
			newslot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickInsertedItem)
			newslot.Show()
			
			self.CreateShopItemsTable.AddElement(newslot)
		
		
	
	def __OnRemoveShopItemMyShop(self, slot):
		offlineshop.SendRemoveItem(slot.GetIndex())
	

	def __OnMakeShopItemOffer(self ,  itemid , ownerid):
		self.MakeOfferItemID = itemid
		self.MakeOfferOwnerID= ownerid

		title = localeinfo.OFFLINESHOP_MAKE_OFFER_TITLE

		if ENABLE_CHEQUE_SYSTEM:
			self.__OnPickValute(title, self.__OnAcceptMakeOffer, player.GetElk(), player.GetCheque())
		else:
			self.__OnPickValute(title, self.__OnAcceptMakeOffer, player.GetElk())


	def __OnSetCreateAuctionSlot(self, win,slot):
		vnum = player.GetItemIndex(win,slot)
		if vnum ==0:
			return

		item.SelectItem(vnum)
		if item.IsAntiFlag(item.ITEM_ANTIFLAG_MYSHOP) or item.IsAntiFlag(item.ITEM_ANTIFLAG_GIVE):
			return

		self.CreateAuctionWindowPos = win
		self.CreateAuctionSlotPos	= slot


		count 	= player.GetItemCount(win,slot)
		attrs 	= [{"type" : player.GetItemAttribute(win, slot, x)[0], "value" : player.GetItemAttribute(win, slot, x)[1]} for x in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
		sockets = [player.GetItemMetinSocket(win,slot,x) for x in xrange(player.METIN_SOCKET_MAX_NUM)]
		if app.ATTR_LOCK:
			locked_attr = player.GetItemAttrLocked(win,slot)

		try:
			if ENABLE_CHANGELOOK_SYSTEM:
				trans = player.GetItemTransmutation(win, slot)
		except:
			pass

		info = {
			"vnum" 		: vnum,
			"count" 	: count,
			'attr'		: attrs,
			'socket'	: sockets,
		}
		
		if app.ATTR_LOCK:
			info.update({ 'locked_attr'  :  locked_attr,})

		try:
			if ENABLE_CHANGELOOK_SYSTEM:
				info.update({
					'trans' : trans,
				})
		except:
			pass


		self.CreateAuctionSlot.SetInfo(info)
		self.CreateAuctionSlot.SetOnMouseLeftButtonUpEvent(self.OnClickAuctionSlot)


	def IsBuildingShop(self):
		return self.IsShow() and (self.pageCategory == "create_shop" or self.pageCategory=="my_shop")



	
	def IsForSaleSlot(self,win,slot):
		idx = (win,slot)

		if not self.pageCategory=="create_shop" or not self.IsShow():
			return False
		
		if not self.CreateShopItemsTable:
			return False
		
		elementDict = self.CreateShopItemsTable.GetElementDict()
		for dct in elementDict.values():
			for value in dct.values():
				if value.GetIndex() == idx:
					return True
		return False

	def IsBuildingAuction(self):
		if not self.IsShow():
			return False

		if self.pageCategory != "create_auction":
			return False
		return True


	def IsForAuctionSlot(self, win, slot):
		if not self.IsShow():
			return False

		if self.pageCategory != "create_auction":
			return False

		return self.CreateAuctionWindowPos == win and self.CreateAuctionSlotPos == slot



	def __SetTooltip(self,info,canRemove=False):
		infocolor = COLOR_TEXT_SHORTCUT

		is_building = self.IsBuildingShop()
		
		self.itemTooltip.ClearToolTip()
		
		sockets = [info["socket"][num] for num in xrange(player.METIN_SOCKET_MAX_NUM)]
		attrs	= [(info["attr"][num]['type'], info["attr"][num]['value']) for num in xrange(player.ATTRIBUTE_SLOT_MAX_NUM)]
		
		if app.ATTR_LOCK:
			self.itemTooltip.AddItemData(info["vnum"], sockets, attrs, lockedattr = info.get('locked_attr', -1))
		
		else:
			self.itemTooltip.AddItemData(info["vnum"], sockets, attrs)
		
		try:
			if ENABLE_CHANGELOOK_SYSTEM:
				trans = info.get('trans',0)
				if trans !=0 and trans != -1:
					self.itemTooltip.AppendTransmutation(0,0, trans)
		except:
			pass



		if self.pageCategory in ("open_shop", "my_shop", "search_filter", "create_shop"):
			self.itemTooltip.AppendPrice(info["price"])
			if ENABLE_CHEQUE_SYSTEM:
				cheque = info.get('cheque',0)
				if cheque!=0:
					self.itemTooltip.AppendSellingChequePrice(cheque)
		
		if is_building and not info.get('sold', False):
			self.itemTooltip.AppendSpace(10)
			self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_BUILDING_LEFT_CLICK_EDIT_PRICE, infocolor)
			self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_BUILDING_LEFT_CLICK_CTRL_REMOVE_ITEM, infocolor)
		
		elif self.pageCategory == "open_shop" or self.pageCategory == "search_filter":
			self.itemTooltip.AppendSpace(10)
			self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_OPEN_SHOP_LEFT_CLICK_BUY_ITEM, infocolor)
			self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_OPEN_SHOP_LEFT_CLICK_MAKE_OFFER, infocolor)

		elif self.pageCategory == "shop_safebox":
			self.itemTooltip.AppendSpace(10)
			self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_SAFEBOX_TOOLTIP_GETITEM, infocolor)
		elif canRemove:
			self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_BUILDING_LEFT_CLICK_CTRL_REMOVE_ITEM, infocolor)

	def __SetTooltipMyOffer(self, offer):
		slot = offer.slot
		self.__SetTooltip(slot.GetInfo())
		index = offer.info['offer_id']

		for elm in self.MyOffersList:
			if elm['offer_id'] == index:
				self.itemTooltip.AppendSpace(10)
				self.itemTooltip.AppendPrice(elm['item']['price'])
				self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_MY_OFFER_OFFER_TEXT%localeinfo.NumberToMoneyString(elm['price']))
				break


	def __SetTooltipSearch(self, element):
		appendLine = lambda arg : (
			uitooltip.ToolTip.AutoAppendTextLine(self.itemTooltip, arg),
			self.itemTooltip.AlignHorizonalCenter())

		self.itemTooltip.ClearToolTip()


		info = element.info

		name 		= info.get('filter_name', "")
		wearflag	= info.get('filter_wearflag', 0)

		price_min	= info.get('price', {}).get('start', 0)
		price_max	= info.get('price', {}).get('end', 0)

		level_min	= info.get('level', {}).get('start',0)
		level_max	= info.get('level', {}).get('end',0)

		type		= info.get('filter_type', 0)
		subtype		= info.get('filter_subtype', 255)

		attrs		= info.get('attr')
		rarity 		= info.get('rarity', -1)

		#name
		if name:
			appendLine(localeinfo.OFFLINESHOP_TOOLTIP_NAME_INFO +" "+ name)

		#type
		if type:
			type_phrase  = localeinfo.OFFLINESHOP_TOOLTIP_TYPE_INFO+  " "
			type_phrase += self.ITEM_TYPES[type]['name']

			if subtype != SUBTYPE_NOSET and self.ITEM_TYPES[type].has_key('subtypes'):
				type_phrase += ", "+self.ITEM_TYPES[type]['subtypes'][subtype]

			appendLine(type_phrase)


		#price
		if price_min or price_max:
			price_phrase = localeinfo.OFFLINESHOP_TOOLTIP_PRICE_INFO + " "
			if price_min and price_max:
				price_phrase += NumberToString(price_min) + "  -  "+ localeinfo.NumberToMoneyString(price_max)

			elif price_min:
				price_phrase += " > "+ localeinfo.NumberToMoneyString(price_min)
			elif price_max:
				price_phrase += " < "+ localeinfo.NumberToMoneyString(price_max)

			appendLine(price_phrase)

		#level
		if level_min or level_max:
			level_phrase = localeinfo.OFFLINESHOP_TOOLTIP_LEVEL_INFO + " "
			if level_min and level_max:
				level_phrase += "%d  -  %d"%(level_min, level_max)

			elif level_min:
				level_phrase += " >= %d"%level_min

			elif level_max:
				level_phrase += " <= %d"%level_max

			appendLine(level_phrase)


		#wear
		raceFlagDct = {
			item.ITEM_ANTIFLAG_WARRIOR : localeinfo.OFFLINESHOP_WEAR_WARRIOR,
			item.ITEM_ANTIFLAG_ASSASSIN	: localeinfo.OFFLINESHOP_WEAR_ASSASSIN,
			item.ITEM_ANTIFLAG_SURA		: localeinfo.OFFLINESHOP_WEAR_SURA,
			item.ITEM_ANTIFLAG_SHAMAN	: localeinfo.OFFLINESHOP_WEAR_SHAMAN,
		}

		if ENABLE_WOLFMAN_CHARACTER:
			raceFlagDct.update({
				item.ITEM_ANTIFLAG_WOLFMAN: localeinfo.OFFLINESHOP_WEAR_WOLFMAN,
			})

		wearphrase = ""
		for k ,v in raceFlagDct.items():
			if not wearflag & k:
				if wearphrase:
					wearphrase += ", "
				wearphrase += v

		if wearphrase:
			wearphrase = localeinfo.OFFLINESHOP_TOOLTIP_WEAR_INFO + wearphrase
			appendLine(wearphrase)

		if rarity != -1 and rarity in self.RARITY_GRADES:
			appendLine(localeinfo.OFFLINESHOP_TOOLTIP_RARITY_INFO + self.RARITY_GRADES[rarity] )
		
		#attribute
		attribute_phrase = ""
		for type in attrs['type']:
			if type != 0:
				if attribute_phrase:
					attribute_phrase += ', '
				attribute_phrase += self.ATTRIBUTES[type]

		if attribute_phrase:
			attribute_phrase = localeinfo.OFFLINESHOP_TOOLTIP_ATTR_INFO +' '+attribute_phrase
			appendLine(attribute_phrase)


		self.itemTooltip.ShowToolTip()



	def __SetTooltipAuctionList(self, element):
		itemInfo = element.GetInfo()['item']
		self.__SetTooltip(itemInfo)



	def OnUpdate(self):
		if self.pageCategory in self.updateEvents:
			self.updateEvents[self.pageCategory]()

	def __OnUpdateMyShopPage(self):
		self.__RefreshingTooltip(self.MyShopItemsTable)

	
	
	def __OnUpdateCreateShopPage(self):
		self.__RefreshingTooltip(self.CreateShopItemsTable)

	def __OnUpdateOpenShopPage(self):
		self.__RefreshingTooltip(self.OpenShopItemsTable)
	
	def __OnUpdateSearchFilterPage(self):
		self.__RefreshingTooltip(self.SearchFilterResultItemsTable)
		self.__UpdateGradeFilterEffect()
		
	def __OnUpdateSearchHistoryPage(self):
		self.__RefreshingTooltip(self.SearchHistoryTable , self.__SetTooltipSearch)

	def __OnUpdateMyPatternPage(self):
		self.__RefreshingTooltip(self.SearchPatternsTable, self.__SetTooltipSearch)

	def __OnUpdateShopSafeboxPage(self):
		self.__RefreshingTooltip(self.ShopSafeboxItemsTable)
	

	def __OnUpdateMyOffersPage(self):
		self.__RefreshingTooltip(self.MyOffersTable, self.__SetTooltipMyOffer)

	def __OnUpdateCreateAuctionPage(self):
		if self.CreateAuctionSlot.IsShow():
			if self.itemTooltip.IsShow():
				if not self.CreateAuctionSlot.IsInSlot():
					self.itemTooltip.Hide()
			else:
				if self.CreateAuctionSlot.IsInSlot() and self.CreateAuctionSlot.GetInfo():
					self.__SetTooltip(self.CreateAuctionSlot.GetInfo(), True)
		
		if self.CreateAuctionSlot.GetInfo():
			last_check = getattr(self, "LastCreateAuctionCheck", 0)
			if last_check == 0 or app.GetTime() - 0.5 > last_check:
				self.LastCreateAuctionCheck = app.GetTime()
				self.__OnCheckCreateAuctionSlot()

	def __OnUpdateMyAuctionPage(self):
		if self.MyAuctionSlot.IsShow():
			if self.itemTooltip.IsShow():
				if not self.MyAuctionSlot.IsInSlot():
					self.itemTooltip.Hide()
			else:
				if self.MyAuctionSlot.IsInSlot() and self.MyAuctionSlot.GetInfo():
					self.__SetTooltip(self.MyAuctionSlot.GetInfo())


	def __OnUpdateOpenAuctionPage(self):
		if self.OpenAuctionSlot.IsShow():
			if self.itemTooltip.IsShow():
				if not self.OpenAuctionSlot.IsInSlot():
					self.itemTooltip.Hide()
			else:
				if self.OpenAuctionSlot.IsInSlot() and self.OpenAuctionSlot.GetInfo():
					self.__SetTooltip(self.OpenAuctionSlot.GetInfo())
					self.itemTooltip.AppendTextLine(localeinfo.OFFLINESHOP_TOOLTIP_LEFT_CLICK_MAKE_OFFER)


	def __OnUpdateAuctionListPage(self):
		self.__RefreshingTooltip(self.AuctionListTable, self.__SetTooltipAuctionList)

	def __OnCheckCreateAuctionSlot(self):
		slot = self.CreateAuctionSlotPos
		win  = self.CreateAuctionWindowPos
		info = self.CreateAuctionSlot.GetInfo()
		
		vnum  = info.get('vnum', 0)
		count = info.get('count', 0)

		slot_vnum  = player.GetItemIndex(win,slot)
		slot_count = player.GetItemCount(win,slot)

		if vnum != slot_vnum or count != slot_count:
			self.__ResetCreateAuctionSlot()

	def __ResetCreateAuctionSlot(self):
		self.__MakeCreateAuctionSlot()
		self.CreateAuctionWindowPos = -1
		self.CreateAuctionSlotPos = -1

	def __RefreshingTooltip(self, table, event = None):
		if not self.itemTooltip.IsShow():
			elementDict = table.GetElementDict()
			for dct in elementDict.values():
				for value in dct.values():
					if value.IsInSlot():
						self.slotTooltipIndex = value.GetIndex()
						if event == None:
							self.__SetTooltip(value.GetInfo())
						else:
							event(value)

						return

			self.itemTooltip.Hide()
			self.slotTooltipIndex = -1

		else:
			elementDict = table.GetElementDict()
			for dct in elementDict.values():
				for value in dct.values():
					if value.IsInSlot():
						if self.slotTooltipIndex == value.GetIndex():
							return

						self.slotTooltipIndex = value.GetIndex()
						if event == None:
							self.__SetTooltip(value.GetInfo())
						else:
							event(value)

						return

			self.itemTooltip.Hide()
			self.slotTooltipIndex = -1


	def RefreshMyShopPage(self):
		
		#page
		self.pageCategory = "my_shop"
		for board in self.pageBoards.values():
			board.Hide()
		
		self.pageBoards["my_shop"].Show()
		name = self.ShopOpenInfo["name"]


		# title&duration
		if '@' in name:
			name = name[name.find('@')+1:]

		self.MyShopShopTitle.SetText(name + "  " + localeinfo.OFFLINESHOP_ITEMS_COUNT_TEXT%self.ShopOpenInfo["count"])
		self.MyShopShopDuration.SetText(GetDurationString(self.ShopOpenInfo["duration"]))



		#items table
		self.MyShopItemsTable.ClearElement()
		
		for item_info in self.ShopItemForSale:
			
			slot = Slot()
			slot.SetInfo(item_info)
			slot.SetIndex(item_info["id"])
			slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickInsertedItem)
			slot.Show()
			
			self.MyShopItemsTable.AddElement(slot)

		for item_info in self.ShopItemSold:
			item_info["sold"] = True

			slot = Slot(isSold=True)
			slot.SetInfo(item_info)
			slot.SetIndex(item_info["id"])
			slot.Show()

			self.MyShopItemsTable.AddElement(slot)

		#offers
		self.MyShopOffersTable.ClearElement()
		for info in self.MyShopOffers:
			# find item name
			itemname = ""
			for saleitem in self.ShopItemForSale:
				if saleitem["id"] == info["item_id"]:
					item.SelectItem(saleitem["vnum"])
					itemname = item.GetItemName()
					break

			if not itemname:
				continue

			offer = Offer(info)
			offer.Show()
			offer.SetItemName(itemname)
			if not info["is_accept"]:
				offer.SetAcceptButtonEvent(self.__OnClickMyShopOfferAcceptButton)
				offer.SetDeleteButtonEvent(self.__OnClickMyShopOfferCancelButton)

			self.MyShopOffersTable.AddElement(offer)
	
	def RefreshShopListPage(self):
		self.pageCategory = "shop_list"
		for board in self.pageBoards.values():
			board.Hide()
		
		self.pageBoards["shop_list"].Show()
		self.ShopListTable.ClearElement()
		
		for shop in self.ShopList:
			element = ShopListElement(shop)
			element.SetOnClickOpenShopButton(self.__OnClickShopListOpenShop)
			element.Show()

			self.ShopListTable.AddElement(element)
		
		if self.itemTooltip.IsShow():
			self.itemTooltip.Hide()
	
	
	def RefreshOpenShopPage(self):
		self.pageCategory = "open_shop"
		for board in self.pageBoards.values():
			board.Hide()
		
		self.pageBoards["open_shop"].Show()
		
		self.OpenShopItemsTable.ClearElement()
		for info in self.ShopItemForSale:
			slot = Slot()
			slot.SetInfo(info)
			slot.SetIndex(info["id"])
			slot.SetOnMouseLeftButtonUpEvent(self.__OnLeftClickShopItem)
			slot.Show()
			
			self.OpenShopItemsTable.AddElement(slot)
		
		name 		= self.ShopOpenInfo["name"]
		duration	= self.ShopOpenInfo["duration"]
		
		if '@' in name:
			name = name[name.find('@')+1:]
		
		self.OpenShopShopTitle.SetText(name+ "  " + localeinfo.OFFLINESHOP_ITEMS_COUNT_TEXT%self.ShopOpenInfo["count"])
		self.OpenShopShopDuration.SetText(GetDurationString(duration))


	def RefreshSearchHistoryPage(self):
		self.SearchHistoryTable.ClearElement()
		offlineshop.RefreshFilterHistory()

		SortByDatetime(self.FilterHistory)

		for elm in self.FilterHistory:
			newElement = FilterHistoryElement(elm)
			newElement.SetButtonEvent(self.__OnClickFilterHistoryElement)
			newElement.Show()
			self.SearchHistoryTable.AddElement(newElement)


	def RefreshMyPatternsPage(self):
		self.SearchPatternsTable.ClearElement()
		offlineshop.RefreshFilterPatterns()

		lst = self.FilterPatterns.values()
		SortByDatetime(lst)

		for v in lst:
			pattern = FilterPatternElement(v)
			pattern.SetButtonEvent(self.__OnClickSearchPatternElement)
			pattern.Show()

			self.SearchPatternsTable.AddElement(pattern)


	def RefreshMyOffersPage(self):
		self.pageCategory = "my_offers"
		for board in self.pageBoards.values():
			board.Hide()

		self.pageBoards["my_offers"].Show()



		self.MyOffersTable.ClearElement()

		for info in self.MyOffersList:

			offer = MyOffer(info)
			offer.Show()
			offer.SetCancelButtonEvent(self.__OnClickDeleteMyOfferButton)
			slot  = offer.slot


			if not info['is_accept']:
				viewImage = MakeOfferViewImage(info['is_notified'])
				slot.AppendChild(viewImage)
				viewImage.SetPosition(5,5)
				viewImage.Show()
			
			#updated 25-01-2020 #topatch
			else:
				offer.DisableCancelButton()

			self.MyOffersTable.AddElement(offer)


	def RefreshAuctionListPage(self):
		self.pageCategory = "auction_list"
		for board in self.pageBoards.values():
			board.Hide()

		self.pageBoards["auction_list"].Show()




		self.AuctionListTable.ClearElement()

		for info in self.AuctionListInfo:
			elm = AuctionListElement(info)
			elm.Show()
			elm.SetIndex(info['owner_id'])
			elm.SetOnClickOpenAuctionButton(self.__OnClickOpenAuctionButton)

			self.AuctionListTable.AddElement(elm)



	def RefreshMyAuctionPage(self):
		self.pageCategory = "my_auction"
		for board in self.pageBoards.values():
			board.Hide()

		self.pageBoards["my_auction"].Show()



		self.MyAuctionOfferTable.ClearElement()

		if 'offers' in self.MyAuctionInfo:
			for info in SortOffersByPrice(self.MyAuctionInfo['offers']):
				elm = AuctionOffer(info)
				elm.Show()

				self.MyAuctionOfferTable.AddElement(elm)

		best_price = GetBestOfferPriceYang(self.MyAuctionInfo.get('offers', []))
		if best_price ==0:
			min_raise  = self.MyAuctionInfo['init_yang']

		else:
			if best_price < 1000:
				min_raise = best_price + 1000
			else:
				min_raise  = long(float(best_price)*1.1)






		self.MyAuctionBestOffer.SetText(localeinfo.NumberToMoneyString(best_price))
		self.MyAuctionDuration.SetText(GetDurationString(self.MyAuctionInfo['duration']))
		self.MyAuctionMinRaise.SetText(localeinfo.NumberToMoneyString(min_raise))
		self.MyAuctionOwnerName.SetText(self.MyAuctionInfo['owner_name'])

		if 'item' in self.MyAuctionInfo:
			self.__MakeMyAuctionSlot(self.MyAuctionInfo['item'])


	def RefreshOpenAuctionPage(self):
		self.pageCategory = "open_auction"
		for board in self.pageBoards.values():
			board.Hide()

		self.pageBoards["open_auction"].Show()



		self.OpenAuctionOfferTable.ClearElement()

		if 'offers' in self.OpenAuctionInfo:
			for info in SortOffersByPrice(self.OpenAuctionInfo['offers']):
				elm = AuctionOffer(info)
				elm.Show()

				self.OpenAuctionOfferTable.AddElement(elm)

		best_price = GetBestOfferPriceYang(self.OpenAuctionInfo.get('offers' , []))
		if best_price == 0:
			min_raise = self.OpenAuctionInfo['init_yang']

		else:
			if best_price < 1000:
				min_raise = best_price + 1000
			else:
				min_raise = long(float(best_price) * 1.1)

		self.OpenAuctionInfo['min_raise'] = min_raise

		self.OpenAuctionBestOffer.SetText(localeinfo.NumberToMoneyString(best_price))
		self.OpenAuctionDuration.SetText(GetDurationString(self.OpenAuctionInfo['duration']))
		self.OpenAuctionMinRaise.SetText(localeinfo.NumberToMoneyString(min_raise))
		self.OpenAuctionOwnerName.SetText(self.OpenAuctionInfo['owner_name'])

		if 'item' in self.OpenAuctionInfo:
			self.__MakeOpenAuctionSlot(self.OpenAuctionInfo['item'])

 

Edited by Metin2 Dev
Core X - External 2 Internal
Link to comment
Share on other sites

  • Replies 0
  • Created
  • Last Reply

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.