package com.oxylusflash.book { import com.oxylusflash.events.ParamEvent; import flash.display.BlendMode; import flash.display.Sprite; import caurina.transitions.Tweener; import flash.events.Event; import flash.events.FocusEvent; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.filters.GlowFilter; import flash.geom.Rectangle; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.ui.Keyboard; public class SummaryPanel extends FadeInOutItem { public var bgMc:Sprite; public var bgLightMc:Sprite; private var summaryTitle:SummaryPanelTitle; private var summaryLstHolder:FadeInOutItem; private var summaryPane:ScrollPane; private var searchTitle:SummaryPanelTitle; private var searchLstHolder:FadeInOutItem; private var searchPane:ScrollPane; private var searchBoxHolder:Sprite; private var searchInput:InputField; private var searchCloseBtn:CloseSearchButton; public static const PADDING:Number = 15; private static const SEARCH_BOX_SPACE:Number = 58; /** * The summary panel. */ public function SummaryPanel() { this.blendMode = BlendMode.LAYER; this.filters = [Global.SHADOW]; bgMc.cacheAsBitmap = true; bgLightMc.cacheAsBitmap = true; bgMc.width = Global.xmlSummaryPanel.width; bgLightMc.width = bgMc.width; // Book summary list. summaryLstHolder = this.addChild(new FadeInOutItem) as FadeInOutItem; summaryTitle = summaryLstHolder.addChild(new SummaryPanelTitle(Global.xmlTranslate.str18)) as SummaryPanelTitle; summaryTitle.x = PADDING; summaryTitle.y = Math.round(PADDING * 0.5); summaryTitle.width = bgMc.width - 2 * PADDING; summaryPane = summaryLstHolder.addChild(new ScrollPane) as ScrollPane; summaryPane.width = bgMc.width - 2 * PADDING; summaryPane.x = PADDING; summaryPane.y = Math.round(summaryTitle.y + summaryTitle.height) + Math.round(PADDING * 0.5); // Search results list. searchLstHolder = this.addChild(new FadeInOutItem) as FadeInOutItem; searchTitle = searchLstHolder.addChild(new SummaryPanelTitle(Global.xmlTranslate.str17)) as SummaryPanelTitle; searchTitle.x = PADDING; searchTitle.y = Math.round(PADDING * 0.5); searchTitle.width = bgMc.width - 2 * PADDING; searchPane = searchLstHolder.addChild(new ScrollPane) as ScrollPane; searchPane.width = bgMc.width - 2 * PADDING; searchPane.x = PADDING; searchPane.y = Math.round(searchTitle.y + searchTitle.height) + Math.round(PADDING * 0.5); searchLstHolder.alpha = 0; searchLstHolder.state = FadeInOutItem.INVISIBLE; // Search box. searchBoxHolder = this.addChild(new Sprite) as Sprite; searchBoxHolder.x = PADDING; searchInput = searchBoxHolder.addChild(new LibSearchInput) as InputField; searchInput.width = bgMc.width - 2 * PADDING; searchInput.label = Global.xmlTranslate.str19; searchInput.addEventListener(InputField.FOCUS, searchInput_eventHandler, false, 0, true); searchInput.addEventListener(InputField.SUBMIT, searchInput_eventHandler, false, 0, true); searchInput.addEventListener(InputField.CANCEL, searchInput_eventHandler, false, 0, true); searchInput.addEventListener(InputField.BLUR, searchInput_eventHandler, false, 0, true); searchCloseBtn = searchBoxHolder.addChild(new LibButtonCloseSearch) as CloseSearchButton; searchCloseBtn.addEventListener(MouseEvent.CLICK, searchCloseBtn_clickHandler, false, 0, true); searchCloseBtn.y = searchInput.y + Math.round((searchInput.height - searchCloseBtn.height) * 0.5); searchCloseBtn.x = searchInput.width - searchCloseBtn.width - searchCloseBtn.y; // Search parameters. Global.searchTags.addEventListener(SearchTags.SEARCH_TICK, searchTickHandler, false, 0, true); Global.searchTags.addEventListener(SearchTags.SEARCH_END, searchEndHandler, false, 0, true); Global.searchTags.wholeWords = Global.xmlSearch.wholeWords; Global.searchTags.caseSensitive = Global.xmlSearch.caseSensitive; //Init state. if (!Global.xmlSummaryPanel.visible) { this.alpha = 0; _state = FadeInOutItem.INVISIBLE; } } private function searchCloseBtn_clickHandler(e:MouseEvent):void { if (Global.searchTags.isSearching) { Global.searchTags.stopSearch(); } else { summaryLstHolder.state = FadeInOutItem.VISIBLE; searchLstHolder.state = FadeInOutItem.INVISIBLE; searchCloseBtn.state = FadeInOutItem.INVISIBLE; searchInput.label = Global.xmlTranslate.str19; } } private function searchInput_eventHandler(e:Event):void { switch(e.type) { case InputField.FOCUS: searchInput.label = ""; break; case InputField.SUBMIT: if (!searchInput.isBlank) { disablePanel(); Global.searchTags.search(searchInput.label); searchCloseBtn.state = FadeInOutItem.VISIBLE; } break; case InputField.CANCEL: searchInput.label = Global.xmlTranslate.str19; break; case InputField.BLUR: if (searchInput.isBlank) searchInput.label = Global.xmlTranslate.str19; break; } } private function searchTickHandler(e:ParamEvent):void { var percStr:String = String(Math.floor(100 * e.params.percentage)); searchInput.label = String(Global.xmlTranslate.str21).replace(/%PERCENTAGE%/g, percStr); } private function searchEndHandler(e:ParamEvent):void { var resXML:XML = new XML(e.params.searchResults); var lblStr:String; var resLen:int = resXML.entry.length(); if (resLen > 0) { lblStr = String(Global.xmlTranslate.str22).replace(/%NUM_RESULTS%/g, String(resLen)); lblStr = lblStr.replace(/%SEARCH_STRING%/g, e.params.searchString); } else { lblStr = String(Global.xmlTranslate.str23).replace(/%SEARCH_STRING%/g, e.params.searchString); } searchInput.label = lblStr; if (searchLstHolder.state == FadeInOutItem.INVISIBLE) { searchPane.clearListing(); } feedSearch(resXML); summaryLstHolder.state = FadeInOutItem.INVISIBLE; searchLstHolder.state = FadeInOutItem.VISIBLE; enablePanel(); } public function show():void { this.state = FadeInOutItem.VISIBLE; } public function hide():void { this.state = FadeInOutItem.INVISIBLE; } public function feedSummary(xmlData:XML):void { summaryPane.populate(xmlData); } public function feedSearch(xmlData:XML):void { searchPane.populate(xmlData); } private function disablePanel(disable:Boolean = true):void { summaryLstHolder.mouseChildren = summaryLstHolder.mouseEnabled = !disable; searchLstHolder.mouseChildren = searchLstHolder.mouseEnabled = !disable; searchInput.mouseChildren = searchInput.mouseEnabled = !disable; summaryPane.mouseEnabled = !disable; searchPane.mouseEnabled = !disable; } private function enablePanel():void { disablePanel(false); } /** * Overrides. */ override public function get width():Number { return bgMc.width; } override public function set width(value:Number):void { } override public function get height():Number { return bgMc.height; } override public function set height(value:Number):void { bgMc.height = value; bgLightMc.height = value * 0.5; summaryPane.height = value - summaryPane.y - SEARCH_BOX_SPACE; searchPane.height = value - searchPane.y - SEARCH_BOX_SPACE; searchBoxHolder.y = value - SEARCH_BOX_SPACE + PADDING; } override public function get alpha():Number { return super.alpha; } override public function set alpha(value:Number):void { super.alpha = value; this.mouseChildren = value == 1; this.mouseEnabled = this.mouseChildren; } } }