﻿// JScript File

Type.registerNamespace('Bandit');

var g_GlobalMealListId = 1;

function getCtrlId(s) {
    return '_MealList' + g_GlobalMealListId++;
}

Bandit.MealList = function(someControl, urlHome) {
    
    this.controlRoot = someControl.substr(0, (someControl.lastIndexOf('_')+1));
    
    this.mealAnchorTemplateId = this.controlRoot + 'mealAnchorTemplate';
    this.mealTemplateId = this.controlRoot + 'mealTemplate';
    this.editTemplateId = this.controlRoot + 'mealEditTemplate';
    this.listContentId = this.controlRoot + 'listContent';
    this.tinyMealTemplateId = this.controlRoot + 'mealSummaryTemplate';
    this.commentTemplateId = this.controlRoot + 'commentTemplate';
    this.uriBase = urlHome;
    this.ctrlId = getCtrlId(someControl);

        this.displayType = this.getListDisplayType();
    if (this.displayType == 'TinyList') {
        this.disablePager = true;
        this.disableProgress = true;
    } else if (this.displayType == 'NiceList') {
        this.disablePager = false;
        this.disableProgress = false;
    } else {
        this.disablePager = false;
        this.disableProgress = false;
    }

    this.disableAnim = this.getDisableAnim();

if (this.displayType == 'Toolbox') {
        this.toolbox = true;
        this.disablePager = true;
        this.disableProgress = true;
        this.toolboxPanel = new YAHOO.widget.Panel("panel2", { width:"320px", visible:false, draggable:false, close:false } );
		this.toolboxPanel.setHeader("Panel #2 from Script &mdash; This Panel Isn't Draggable");
		this.toolboxPanel.setBody("This is a dynamically generated Panel.");
		this.toolboxPanel.setFooter("End of Panel #2");
		this.toolboxPanel.render(this.controlRoot + "toolboxToggle");
		this.toolboxPanel.show();
		return;
	}
	
	    this.y = YAHOO;
    this.dh = YAHOO.ext.DomHelper;
    this.anchorTemplate = new this.dh.Template(decodeURI($get(this.mealAnchorTemplateId).innerHTML));
    this.itemTemplate = new YAHOO.ext.DomHelper.Template(decodeURI($get(this.mealTemplateId).innerHTML));
    this.tinyItemTemplate = new YAHOO.ext.DomHelper.Template(decodeURI($get(this.tinyMealTemplateId).innerHTML));
    this.commentTemplate = new YAHOO.ext.DomHelper.Template(decodeURI($get(this.commentTemplateId).innerHTML));
    this.numPages = 1;

    this.toolbox = false;

    var list = $get(this.listContentId);
    
    list.populated = false;
    list.oldWidth = list.clientWidth;
    list.oldX = YAHOO.util.Dom.getX(list);
    list.oldY = YAHOO.util.Dom.getY(list);

    this.progressElement = null;

    this.direction = 'f';
    this.initPager();
    this.startGlobalProgress();

    CalendarWebService.QueryVerboseMeals(this.getPageNum(), this.getPageSize(), this.getListType(), this.getQuery(), this.queryMealsSucceeded, null/*failure*/, this);
}

Bandit.MealList.prototype = {

    refSearchCompletion: function() {
        this.refCompletion--;
        if (this.refCompletion == 0) {
            this.animOut();
        }
    },

    foo: function() {
    },

    startReferenceSearch: function() {
        var i = 0;
        this.refCompletion = 1;
        
        for (i=0; i < this.mealArray.length-1; i++) {
            var blogSearch = null;
            this.refCompletion++;
            blogSearch = new GwebSearch();
            blogSearch.setSiteRestriction('003084314295129404805:72ozi9a0fjk');
            blogSearch.setNoHtmlGeneration();
            blogSearch.setResultSetSize(GSearch.SMALL_RESULTSET);            
            blogSearch.setSearchCompleteCallback(this, Bandit.MealList.prototype.refSearchCompletion);
            this.mealArray[i].blogSearch = blogSearch;
            blogSearch.execute(this.mealArray[i].title);
        }
        
        this.refSearchCompletion();
    },

    queryMealsSucceeded: function(mealArray, mealList, methodName) {
        mealList.mealArray = mealArray;
        mealList.methodName = methodName;
        /* people hate this apparently
        if (mealList.displayType == 'TinyList' || mealList.getListType() == 'Keyword') {
            mealList.animOut();
        } else {
            mealList.startReferenceSearch();
        }*/
        mealList.animOut();
    },

    queryMealsSucceededReal: function (mealArray, mealList, methodName) {

        this.stopProgress();
        
        var list = $get(mealList.listContentId);

        if (list.hasChildNodes() ) {
        
            while ( list.childNodes.length >= 1 ) {
                list.removeChild( list.firstChild );       
            } 
        }
        
        var iMeal = 0;  
        
        for (iMeal = 0; iMeal < mealArray.length-1; iMeal++) {
        
            mealList.anchorTemplate.append(list, {MealId: mealArray[iMeal].id, CtrlId: mealList.ctrlId});
            //if (iMeal == mealArray.length-2 && this.displayType == 'TinyList') {
                //mealList.anchorTemplate.append(list, {MealId: 'xx', CtrlId: mealList.ctrlId});
            //} i don't think this actually does anything
        }        

        for (iMeal = 0; iMeal < mealArray.length-1; iMeal++) {
        
            var meal = mealArray[iMeal];
            var anchor = $get(mealList.$$ctl('mealAnchor', meal));
            meal.isOdd = (iMeal % 2) == 1;
            
            if (meal.isMeal) {
                mealList.appendMeal(anchor, meal);
            } else {
                mealList.appendComment(anchor, meal);
            }
        }
                
        if (iMeal == 0) {
            var theNewParagraph = document.createElement('p');
            var theTextOfTheParagraph = document.createTextNode('No results returned.');
            theNewParagraph.appendChild(theTextOfTheParagraph);
            list.appendChild(theNewParagraph);
        }
                
        mealList.numPages = mealArray[mealArray.length-1].id;
        
        mealList.updatePager();
        
        list.populated = true;
        
        mealList.animIn();
    },

    appendMeal: function (anchor, meal) {
    
        if (this.displayType == 'TinyList') {
            return this.appendMealTiny(anchor, meal);
        } else if (this.displayType == 'NiceList') {
            return this.appendMealNice(anchor, meal);
        }
        
        var tags = "";
        if (meal.tags.length > 0) {
            tagArray = meal.tags.split(" ");
            for (iTag=0; iTag < tagArray.length; iTag++) {
                tags += '<a href="' + this.uriBase + 'browse_meals_tag.aspx?tag=' + tagArray[iTag] + '">' + tagArray[iTag] + '</a> ';
            }
        }
        
        var editLink = '';
        if (meal.editable) {
            var deleteSnippet = '<img style="cursor: pointer;" alt="delete this meal" src="' + this.uriBase + 'img/icons/bin_closed.png" width="16" height="16" id="' + this.$$ctl('deleteLink', meal) + '">';
            editLink = '<a class="editLink" id="' + this.$$ctl('editMeal', meal) + '">edit this meal</a>&nbsp;&nbsp;<a class="editLink" href="' + this.uriBase + 'edit_meal_photos.aspx?mealId=' +  meal.id + '">upload photo</a> ' + deleteSnippet + '<br/>';            
            if (typeof meal.blogSearch == 'undefined' || meal.blogSearch.length == 0) {
                editLink += '<br />';
            }
        }
        
        var commentLine = "Post a comment for this meal.";
        if (meal.commentCount != 0) {
            commentLine = "There " + ((meal.commentCount > 1) ? "are" : "is") + " " + meal.commentCount + " comment" + ((meal.commentCount > 1) ? "s" : "") + " posted for this meal.";
        }
        
        var sourceName = '';
        var sourceHref = '';
        var sourceLine = '';
        
        if (meal.source.length > 0) {

            if (meal.source.indexOf('http://') == 0) {
            
                sourceHref = meal.source;
                sourceName = meal.source;
                
            } else {
            
                sourceHref = 'http://search.msn.com/results.aspx?q=' + meal.source;
                sourceName = meal.source;
            }
        }
        
        if (sourceName.length > 30) {
            sourceName = sourceName.substr(0, 28) + "...";
        }
        
        if (sourceName.length > 0) {
            sourceLine = '<a href="' + sourceHref + '">' + sourceName + '</a>';
        }
        
        var starImageBase = this.uriBase + 'img/icons/';
        var starImageFilled = starImageBase + 'star.png';
        var starImageEmpty = starImageBase + 'star-faded.png';
        
        var starSnippet = '';
        if (meal.editable == false) {
            if (meal.rating > 0) {
                starSnippet = '<img alt="' + meal.owner + ' marked this as a favorite meal" src="' + starImageFilled + '">';
            }
        } else {
        
            //
            // the meal is editable, so we have to allow the user to click the star.
            //
            
            imgUrl = ((meal.rating > 0) ? starImageFilled : starImageEmpty);
            altText = ((meal.rating > 0)? 'unmark this as a favorite' : 'mark this as a favorite');
            
            starSnippet = '<img alt="' + altText + '" style="cursor: pointer;" src="' + imgUrl + '" id="' + this.$$ctl('star', meal) + '">'
        }        
        
        //
        // now take care of the related links, if any are present
        //
        
        var relSnippet = '';
        /*
        if (typeof meal.blogSearch != 'undefined' && meal.blogSearch.results.length > 0) {
            relSnippet = '<span class="mealInfo"><i>&nbsp;related food blog posts:</i><br/><div class="relatedInfo">';
            var refsUsed = 0;
            
            for (iRef = 0; iRef < meal.blogSearch.results.length; iRef++) {
            
                if (refsUsed >= 2) {
                    break;
                }
            
                
                if (meal.blogSearch.results[iRef].unescapedUrl.match('.mov') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('bigoven.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('recipezaar.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('/video/') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('video.') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('about.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('cdkitchen.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('cooks.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('citysearch.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('menuism.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('mefeedia.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('urbanspoon.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('smarthome.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('beprepared.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('allrecipes.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('restaurant') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('ebay.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('recipes.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('cooks.com') ||
                    meal.blogSearch.results[iRef].unescapedUrl.match('afullcup.com')) {
                    
                    continue;
                }
                
                refsUsed++;
            
                var contentStr = null;
                contentStr = meal.blogSearch.results[iRef].content;
                
                if (contentStr.length > 80) {
                    contentStr  = contentStr.substr(0, 80) + '...';
                }
                
                //contentStr = unescape(contentStr);
                contentStr = contentStr.replace(/<[^>]*>/g, '');
                contentStr = contentStr.replace(/</g, '');
                //contentStr = contentStr.replace("<b>", " ");
                //contentStr = contentStr.replace('</b>', '');
                
                var visibleUrl = '';
                visibleUrl = meal.blogSearch.results[iRef].visibleUrl;
                visibleUrl = visibleUrl.replace('www.', '');
                visibleUrl = visibleUrl.replace('.com', '');
                visibleUrl = visibleUrl.replace('.blogspot', '');
                visibleUrl = visibleUrl.replace('.typepad', '');
                visibleUrl = visibleUrl.replace('.wordpress', '');
                
                relSnippet += '<img src="' + this.uriBase + 'img/icons/8-em-plus.png" width="8" height="8" alt="link"/>&nbsp;<b><a href="' + meal.blogSearch.results[iRef].unescapedUrl  + '">';
                relSnippet += meal.blogSearch.results[iRef].titleNoFormatting  + '</a></b> - ' + visibleUrl  + '<br/>';
                relSnippet += contentStr;
                relSnippet += '<br/>';
            }            
            relSnippet += '</div></span>';
        }*/
        
        this.itemTemplate.append(anchor, {
            id: this.$$ctl('meal', meal), 
            MealId: meal.id,
            MealTitle: meal.title,
            MealTags: tags,
            MealAuthor: meal.owner,
            MealSource: sourceLine,
            MealNotes: ((meal.notes.length > 0) ? this.doMarkdown(meal.notes) + "<br />" : ""),
            MealDate: shortDateString(meal.date),
            EditLink: editLink,
            RelatedLink: relSnippet,
            DivClass: (meal.isOdd ? 'mealDivOdd' : 'mealDivEven'),
            CommentLine: commentLine,
            StarSnippet: starSnippet,
            CtrlId: this.ctrlId
        });
        
        if (meal.editable) {
        
            element = $get(this.$$ctl('editMeal', meal));
            YAHOO.util.Event.addListener(element, 'click', this.editHandler, meal, this);
            
            element = $get(this.$$ctl('star', meal));
            YAHOO.util.Event.addListener(element, 'click', this.starHandler, meal, this);
            
            var deleteLink = $get(this.$$ctl('deleteLink', meal));
            this.y.util.Event.addListener(deleteLink, 'click', this.deleteClickHandler, meal, this);
        }
        
        var sourceElement = $get(this.$$ctl('sourceLine', meal));
        if (sourceName.length == 0) {
            sourceElement.style.display = "none";
        }

        if (tags.length == 0) {
            element = $get(this.$$ctl('tagsLine', meal));
            element.style.display = "none";
        }

        if (meal.notes.length == 0) {
            element = $get(this.$$ctl('notes', meal));
            element.style.display = "none";
            
            if (sourceName.length > 0) {
                sourceElement.innerHTML += "<br />";
            }
        }
    },

    appendMealTiny: function (anchor, meal) {

        var commentSnippet = '(' + meal.commentCount + ')';
        
        this.tinyItemTemplate.append(anchor, {
            id: this.$$ctl('meal', meal), 
            MealId: meal.id,
            MealTitle: meal.title,
            CommentSnippet: commentSnippet,
            CtrlId: this.ctrlId,
            AnchorClass: 'mealSummaryLink'
        });

        if (meal.lastCommentUser.length > 1) {
            element = $get(this.$$ctl('mealSummaryItemLink', meal));
            var commentBody = meal.lastCommentBody;
            if (commentBody.length > 80) {
                commentBody = commentBody.substr(0, 80) + ' . . . ';
            }
            var b = '<b>' + meal.lastCommentUser + '</b> said,<br/> "' + commentBody + '"';
            new YAHOO.widget.Tooltip(this.$$ctl('mealTooltip', meal), { context:element, text:b });
        }
    },

    appendMealNice: function (anchor, meal) {

        var commentSnippet = '<span style="font-size: x-small; color: #888888;">' + shortDateString(meal.date) + '<br/><span style="font-size: small; color: #666666;">' + ((meal.notes.length > 0) ? this.doMarkdown(meal.notes) + '</span><br/>' : "");
        commentSnippet += '</span>';
        this.tinyItemTemplate.append(anchor, {
            id: this.$$ctl('meal', meal), 
            MealId: meal.id,
            MealTitle: meal.title,
            CommentSnippet: commentSnippet,
            CtrlId: this.ctrlId,
            DivClass: meal.isOdd ? 'mealDivOdd' : 'mealDivEven',
            AnchorClass: 'mealListLink'
        });

        /*
        if (meal.lastCommentUser.length > 1) {
            element = $get(this.$$ctl('mealSummaryItemLink', meal));
            var commentBody = meal.lastCommentBody;
            if (commentBody.length > 80) {
                commentBody = commentBody.substr(0, 80) + ' . . . ';
            }
            var b = '<b>' + meal.lastCommentUser + '</b> said,<br/> "' + commentBody + '"';
            new YAHOO.widget.Tooltip(this.$$ctl('mealTooltip', meal), { context:element, text:b });
        }*/
    },

    appendComment: function (anchor, comment) {

        var commentTitle = 'Comment by <b>' + comment.author + '</b>';
        var commentBody = comment.body;
        
        if (commentBody.length > 200) {
            commentBody = commentBody.substr(0, 200) + ' . . . ';
        }
        
        this.commentTemplate.append(anchor, {
            id: this.$$ctl('comment', comment), 
            MealId: comment.mealId,
            DivClass: (comment.isOdd ? 'mealDivOdd' : 'mealDivEven'),
            CommentId: comment.id, 
            CommentTitle: commentTitle,
            CommentBody: commentBody,
            CtrlId: this.ctrlId
        });
    },

	// Define various event handlers for Dialog
	deleteClickHandlerDoDelete:  function() {
        CalendarWebService.DeleteMeal(this.meal.id, refreshMealList, null, this.mealList);
		this.hide();
	},
	
	deleteClickHandlerCancel: function() {
		this.hide();
	},

    deleteClickHandler: function(e, meal) {
	    // Instantiate the Dialog
	    var x = new YAHOO.widget.SimpleDialog(this.$$ctl('deleteConfirmationDialog', meal), 
											 { width: "400px",
											   fixedcenter: true,
											   visible: false,
											   draggable: false,
											   close: false,
											   modal: false,
											   text: 'Do you really want to delete <b>' + meal.title + '</b>?',
											   icon: YAHOO.widget.SimpleDialog.ICON_WARN,
											   constraintoviewport: true,
											   effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.25},
											   buttons: [ { text:"Yes", handler:this.deleteClickHandlerDoDelete, isDefault:true },
														  { text:"No",  handler:this.deleteClickHandlerCancel } ]
											 } );
        x.setHeader('Delete Confirmation');															     
	
	    // Render the Dialog
	    x.meal = meal;
	    x.mealList = this;
	    //x.render(this.$$ctl('mealAnchor', meal));
	    //x.render(document.body);
	    x.render('yuiSkinAnchor');

	    //YAHOO.util.Event.addListener("show", "click", x.show, x, true);
	    //YAHOO.util.Event.addListener("hide", "click", x.hide, x, true);
	    x.show();
    },
    	
    //
    // invoked when switching to edit mode for a meal.
    // 'this' = the meal being edited.
    //

    editHandler: function (e, meal) {
        this.y.util.Event.preventDefault(e);
        this.y.util.Event.stopPropagation(e);
        
        var anchor = $get(this.$$ctl('mealAnchor', meal));
        var item = $get(this.$$ctl('mealItem', meal));
        var notesTextArea = '<textarea rows="12" cols="20" class="textBoxStyle" style="width:80%;" id="' + this.$$ctl('notesBox', meal) + '">' + meal.notes + '</textarea>';
        var textBoxHeader = '<input type="text" class="textBoxHeader" style="width: 100%; font-size: x-large;" id="' + this.$$ctl('titleBox', meal) + '" />';
        var editTemplate = new YAHOO.ext.DomHelper.Template(decodeURI($get(this.editTemplateId).innerHTML));
        editTemplate.insertAfter(anchor, {
            id: 'mealEdit' + meal.id, 
            MealId: meal.id,
            MealTitle: meal.title,
            MealAuthor: meal.owner,
            NotesTextArea: notesTextArea,
            DivClass: (meal.isOdd ? 'mealDivOdd' : 'mealDivEven'),
            TextBoxHeader: textBoxHeader,
            CtrlId: this.ctrlId            
        });
        
        var cancelLink = $get(this.$$ctl('cancelMeal', meal));
        this.y.util.Event.addListener(cancelLink, 'click', this.cancelHandler, meal, this);
        
        var saveLink = $get(this.$$ctl('saveMeal', meal));
        this.y.util.Event.addListener(saveLink, 'click', this.saveHandler, meal, this);
        
        this.setKeyPressHandler(this.$$ctl('titleBox', meal), meal);
        this.setKeyPressHandler(this.$$ctl('tagsBox', meal), meal);
        this.setKeyPressHandler(this.$$ctl('sourceBox', meal), meal);
        this.setKeyPressHandler(this.$$ctl('dateBox', meal), meal);

        setBoxValue(this.$$ctl('tagsBox', meal), meal.tags);
        setBoxValue(this.$$ctl('notesBox', meal), meal.notes);
        setBoxValue(this.$$ctl('titleBox', meal), meal.title);    
        setBoxValue(this.$$ctl('sourceBox', meal), meal.source);
        setBoxValue(this.$$ctl('dateBox', meal), shortDateString(meal.date));
        
        item.style.display = "none";
    },


    //
    // invoked when the star is clicked on a meal
    // 'this' = the meal being edited.
    //

    starHandler: function (e, meal) {
        this.y.util.Event.preventDefault(e);
        this.y.util.Event.stopPropagation(e);
        
        var star = $get(this.$$ctl('star', meal));

        var altText = ((meal.rating > 0)? 'unmark this as a favorite' : 'mark this as a favorite');
        star.alt = altText;
        if (meal.rating == 0) {
            meal.rating = 1;
            star.src = this.uriBase + 'img/icons/star.png';
        } else {
            meal.rating = 0;
            star.src = this.uriBase + 'img/icons/star-faded.png';
        }

        CalendarWebService.EditMealRating(meal.id, meal.rating, null, null);
        this.refreshCalendar();
    },

    setKeyPressHandler: function (elem, ctxt) {
        var e= $get(elem);
        //this.y.util.Event.addListener(e, 'keydown', this.editKeyPress, ctxt, this);
        this.y.util.Event.addListener(e, 'keypress', this.editKeyPress, ctxt, this);
    },

    editKeyPress: function (e, meal) {
        if (e.keyCode == 13) {
            YAHOO.util.Event.preventDefault(e);
            YAHOO.util.Event.stopPropagation(e);
            this.startSave(meal);
        }
    },

    cancelHandler: function (e, meal) {
        this.y.util.Event.preventDefault(e);
        this.y.util.Event.stopPropagation(e);

        var anchor = $get(this.$$ctl('mealAnchor', meal));
        var item = $get(this.$$ctl('mealItem', meal));
        var editItem = $get(this.$$ctl('mealEditItem', meal));
        
        editItem.style.display = "none";
        item.style.display = "block";
    },

    saveHandler_Succeeded: function (meal, mealList, methodName) {
        var anchor = $get(mealList.$$ctl('mealAnchor', meal));
        var item = $get(mealList.$$ctl('mealItem', meal));
        var editItem = $get(mealList.$$ctl('mealEditItem', meal));
        item.style.display = "block";
        editItem.style.display = "block";
        anchor.removeChild(item);
        editItem.parentNode.removeChild(editItem);
        
        mealList.appendMeal(anchor, meal);    
        
        mealList.refreshCalendar();
    },
    
    refreshCalendar: function() {
        if (typeof(g_UserCalendar) != "undefined") {
            g_SkipMealListRefresh = this;
            refreshCalendar();
        }
    },

    saveHandler: function (e, meal) {
        this.y.util.Event.preventDefault(e);
        this.y.util.Event.stopPropagation(e);

        this.startSave(meal);
    },

    startSave: function (meal) {
        meal.title = $get(this.$$ctl('titleBox', meal)).value;
        meal.notes = $get(this.$$ctl('notesBox', meal)).value;
        meal.tags = $get(this.$$ctl('tagsBox', meal)).value;
        meal.source = $get(this.$$ctl('sourceBox', meal)).value;
        var date = $get(this.$$ctl('dateBox', meal)).value;
        
        CalendarWebService.EditMeal(meal.id, meal.title, meal.notes, meal.source, meal.tags, date, this.saveHandler_Succeeded, null, this);
    },



    doMarkdown: function (text) {
        if (this.markdownConverter == null) {
            this.markdownConverter = new Showdown.converter();
        }
        var html = this.markdownConverter.makeHtml(text);
        
        //
        // For some reason showdown puts <p> around the body.  Remove that.
        //
        
        html = html.substring(3);
        html = html.substring(0, html.length - 4);
        
        return html;
    },

    initPager: function () {
        if (this.disablePager) {
            return;
        }
        this.y.util.Event.addListener($get(this.$outer('navBack')), 'click', this.navHandler, -1, this);
        this.y.util.Event.addListener($get(this.$outer('navForward')), 'click', this.navHandler, 1, this);
    },

    updatePager: function () {
        if (this.disablePager) {
            return;
        }
        pager = $get(this.$outer('listPagerText'));
        pageNum = this.getPageNum();
        
        var navForward = $get(this.$outer('navForward'))
        var navBackward = $get(this.$outer('navBack'));
        
        pager.innerHTML = 'Page ' + pageNum + ' of ' + this.numPages;

        if (pageNum == 1 && this.numPages > 1) {
            navForward.style.display = "inline";
            navBackward.style.display = "none";
            pager.display = "inline";    
        } else if (pageNum > 1 && pageNum == this.numPages) {
            navBackward.style.display = "inline";
            navForward.style.display = "none";
            pager.display = "inline";    
        } else if (pageNum > 1) {
            navBackward.style.display = "inline";
            navForward.style.display = "inline";
            pager.display = "inline";    
        } else if (pageNum == 1 && this.numPages == 1) {
            navBackward.style.display = "none";
            navForward.style.display = "none";
            pager.style.display = "none";
        }
    },

    navHandler: function (e, increment) {
        this.y.util.Event.preventDefault(e);
        this.y.util.Event.stopPropagation(e);

        if (increment > 0) {
            this.direction = 'f';
        } else {
            this.direction = 'b';
        }

        this.setPageNum( this.getPageNum() + increment );
        this.refreshSame();
    },


    refresh: function(queryType, q) {
    
        if (g_SkipMealListRefresh == this) {
            return;
        }
        
        this.setQuery(q);
        this.setListType(queryType);
        this.refreshSame();
    },
    
    refreshSame: function() {
        //this.animOut();
        this.refreshSameReal();
    },
    
    refreshSameReal: function() {
        this.startGlobalProgress();
        CalendarWebService.QueryVerboseMeals(this.getPageNum(), this.getPageSize(), this.getListType(), this.getQuery(), this.queryMealsSucceeded, null/*failure*/, this);
    },
    

    animOut2: function() {
    
        //
        // Ease the meal list out.
        //
        
        var list = $get(this.listContentId);
        
        list.oldWidth = list.clientWidth;
        list.style.overflow = 'hidden';
        var outAttributes = {   
                width: { to: 0 }   
                };   
                
        var anim = new YAHOO.util.Anim(list, outAttributes, 0.4, YAHOO.util.Easing.backOut);  
        anim.animate();
        anim.onComplete.subscribe(this.refreshSameReal, this, true);
    },
    
    animOut: function() {
    
        if (this.disableAnim == true) {
            this.endOfAnimOut();
            return;
        }
    
        //
        // Ease the meal list out.
        //
        
        var list = $get(this.listContentId);
        //list.style.zIndex = 100;
        var anim = null;
        if (this.direction == 'f') {
	        anim = new YAHOO.util.Motion(list, { points: {to: [list.oldX-list.oldWidth,list.oldY], from: [list.oldX, list.oldY] } }, 0.2, YAHOO.util.Easing.easeInStrong );
	    } else {
	        anim = new YAHOO.util.Motion(list, { points: {to: [list.oldX+list.oldWidth,list.oldY], from:[list.oldX, list.oldY] } }, 0.2, YAHOO.util.Easing.easeInStrong );
	    }
	    
        anim.onComplete.subscribe(this.endOfAnimOut, this, true);
        anim.animate();
    },
    
    endOfAnimOut: function() {
        this.queryMealsSucceededReal(this.mealArray, this, this.methodName);
    },

    animIn: function() {
    
        if (this.disableAnim == true) {
            return;
        }
        
        //
        // Ease the meal list in.
        //
        
        var list = $get(this.listContentId);
        //list.style.zIndex = 100;
        var anim = null;
        if (this.direction == 'f') {
	        anim = new YAHOO.util.Motion(list, { points: {to: [list.oldX,list.oldY], from:[list.oldWidth+list.oldX, list.oldY] } }, 0.2, YAHOO.util.Easing.easeOut );
	    } else {
	        anim = new YAHOO.util.Motion(list, { points: {to: [list.oldX,list.oldY], from: [list.oldX-list.oldWidth, list.oldY] } }, 0.2, YAHOO.util.Easing.easeOut );
	    }
        anim.animate();
    },

    showAsEditable: function (e){
	    YAHOO.util.Event.preventDefault(e);
	    YAHOO.util.Event.stopPropagation(e);

	    if(this.oldBG == undefined) {
		    var pos = this;

		    while(pos && pos.style.backgroundColor == '') {
			    pos = pos.parentNode;
		    }

		    this.oldBG = pos.style.backgroundColor;
	    }

	    this.style.backgroundColor = "#EEE8AA";
    },

    showAsNotEditable: function (e){/*
	    YAHOO.util.Event.preventDefault(e);
	    YAHOO.util.Event.stopPropagation(e);

	    var anim = new YAHOO.util.ColorAnim (
		    this,
		    {backgroundColor:{to:this.oldBG}},
		    .5,
		    YAHOO.util.Easing.easeOut
	    );

            anim.animate();*/
        if (this.isEditing == true) {
            return;
        }
        this.style.backgroundColor = this.oldBG;
    },

    startProgress: function(insertAfter) {
        if (this.progressElement != null) {
            return;
        }
        
        var image = document.createElement('img');
        image.setAttribute('src', this.uriBase + 'img/progress-small-black.gif');
        image.setAttribute('width', '16');
        image.setAttribute('height', '16');
        image.setAttribute('alt', 'in progress...');
        
        insertAfter.appendChild(image);
        this.progressElement = image;
    },
    
    stopProgress: function() {
        if (this.progressElement == null) {
            return;
        }
        this.progressElement.parentNode.removeChild(this.progressElement);
        this.progressElement = null;
    },
    
    startGlobalProgress: function() {
        if (this.disableProgress) {
            return;
        }
        
        this.startProgress($get(this.$outer("globalProgressAnchor")));
    },
    
    isProgressActive: function() {
        if (this.progressElement == null) {
            return false;
        }
        return true;
    },

    cancelFunction: function (e, target) {
        target.isEditing = false;
	    target.style.display = 'block';
	    target.style.backgroundColor = target.oldBG;
	    $get(target.id + '_editor').parentNode.
		    removeChild($get(target.id + '_editor'));
    },

    getDisableAnim: function () {
        return (getHiddenFieldValue(this.$outer('disableAnim')) == 'true' ? true : false);
    },

    getListDisplayType: function () {
        return getHiddenFieldValue(this.$outer('listDisplayType'));
    },

    setPageNum: function (n) {
        setHiddenFieldValue(this.$outer('pageNum'), n);
    },

    getPageNum: function () {
        return parseInt(getHiddenFieldValue(this.$outer('pageNum')));
    },

    setPageSize: function (n) {
        setHiddenFieldValue(this.$outer('pageSize'), n);
    },

    getPageSize: function () {
        return parseInt(getHiddenFieldValue(this.$outer('pageSize')));
    },

    getListType: function () {
        return getHiddenFieldValue(this.$outer('listType'));
    },

    setListType: function (n) {
        setHiddenFieldValue(this.$outer('listType'), n);
    },

    getQuery: function () {
        return getHiddenFieldValue(this.$outer('listQuery'));
    },

    setQuery: function (n) {
        setHiddenFieldValue(this.$outer('listQuery'), n);
    },

    $outer: function(e) {
        return this.controlRoot + e;
    },
    
    $ctl: function(s) {
        return s + this.ctrlId;
    },
    
    $$ctl: function(s, m) {
        return this.$ctl(s) + '_' + m.id;
    }

/*
function onMealEditKey(e, id) {
    var keyCode = (window.event) ? event.keyCode : e.which; 
    if (keyCode == 13) {
    }
}*/
}

Bandit.MealList.registerClass('Bandit.MealList', null, Sys.IDisposable);

function refreshMealList(nothing, ml) {
    ml.refreshSame();
}