/* Generated at 2012-02-01 09:11:27.0 America/Denver */

var JSAN = { "use": function () {} };


/* /usr/local/share/vegguide/js-source/DOM/Utils.js */



if ( typeof( DOM ) == 'undefined' ) {
    DOM = {};
}



DOM.Utils = {
    EXPORT: [ '$' ]
   ,'$' : function () {
        var elements = new Array();

        for (var i = 0; i < arguments.length; i++) {
            var element = arguments[i];

            if (typeof element == 'string')
                element = document.getElementById(element)
                    || document.getElementsByName(element)[0]

                    || undefined
                ;

            if (arguments.length == 1) 
                return element;

            elements.push( element );
        }

        return elements;
    }
};


window["$"] = DOM.Utils["$"];
$ = window["$"];



document.getElementsByClass = function(className) {
    var children = document.getElementsByTagName('*') || document.all;
    var elements = new Array();
  
    for (var i = 0; i < children.length; i++) {
        var child = children[i];
        var classNames = child.className.split(' ');
        for (var j = 0; j < classNames.length; j++) {
            if (classNames[j] == className) {
              elements.push(child);
              break;
            }
        }
    }
  
    return elements;
};
document.getElementsByClassName = document.getElementsByClass;




/* /usr/local/share/vegguide/js-source/DOM/Element.js */



try {
    JSAN.use( 'DOM.Utils' );
} catch (e) {
    throw "DOM.Element requires JSAN to be loaded";
}

if ( typeof( DOM ) == 'undefined' ) {
    DOM = {};
}





DOM.Element = {

    

    hide: function() {
        for (var i = 0; i < arguments.length; i++) {
            var element = $(arguments[i]);
            if ( element && element.nodeType == 1 ) {
                element.style.display = 'none';
            }
        }
    }

    

   ,show: function() {
        for (var i = 0; i < arguments.length; i++) {
            var element = $(arguments[i]);
            if ( element && element.nodeType == 1 ) {
                element.style.display = '';
            }
        }
    }

    

   ,toggle: function() {
        for (var i = 0; i < arguments.length; i++) {
            var element = $(arguments[i]);
            if ( element && element.nodeType == 1 )
                element.style.display =
                    (element.style.display == 'none' ? '' : 'none');
        }
    }

    

   ,remove: function() {
        for (var i = 0; i < arguments.length; i++) {
            element = $(arguments[i]);
            if ( element )
                element.parentNode.removeChild(element);
        }
    }

    

   ,getHeight: function(element) {
        element = $(element);
        if ( !element ) return;
        return element.offsetHeight;
    }

    

   ,hasClassName: function(element, className) {
        element = $(element);
        if ( !element || element.nodeType != 1 ) return;
        var a = element.className.split(' ');
        for (var i = 0; i < a.length; i++) {
            if (a[i] == className)
                return true;
        }
        return false;
    }

    

   ,addClassName: function(element, className) {
        element = $(element);
        if ( !element || element.nodeType != 1 ) return;
        DOM.Element.removeClassName(element, className);
        element.className += ' ' + className;
    }

    

   ,removeClassName: function(element, className) {
        element = $(element);
        if ( !element || element.nodeType != 1 ) return;

        var newClassnames = new Array();
        var a = element.className.split(' ');
        for (var i = 0; i < a.length; i++) {
            if (a[i] != className) {
                newClassnames.push( a[i] );
            }
        }
        element.className = newClassnames.join(' ');
    }

    

   ,cleanWhitespace: function() {
        var element = $(element);
        if ( !element ) return;
        for (var i = 0; i < element.childNodes.length; i++) {
            var node = element.childNodes[i];
            if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
                DOM.Element.remove(node);
        }
    }



};




/* /usr/local/share/vegguide/js-source/DOM/Events.js */



(function () {
	if(typeof DOM == "undefined") DOM = {};
	DOM.Events = {};
	
    DOM.Events.VERSION = "0.02";
	DOM.Events.EXPORT = [];
	DOM.Events.EXPORT_OK = ["addListener", "removeListener"];
	DOM.Events.EXPORT_TAGS = {
		":common": DOM.Events.EXPORT,
		":all": [].concat(DOM.Events.EXPORT, DOM.Events.EXPORT_OK)
	};
	
	
	
	var listenerList = [null];
	

    
	DOM.Events.addListener = function(elt, ev, func, makeCompatible) {
		var usedFunc = func;
        var id = listenerList.length;
		if(makeCompatible == true || makeCompatible == undefined) {
			usedFunc = makeCompatibilityWrapper(elt, ev, func);
		}
		if(elt.addEventListener) {
			elt.addEventListener(ev, usedFunc, false);
			listenerList[id] = [elt, ev, usedFunc];
			return id;
		}
		else if(elt.attachEvent) {
			elt.attachEvent("on" + ev, usedFunc);
			listenerList[id] = [elt, ev, usedFunc];
			return id;
		}
		else return false;
	};
	


	DOM.Events.removeListener = function() {
		var elt, ev, func;
		if(arguments.length == 1 && listenerList[arguments[0]]) {
			elt  = listenerList[arguments[0]][0];
			ev   = listenerList[arguments[0]][1];
			func = listenerList[arguments[0]][2];
			delete listenerList[arguments[0]];
		}
		else if(arguments.length == 3) {
			elt  = arguments[0];
			ev   = arguments[1];
			func = arguments[2];
		}
		else return;
		
		if(elt.removeEventListener) {
			elt.removeEventListener(ev, func, false);
		}
		else if(elt.detachEvent) {
			elt.detachEvent("on" + ev, func);
		}
	};
	
    var rval;
    
    function makeCompatibilityWrapper(elt, ev, func) {
        return function (e) {
            rval = true;
            if(e == undefined && window.event != undefined)
                e = window.event;
            if(e.target == undefined && e.srcElement != undefined)
                e.target = e.srcElement;
            if(e.currentTarget == undefined)
                e.currentTarget = elt;
            if(e.relatedTarget == undefined) {
                if(ev == "mouseover" && e.fromElement != undefined)
                    e.relatedTarget = e.fromElement;
                else if(ev == "mouseout" && e.toElement != undefined)
                    e.relatedTarget = e.toElement;
            }
            if(e.pageX == undefined) {
                if(document.body.scrollTop != undefined) {
                    e.pageX = e.clientX + document.body.scrollLeft;
                    e.pageY = e.clientY + document.body.scrollTop;
                }
                if(document.documentElement != undefined
                && document.documentElement.scrollTop != undefined) {
                    if(document.documentElement.scrollTop > 0
                    || document.documentElement.scrollLeft > 0) {
                        e.pageX = e.clientX + document.documentElement.scrollLeft;
                        e.pageY = e.clientY + document.documentElement.scrollTop;
                    }
                }
            }
            if(e.stopPropagation == undefined)
                e.stopPropagation = IEStopPropagation;
            if(e.preventDefault == undefined)
                e.preventDefault = IEPreventDefault;
            if(e.cancelable == undefined) e.cancelable = true;
            func(e);
            return rval;
        };
    }
    
    function IEStopPropagation() {
        if(window.event) window.event.cancelBubble = true;
    }
    
    function IEPreventDefault() {
        rval = false;
    }

	function cleanUpIE () {
		for(var i=0; i<listenerList.length; i++) {
			var listener = listenerList[i];
			if(listener) {
				var elt = listener[0];
                var ev = listener[1];
                var func = listener[2];
				elt.detachEvent("on" + ev, func);
			}
		}
        listenerList = null;
	}

	if(!window.addEventListener && window.attachEvent) {
		window.attachEvent("onunload", cleanUpIE);
	}

})();




/* /usr/local/share/vegguide/js-source/DOM/Ready.js */

if ( typeof DOM == "undefined" ) {
    DOM = {};
}

DOM.Ready = {};

DOM.Ready.VERSION = "0.17";

DOM.Ready.finalTimeout = 15;
DOM.Ready.timerInterval = 50;

DOM.Ready._checkDOMReady = function () {
    if ( DOM.Ready._isReady ) {
        return DOM.Ready._isReady;
    }

    if (    typeof document.getElementsByTagName != "undefined"
         && typeof document.getElementById != "undefined"
         && ( document.getElementsByTagName("body")[0] !== null
              || document.body !== null ) ) {

        DOM.Ready._isReady = 1;
    }

    return DOM.Ready._isReady;

};


DOM.Ready._checkDOMDone = function () {
    if ( DOM.Ready._isDone ) {
        return DOM.Ready._isDone;
    }

    /*@cc_on
       /*@if (@_win32)
    try {
        document.documentElement.doScroll("left");
        DOM.Ready._isDone = 1;
    } catch (e) {}
          @else @*/
    
    if ( document.readyState
         && ( /complete|loaded/.test( document.readyState ) )
       ) {
        DOM.Ready._isDone = 1;
    }
      /*@end
    @*/

    return DOM.Ready._isDone;
};


if ( document.addEventListener ) {
    document.addEventListener(
        "DOMContentLoaded", function () { DOM.Ready._isDone = 1; }, false );
}

DOM.Ready.onDOMReady = function (callback) {
    if ( DOM.Ready._checkDOMReady() ) {
        callback();
    }
    else {
        DOM.Ready._onDOMReadyCallbacks.push(callback);
    }
};

DOM.Ready.onDOMDone = function (callback) {
    if ( DOM.Ready._checkDOMDone() ) {
        callback();
    }
    else {
        DOM.Ready._onDOMDoneCallbacks.push(callback);
    }
};

DOM.Ready.onIdReady = function ( id, callback ) {
    if ( DOM.Ready._checkDOMReady() ) {
        var elt = document.getElementById(id);
        if (elt) {
            callback(elt);
            return;
        }
    }

    var callback_array = DOM.Ready._onIdReadyCallbacks[id];
    if ( ! callback_array ) {
        callback_array = [];
    }
    callback_array.push(callback);

    DOM.Ready._onIdReadyCallbacks[id] = callback_array;
};

DOM.Ready._runDOMReadyCallbacks = function () {
    for ( var i = 0; i < DOM.Ready._onDOMReadyCallbacks.length; i++ ) {
        DOM.Ready._onDOMReadyCallbacks[i]();
    }

    DOM.Ready._onDOMReadyCallbacks = [];
};

DOM.Ready._runDOMDoneCallbacks = function () {
    for ( var i = 0; i < DOM.Ready._onDOMDoneCallbacks.length; i++ ) {
        DOM.Ready._onDOMDoneCallbacks[i]();
    }

    DOM.Ready._onDOMDoneCallbacks = [];
};

DOM.Ready._runIdCallbacks = function () {
    for ( var id in DOM.Ready._onIdReadyCallbacks ) {
        
        if ( ! DOM.Ready._onIdReadyCallbacks.hasOwnProperty(id) ) {
            continue;
        }

        var elt = document.getElementById(id);

        if (elt) {
            for ( var i = 0; i < DOM.Ready._onIdReadyCallbacks[id].length; i++) {
                DOM.Ready._onIdReadyCallbacks[id][i](elt);
            }

            delete DOM.Ready._onIdReadyCallbacks[id];
        }
    }
};

DOM.Ready._runReadyCallbacks = function () {
    if ( DOM.Ready._inRunReadyCallbacks ) {
        return;
    }

    DOM.Ready._inRunReadyCallbacks = 1;

    if ( DOM.Ready._checkDOMReady() ) {
        DOM.Ready._runDOMReadyCallbacks();

        DOM.Ready._runIdCallbacks();
    }

    if ( DOM.Ready._checkDOMDone() ) {
        DOM.Ready._runDOMDoneCallbacks();
    }

    DOM.Ready._timePassed += DOM.Ready._lastTimerInterval;

    if ( ( DOM.Ready._timePassed / 1000 ) >= DOM.Ready.finalTimeout ) {
        DOM.Ready._stopTimer();
    }

    DOM.Ready._inRunReadyCallbacks = 0;
};

DOM.Ready._startTimer = function () {
    DOM.Ready._lastTimerInterval = DOM.Ready.timerInterval;
    DOM.Ready._intervalId = setInterval( DOM.Ready._runReadyCallbacks, DOM.Ready.timerInterval );
};

DOM.Ready._stopTimer = function () {
    clearInterval( DOM.Ready._intervalId );
    DOM.Ready._intervalId = null;
};

DOM.Ready._resetClass = function () {
    DOM.Ready._stopTimer();

    DOM.Ready._timePassed = 0;

    DOM.Ready._isReady = 0;
    DOM.Ready._isDone = 0;

    DOM.Ready._onDOMReadyCallbacks = [];
    DOM.Ready._onDOMDoneCallbacks = [];
    DOM.Ready._onIdReadyCallbacks = {};

    DOM.Ready._startTimer();
};

DOM.Ready._resetClass();

DOM.Ready.runCallbacks = function () { DOM.Ready._runReadyCallbacks(); };





/* /usr/local/share/vegguide/js-source/DOM/Find.js */



if ( typeof DOM == "undefined") DOM = {};

DOM.Find = {

  VERSION: 1.00,

  EXPORT: [ 'checkAttributes','getElementsByAttributes', 'geba' ],




  checkAttributes: function(hash,el){
  
      
 
      if( el === undefined || el === null )
        throw("Second argument to checkAttributes should be a DOM node or the ID of a DOM Node");
  
      if( el.constructor === String )
        el = document.getElementById(el);
    
      if( el === null || !el.nodeType ) 
        throw("Second argument to checkAttributes should be a DOM node or the ID of a DOM Node");

      if(! (hash instanceof Object))
        throw("First argument to checkAttributes should be an Object of attribute/test pairs. See the documentation for more information.");

      

      for(key in hash){
  
        
        
        
        
        
    
        var pointer = el      
        var last    = null;   
        
        var pieces  = key.split('.');                   
        
        for(var i=0; i<pieces.length; i++){             
          
          
          if(!pointer[pieces[i]]) return false;         
          
          last    = pointer;                            
          
          pointer = pointer[pieces[i]];                 
        }
        
        
        
        
        
        
        
        
        if( pointer instanceof Function )
          try {
            pointer = pointer.apply(last);
          }catch(error){
            throw("First agrument to checkAttributes included a Function Refrence which caused an ERROR: " +  error);
          }
    
        
    
        
        
    
        
        if( hash[key] instanceof RegExp ){
          if( !hash[key].test( pointer ) )
             return false;
        
        
        }else if( hash[key] instanceof Function ){
          if( !hash[key]( pointer ) )
            return false;

        
        }else if( hash[key] != pointer ){
          return false;
        }    
        
      }

      return true;
  },



  getElementsByAttributes: function( searchAttributes, startAt, resultsLimit, depthLimit ) {

     
     if(depthLimit !== undefined && depthLimit <= 0) return [];
   
     
     if(startAt === undefined){
       startAt = document;
   
     
     }else if(typeof startAt == 'string'){
       startAt = document.getElementById(startAt);
     }
 
     
     var results = DOM.Find.checkAttributes(searchAttributes, startAt) ? [ startAt ] : [];
   
     
     if(resultsLimit == 1 && results.length > 0) return results;

     
     if (startAt.childNodes)
       for( var i = 0; i < startAt.childNodes.length; i++){
         
         results = results.concat( 
            DOM.Find.getElementsByAttributes( searchAttributes, startAt.childNodes[i], (resultsLimit) ? resultsLimit - results.length : undefined, (depthLimit) ? depthLimit -1 : undefined )
         )
         if (resultsLimit !== undefined && results.length >= resultsLimit) break;
       }
      
     return results;
  }

}




/* /usr/local/share/vegguide/js-source/Form/Serializer.js */

if ( typeof Form == "undefined" ) {
    Form = {};
}

Form.Serializer = function (name) {
    return this._initialize(name);
};

Form.Serializer.VERSION = "0.14";

Form.Serializer.ElementTypes = [ "input", "textarea", "select" ];

Form.Serializer.prototype._initialize = function (form) {
    if ( typeof form == "object" ) {
        this.form = form;
        return;
    }

    this.form = document.getElementById(form);

    if ( ! this.form ) {
        for ( var i = 0; i < document.forms.length; i++ ) {
            if ( document.forms[i].name == form ) {
                this.form = document.forms[i];
                break;
            }
        }
    } 

    if ( ! this.form ) {
        throw new Error( "Cannot find a form with the name or id '" + name + "'" );
    }
};

Form.Serializer.prototype.pairsArray = function () {
    var pairs = new Array;

    for ( var i = 0; i < Form.Serializer.ElementTypes.length; i++ ) {
        var type = Form.Serializer.ElementTypes[i];
        var elements = this.form.getElementsByTagName(type);

        for ( var j = 0; j < elements.length; j++ ) {

            var p = eval( "this._serialize_" + type + "(elements[j])" );

            if (p) {
                for ( var k = 0; k < p.length; k++ ) {
                    pairs.push( p[k] );
                }
            }
        }
    }

    return pairs;
}

Form.Serializer.prototype._serialize_input = function (elt) {
    switch (elt.type.toLowerCase()) {
      case "hidden":
      case "password":
      case "text":
          return this._simple(elt);

      case "checkbox":  
      case "radio":
          return this._simple_if_checked(elt);

      default:
          return false;
    }
}

Form.Serializer.prototype._simple = function (elt) {
    return [ [ elt.name, elt.value ] ];
}

Form.Serializer.prototype._simple_if_checked = function (elt) {
    if ( ! elt.checked ) {
        return;
    }

    return this._simple(elt);
}

Form.Serializer.prototype._serialize_textarea = function (elt) {
    return this._simple(elt);
}

Form.Serializer.prototype._serialize_select = function (elt) {
    var options = elt.options;

    var serialized = new Array;
    for ( var i = 0; i < options.length; i++ ) {
        if ( options[i].selected ) {
            serialized.push( [ elt.name, options[i].value ] );
        }
    }
        
    return serialized;
}

Form.Serializer.prototype.queryString = function () {
    var pairs = this.pairsArray();

    var queryPairs = new Array;
    for ( var i = 0; i < pairs.length; i++ ) {
        queryPairs.push(   encodeURIComponent( pairs[i][0] )
                         + "=" 
                         + encodeURIComponent( pairs[i][1] ) );
    }

    var sep = arguments.length ? arguments[0] : ";";
    return queryPairs.join(sep);
}

Form.Serializer.prototype.keyValues = function (forceArray) {
    var pairs = this.pairsArray();

    var named = {};
    for ( var i = 0; i < pairs.length; i++ ) {
        var k = pairs[i][0];
        var v = pairs[i][1];

        if ( named[k] ) {
            if ( typeof named[k] == 'object' ) {
                named[k].push(v);
            }
            else {
                named[k] = [ named[k], v ];
            }
        }
        else {
            if (forceArray) {
                named[k] = [v];
            }
            else {
                named[k] = v;
            }
        }
    }

    return named;
}




/* /usr/local/share/vegguide/js-source/HTTP/Request.js */



if ( typeof( Method ) == "undefined" ) {
    Method = {};
}

if ( typeof( Method["bind"] ) == "undefined" ) {
    Method.bind = function ( method, object ) {
        return function() {
            method.apply(object, arguments);
        }
    };
}



if ( typeof( HTTP ) == "undefined" ) {
    HTTP = {};
}

if ( typeof( HTTP.Request ) == "undefined" ) {
    HTTP.Request = function ( options ) {
        if ( !options ) options = {};

        this.options = {};
        for ( var i in options ) {
            this.setOption( i, options[i] );
        }

        if ( this.getOption( "method" ) == undefined ) {
            this.setOption( "method", "post" );
        }

        if ( this.getOption( "asynchronous" ) == undefined ) {
            this.setOption( "asynchronous", true );
        }

        if ( this.getOption( "parameters" ) == undefined ) {
            this.setOption( "parameters", "" );
        }

        if ( this.getOption( "transport" ) == undefined ) {
            this.setOption( "transport", HTTP.Request.Transport );
        }

        if ( this.getOption( "uri" ) )
            this.request();
    };

    HTTP.Request.EventNames = [
        "uninitialized"
       ,"loading"
       ,"loaded"
       ,"interactive"
       ,"complete"
    ];



    HTTP.Request.prototype.getOption = function( name ) {
        if ( typeof( name ) != "string" ) {
            return;
        }
        return this.options[name.toLowerCase()];
    };



    HTTP.Request.prototype.setOption = function( name, value ) {
        if ( typeof( name ) != "string" ) {
            return;
        }

        name = name.toLowerCase();

        this.options[name] = value;

        if ( name == "method" ) {
            if ( ! ( this.options.method == "get" || this.options.method == "post" || this.options.method == "head" ) ) {
                this.options.method = "post";
            }
        }

        if ( name == "transport" ) {
            if ( typeof( value ) != "function" ) {
                this.options.transport = HTTP.Request.Transport;
            }
        }
    };



    HTTP.Request.prototype.request = function ( uri ) {
        if ( ! uri ) uri = this.getOption( "uri" );
        if ( ! uri ) return;

        var parameters = this.getOption( "parameters" );

        var method = this.getOption( "method" );
        if ( method == "get" ) {
            uri += "?" + parameters;
        }

        this.transport = new (this.getOption( "transport" ))();

        var async = this.getOption( "asynchronous" );
        this.transport.open( method ,uri ,async );

        if ( async ) {
            this.transport.onreadystatechange = Method.bind(
                this.onStateChange, this
            );

            setTimeout(
                Method.bind(
                    function() { this.respondToReadyState(1) }
                   ,this
                )
               ,10
           );
        }

        this.setRequestHeaders();

        if ( method == "post" ) {
            var body = this.getOption( "postbody" );
            if ( ! body ) body = parameters;

            this.transport.send( body );
        }
        else {
            this.transport.send( null );
        }
    };



    HTTP.Request.prototype.setRequestHeaders = function() {
        this.transport.setRequestHeader( "X-Requested-With", "HTTP.Request" );
        this.transport.setRequestHeader( "X-HTTP-Request-Version", HTTP.Request.VERSION );

        if (this.getOption( "method" ) == "post") {
            this.transport.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );

            
            if (this.transport.overrideMimeType) {
                this.transport.setRequestHeader( "Connection", "close" );
            }
        }


    };



    
    HTTP.Request.prototype.isSuccess = function () {
        return this.transport.status == undefined
            || this.transport.status == 0
            || (this.transport.status >= 200 && this.transport.status < 300);
    };

    HTTP.Request.prototype.onStateChange = function() {
        var readyState = this.transport.readyState;
        if (readyState != 1) {
            this.respondToReadyState( this.transport.readyState );
        }
    };

    HTTP.Request.prototype.respondToReadyState = function( readyState ) {
        var event = HTTP.Request.EventNames[readyState];

        if (event == "complete") {
            var func = this.getOption( "on" + this.transport.status );
            if ( ! func ) {
                if ( this.isSuccess() ) {
                    func = this.getOption( "onsuccess" );
                }
                else {
                    func = this.getOption( "onfailure" );
                }
            }

            if ( func ) {
                ( func )( this.transport );
            }
        }

        if ( this.getOption( "on" + event ) )
            ( this.getOption( "on" + event ) )( this.transport );

        
        if (event == "complete") {
            this.transport.onreadystatechange = function (){};
        }
    };

    HTTP.Request.VERSION = 0.03;
}



if ( typeof( HTTP.Request.Transport ) == "undefined" ) {
    if ( window.XMLHttpRequest ) {
        HTTP.Request.Transport = window.XMLHttpRequest;
    }
    
    else if ( window.ActiveXObject && window.clipboardData ) {
        var msxmls = new Array(
            "Msxml2.XMLHTTP.5.0"
           ,"Msxml2.XMLHTTP.4.0"
           ,"Msxml2.XMLHTTP.3.0"
           ,"Msxml2.XMLHTTP"
           ,"Microsoft.XMLHTTP"
        );
        for ( var i = 0; i < msxmls.length; i++ ) {
            try {
                new ActiveXObject(msxmls[i]);
                HTTP.Request.Transport = function () {
                    return new ActiveXObject(msxmls[i]);
                };
                break;
            }
            catch(e) {
            }
        }
    }

    if ( typeof( HTTP.Request.Transport ) == "undefined" ) {
        
    }

    if ( typeof( HTTP.Request.Transport ) == "undefined" ) {
        throw new Error("Unable to locate XMLHttpRequest or other HTTP transport mechanism");
    }
}




/* /usr/local/share/vegguide/js-source/Widget/PairedMultiSelect.js */

JSAN.use("DOM.Ready");
JSAN.use("DOM.Events");

if ( typeof Widget == "undefined" ) Widget = {};

Widget.PairedMultiSelect = function (params) {
    this._initialize(params);
}

Widget.PairedMultiSelect._defaultSort = function (a, b) {
    if ( a.value < b.value ) return -1;
    if ( a.value > b.value ) return  1;
                             return  0;
}

Widget.PairedMultiSelect.newFromPrefix = function (prefix, sortFunction) {
    return new Widget.PairedMultiSelect
        ( { firstId: prefix + "-first",
            secondId: prefix + "-second",
            selectedFirstToSecondId: prefix + "-to-second",
            selectedSecondToFirstId: prefix + "-to-first",
            allFirstToSecond: prefix + "-all-to-second",
            allSecondToFirstId: prefix + "-all-to-first",
            sortFunction: sortFunction
          }
        );
}

Widget.PairedMultiSelect.VERSION = "0.10";

Widget.PairedMultiSelect.prototype._initialize = function (params) {
    if ( ! params ) {
        throw new Error("Cannot create a new Widget.PairedMultiSelect without parameters");
    }

    if ( ! params["firstId"] && ! params["secondId"] ) {
        throw new Error("Widget.PairedMultiSelect requires at least firstId and secondId parameters");
    }

    this._params = params;

    if ( typeof params.sortFunction == "function" ) {
        this._sortFunction = params.sortFunction;
    }
    else {
        this._sortFunction = Widget.PairedMultiSelect._defaultSort;
    }

    var self = this;

    DOM.Ready.onIdReady
        ( params.firstId,
          function (elt) {
              self.first = elt;
              self._attachOnSubmitToForm(elt);

              if ( self.second ) {
                  self.moveSelectedFirstToSecond();
              }

              DOM.Events.addListener( elt, "change",
                                      function () { self.moveSelectedFirstToSecond() } );
          }
        );

    DOM.Ready.onIdReady
        ( params.secondId,
          function (elt) {
              self.second = elt;

              if ( self.first ) {
                  self.moveSelectedFirstToSecond();
              }

              DOM.Events.addListener( elt, "change",
                                      function () { self.moveSelectedSecondToFirst() } );
          }
        );

    DOM.Ready.onIdReady
        ( params.selectedFirstToSecondId,
          function (elt) {
              DOM.Events.addListener( elt, "click",
                                      function () { self.moveSelectedFirstToSecond(); return false; } )
          }
        );

    DOM.Ready.onIdReady
        ( params.selectedSecondToFirstId,
          function (elt) {
              DOM.Events.addListener( elt, "click",
                                      function () { self.moveSelectedSecondToFirst(); return false; } )
          }
        );

    DOM.Ready.onIdReady
        ( params.allFirstToSecond,
          function (elt) {
              DOM.Events.addListener( elt, "click",
                                      function () { self.moveAllFirstToSecond(); return false; } )
          }
        );

    DOM.Ready.onIdReady
        ( params.allSecondToFirstId,
          function (elt) {
              DOM.Events.addListener( elt, "click",
                                      function () { self.moveAllSecondToFirst(); return false; } )
          }
        );
};

Widget.PairedMultiSelect.prototype._attachOnSubmitToForm = function (elt) {
    var firstId = this._params.firstId;
    var secondId = this._params.secondId;

    var node = elt;
    while ( node = node.parentNode ) {
        if ( new String( node.tagName ).match( /form/i ) ) {
            DOM.Events.addListener
                ( node,
                  "submit",
                  function () {
                      var first = document.getElementById(firstId);
                      for ( var i = 0; i < first.options.length; i++ ) {
                          first.options[i].selected = true;
                      }

                      var second = document.getElementById(secondId);
                      for ( var i = 0; i < second.options.length; i++ ) {
                          second.options[i].selected = true;
                      }

                      return true;
                  }
                );

            break;
        }
    }
}

Widget.PairedMultiSelect.prototype.moveSelectedFirstToSecond = function () {
    this._move( this.first, this.second );
}

Widget.PairedMultiSelect.prototype.moveSelectedSecondToFirst = function () {
    this._move( this.second, this.first );
}

Widget.PairedMultiSelect.prototype.moveAllFirstToSecond = function () {
    this._move( this.first, this.second, true );
}

Widget.PairedMultiSelect.prototype.moveAllSecondToFirst = function () {
    this._move( this.second, this.first, true );
}

Widget.PairedMultiSelect.prototype._move = function ( source, target, alwaysMove ) {
    var s_options = source.options;
    var t_options = target.options;

    var s_new = new Array;
    var t_new = new Array;

    for ( var i = 0; i < s_options.length; i++ ) {
        var option = new Option( s_options[i].text,
                                 s_options[i].value,
                                 false,
                                 false );

        if ( alwaysMove || s_options[i].selected ) {
            t_new.push(option);
        }
        else {
            s_new.push(option);
        }
    }

    for ( var i = 0; i < t_options.length; i++ ) {
        var option = new Option( t_options[i].text,
                                 t_options[i].value,
                                 false,
                                 false );

        t_new.push(option);
    }

    s_new.sort( this._sortFunction );
    t_new.sort( this._sortFunction );

    s_options.length = 0;
    t_options.length = 0;

    
    var source_optgroup;
    if ( source.firstChild && source.firstChild.tagName == "OPTGROUP" ) {
        source_optgroup = source.removeChild( source.firstChild );
    }

    for ( var i = 0; i < s_new.length; i++ ) {
        s_options[i] = s_new[i];
    }

    if (source_optgroup) {
        source.insertBefore( source_optgroup, source.firstChild );
    }

    var target_optgroup;
    if ( target.firstChild && target.firstChild.tagName == "OPTGROUP" ) {
        target_optgroup = target.removeChild( target.firstChild );
    }

    for ( var i = 0; i < t_new.length; i++ ) {
        t_options[i] = t_new[i];
    }

    if (target_optgroup) {
        target.insertBefore( target_optgroup, target.firstChild );
    }
}




/* /usr/local/share/vegguide/js-source/VegGuide/Widget/PairedMultiSelect.js */

JSAN.use('DOM.Element');
JSAN.use('Widget.PairedMultiSelect');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

if ( typeof VegGuide.Widget == "undefined" ) {
    VegGuide.Widget = {};
}

VegGuide.Widget.PairedMultiSelect = {};

VegGuide.Widget.PairedMultiSelect._savedOrder = {};

VegGuide.Widget.PairedMultiSelect.instrumentWPMS = function (name, label) {
    var poss_name = "possible_" + name;

    var selected_elt = document.getElementById(name);
    var possible_elt = document.getElementById(poss_name);

    if ( ! ( selected_elt && possible_elt ) ) {
        return;
    }

    var selected_opts = selected_elt.options;

    VegGuide.Widget.PairedMultiSelect._savedOrder[label] = {};
    for ( var i = 0; i < selected_opts.length; i++ ) {
        VegGuide.Widget.PairedMultiSelect._savedOrder[label][ selected_opts[i].text ] = i;

        var selected = selected_opts[i].selected;
        
        if ( selected_opts[i].getAttribute("selected") ) {
            selected = true;
        }

        var option = new Option( selected_opts[i].text,
                                 selected_opts[i].value,
                                 false,
                                 selected
                               );

        possible_elt[i] = option;
    }

    selected_opts.length = 0;

    var opts = {
        firstId:  poss_name,
        secondId: name,
        selectedFirstToSecondId: name + "-first-to-second",
        selectedSecondToFirstId: name + "-second-to-first"
    };

    var sort_function = eval ( "VegGuide.Widget.PairedMultiSelect._" + label + "Sort" );
    if (sort_function ) {
        opts.sortFunction = sort_function;
    }

    new Widget.PairedMultiSelect(opts);

    var div = document.getElementById( name + "-wpms" );
    div.style.display = "block";

    var optgroup = document.createElement("optgroup");
    optgroup.label = "Click to select";
    possible_elt.insertBefore( optgroup, possible_elt.firstChild );

    optgroup = document.createElement("optgroup");
    optgroup.label = "Selected " + label;
    selected_elt.insertBefore( optgroup, selected_elt.firstChild );

    DOM.Element.show(possible_elt);

    VegGuide.Widget.PairedMultiSelect.resizeWPMS( selected_elt, possible_elt, div );
};

VegGuide.Widget.PairedMultiSelect.resizeWPMS = function (select1, select2, context_elt) {
    var longest_string = "";

    for ( var i = 0; i < select1.options.length; i++ ) {
        if ( select1.options[i].text.length > longest_string.length ) {
            longest_string = select1.options[i].text;
        }
    }

    for ( var i = 0; i < select2.options.length; i++ ) {
        if ( select2.options[i].text.length > longest_string.length ) {
            longest_string = select2.options[i].text;
        }
    }

    if ( longest_string.length ) {
        var text = document.createTextNode(longest_string);
        var span = document.createElement("span");
        span.appendChild(text);

        var option = select1.options.length ? select1.options[0] : select2.options[0];

        if (option) {
            var styles;

            var multiplier = 1.4;
            
            if ( option.currentStyle ) {
                styles = option.currentStyle;
                multiplier = 1.5;
            }
            
            else if ( option.style ) {
                styles = option.style;
            }
            
            else {
                styles = document.defaultView.getComputedStyle( option, "" );
            }

            span.fontFamily = styles.fontFamily;
            span.fontWeight = styles.fontWeight;
            span.fontSize = styles.fontSize;
        }

        
        context_elt.appendChild(span);

        var width = span.offsetWidth * multiplier;
        context_elt.removeChild(span);

        select1.style.width = width + "px";
        select2.style.width = width + "px";
    }
};

VegGuide.Widget.PairedMultiSelect._cuisinesSort = function ( a, b ) {
    return VegGuide.Widget.PairedMultiSelect._sortOnOriginalOrder( "cuisines", a, b );
};

VegGuide.Widget.PairedMultiSelect._sortOnOriginalOrder = function( key, a, b ) {
    var a_order = VegGuide.Widget.PairedMultiSelect._savedOrder[key][ a.text ];
    var b_order = VegGuide.Widget.PairedMultiSelect._savedOrder[key][ b.text ];

    if ( a_order < b_order ) return -1;
    if ( a_order > b_order ) return  1;
                             return  0;
};

VegGuide.Widget.PairedMultiSelect._featuresSort = function ( a, b ) {
    if ( a.text < b.text ) return -1;
    if ( a.text > b.text ) return  1;
                           return  0;
};

VegGuide.Widget.PairedMultiSelect._optionsSort = function ( a, b ) {
    if ( a.text < b.text ) return -1;
    if ( a.text > b.text ) return  1;
                           return  0;

};


/* /usr/local/share/vegguide/js-source/VegGuide/Browser.js */

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.Browser = function () {
    if ( VegGuide.Browser._Singleton ) {
        return VegGuide.Browser._Singleton;
    }

    ua = navigator.userAgent;

    this.isIE     = !! window.attachEvent && ! window.opera;
    this.isOpera  = !! window.opera;
    this.isWebKit = !! ( ua.indexOf('AppleWebKit/') > -1 );
    this.isGecko  = !! ( ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') == -1 );
    this.isKHTML  = !! ( ua.indexOf('KHTML') > -1 );

    this.requiresPngFilter = this._requiresPngFilter();

    VegGuide.Browser._Singleton = this;
};

VegGuide.Browser._Singleton = null;

VegGuide.Browser.prototype._requiresPngFilter = function () {
    if ( ! this.isIE ) {
        return false;
    }

    var version = navigator.appVersion.split("MSIE");
    var version_num = parseFloat( version[1] );

    if ( version_num >= 5.5 && version_num < 7 ) {
        return true;
    }

    return false;
};


/* /usr/local/share/vegguide/js-source/Widget/Lightbox2.js */

JSAN.use("DOM.Element");
JSAN.use("DOM.Events");
JSAN.use('DOM.Find');
JSAN.use('VegGuide.Browser');

if ( typeof Widget == "undefined" ) {
    Widget = {};
}

Widget.Lightbox2 = function (params) {
    this.browser = new VegGuide.Browser;
    this._initialize(params);

    return this;
};

Widget.Lightbox2.prototype._initialize = function (params) {
    var overlay = document.createElement("div");

    var opacity_val = params.opacity;
    if ( typeof opacity_val == "undefined" ) {
        opacity_val = 0.7;
    }

    var color_val = params.color;
    if ( typeof color_val == "undefined" ) {
        color_val = "#333";
    }

    DOM.Element.hide(overlay);

    var body = document.getElementsByTagName("body")[0];

    body.appendChild(overlay);

    with ( overlay.style ) {
        position = "fixed";
        width    = "100%";
        height   = "100%";
        top      = 0;
        left     = 0;
        padding  = 0;
        margin   = 0;
        border   = 0;
        zIndex   = 1000;
        opacity  = opacity_val;
        backgroundColor = color_val;

        
        if ( this.browser.isIE || this.browser.isWebKit ) {
            filter = "alpha(opacity=" + ( opacity_val * 100 ) + ")";
            position = "absolute";
        }

        if ( this.browser.isIE ) {
            height = document.documentElement.clientHeight + "px";
            width = document.documentElement.clientWidth + "px";
        }
    }

    if ( this.browser.isIE ) {
        this.iframe = document.createElement("iframe");

        with ( this.iframe.style ) {
            position = "absolute";
            top      = 0;
            left     = 0;
            padding  = 0;
            margin   = 0;
            border   = 0;
            zIndex   = 999;

            filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';

            height = document.documentElement.clientHeight + "px";
            width = document.documentElement.clientWidth + "px";
        }

        DOM.Element.hide(this.iframe);

        body.appendChild(this.iframe);
    }

    var content = params.sourceElement;
    if ( ! content ) {
        throw "Must provide a sourceElement parameter when making a Widget.Lightbox2 object";
    }

    DOM.Element.hide(content);

    content.style.zIndex = 1001;

    var closers = DOM.Find.getElementsByAttributes( { className: "lightbox2-close" }, content )
    if ( closers && closers.length ) {
        var self = this;
        for ( var i = 0; i < closers.length; i++ ) {
            DOM.Events.addListener(
                closers[i],
                "click",
                function (e) {
                    self.hide();

                    e.preventDefault();
                    if ( e.stopPropogation ) {
                        e.stopPropagation();
                    }
                }
            );
        }
    }

    this.overlay = overlay;
    this.content = content;
};

Widget.Lightbox2.prototype.show = function () {
    if ( this.iframe ) {
        DOM.Element.show( this.iframe );
    }

    DOM.Element.show( this.overlay );
    DOM.Element.show( this.content );

    var left = ( document.body.clientWidth - this.content.offsetWidth ) / 2;
    this.content.style.left = left + "px";

    window.scroll( 0, 0 );
};

Widget.Lightbox2.prototype.hide = function () {
    DOM.Element.hide( this.content );
    DOM.Element.hide( this.overlay );

    if ( this.iframe ) {
        DOM.Element.hide( this.iframe );
    }

};


/* /usr/local/share/vegguide/js-source/VegGuide/EntryFilters.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Find');
JSAN.use('DOM.Utils');
JSAN.use('Form.Serializer');
JSAN.use('HTTP.Request');
JSAN.use('VegGuide.Widget.PairedMultiSelect');
JSAN.use('Widget.Lightbox2');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.EntryFilters = {};

VegGuide.EntryFilters.instrumentPage = function () {
    var toggle = $("more-filters-toggle");

    if (! toggle) {
        return;
    }

    VegGuide.EntryFilters._instrumentMoreFiltersToggle();
    VegGuide.EntryFilters._instrumentFilterToggles();
};

VegGuide.EntryFilters._instrumentMoreFiltersToggle = function () {
    var toggle = $("more-filters-toggle");

    var more_div = $("more-filters");

    var orig_text = toggle.innerHTML;

    DOM.Events.addListener(
        toggle,
        "click",
        function () {
            if ( more_div.style.display ) {
                DOM.Element.show(more_div);
                toggle.innerHTML = "Hide filters";
            }
            else {
                DOM.Element.hide(more_div);
                toggle.innerHTML = orig_text;
            }
        }
    );
};

VegGuide.EntryFilters._instrumentFilterToggles = function () {
    var toggles = document.getElementsByClassName("filter-toggle");

    for ( var i = 0; i < toggles.length; i++ ) {
        var link = toggles[i];

        var form_id = link.id.replace( /-toggle$/, '-form' );

        DOM.Events.addListener(
            link,
            "click",
            VegGuide.EntryFilters._makeShowFunction(form_id)
       );
    }

    var forms = VegGuide.EntryFilters._getForms();

    DOM.Element.show( forms[0] );
};


VegGuide.EntryFilters._makeShowFunction = function (form_id) {
    var id = form_id;

    
    var func = function (e) {
        VegGuide.EntryFilters._showForm( e, id );

        e.preventDefault();
        if ( e.stopPropogation ) {
            e.stopPropagation();
        }
    };

    return func;
};

VegGuide.EntryFilters._showForm = function( e, form_id ) {
    VegGuide.EntryFilters._hideAllFilterForms();

    e.target.parentNode.className = "current";

    DOM.Element.show(form_id);

    e.preventDefault();
    if ( e.stopPropogation ) {
        e.stopPropagation();
    }
};

VegGuide.EntryFilters._hideAllFilterForms = function () {
    var forms = VegGuide.EntryFilters._getForms();

    for ( var i = 0; i < forms.length; i++ ) {
        DOM.Element.hide( forms[i] );
    }
};

VegGuide.EntryFilters._getForms = function () {
    if ( ! VegGuide.EntryFilters._filterForms ) {
        VegGuide.EntryFilters._filterForms = document.getElementsByClassName("filter-form");
    }

    return VegGuide.EntryFilters._filterForms;
}

VegGuide.EntryFilters._makeDeleteFilterButton = function (uri) {
    var button = document.createElement("button");
    button.className = "action-button-medium";
    button.title = "delete this filter";

    button.appendChild( document.createTextNode("x") );

    DOM.Events.addListener(
        button,
        "click",
        function (e) {
            VegGuide.EntryFilters._refreshFilters( uri, "" );

            e.preventDefault();
            if ( e.stopPropogation ) {
                e.stopPropagation();
            }
        }
    );

    return button;
};


/* /usr/local/share/vegguide/js-source/VegGuide/Form.js */

JSAN.use('DOM.Element');
JSAN.use("DOM.Find");

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.Form = {};



VegGuide.Form.resizeRadioOrCheckboxList = function (name) {
    var div = $(name);

    if ( ! div ) {
        return;
    }

    var ul = DOM.Find.getElementsByAttributes( { "tagName": "UL" }, div )[0];

    if ( ! ul ) {
        return;
    }

    DOM.Element.hide(ul);

    ul.style.position = "absolute";
    ul.style.left     = "-5000px";

    DOM.Element.show(ul);

    var input = DOM.Find.getElementsByAttributes( { "tagName": "INPUT",
                                                    "type"   : /^(radio|checkbox)$/ }, ul )[0];

    if ( ! input ) {
        return;
    }

    var parent_is_li = function (node) {
        if ( node.tagName == "LI" ) {
            return true;
        }

        return false;
    };

    var labels = DOM.Find.getElementsByAttributes( { "tagName":  "LABEL",
                                                     "parentNode": parent_is_li }, ul );

    var longest_width = 0;
    for ( var i = 0; i < labels.length; i++ ) {
        if ( labels[i].offsetWidth > longest_width ) {
            longest_width = labels[i].offsetWidth;
        }
    }

    var li_width = input.offsetWidth + longest_width;
    li_width *= 2.5;

    if ( li_width <  100 ) {
        li_width = 100;
    }
    else if ( li_width > 700 ) {
        li_width = 700;
    }

    ul.style.width = li_width + "px";

    DOM.Element.hide(ul);

    ul.style.position = "";
    ul.style.left     = "";

    DOM.Element.show(ul);
};


/* /usr/local/share/vegguide/js-source/VegGuide/EntryForm.js */

JSAN.use('DOM.Events');
JSAN.use('VegGuide.Form');
JSAN.use('VegGuide.Widget.PairedMultiSelect');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.EntryForm = {};

VegGuide.EntryForm.instrumentPage = function () {
    if ( ! $("entry-form") ) {
        return;
    }

    VegGuide.Widget.PairedMultiSelect.instrumentWPMS( "category_id", "categories" );
    VegGuide.Widget.PairedMultiSelect.instrumentWPMS( "cuisine_id", "cuisines" );
    VegGuide.Widget.PairedMultiSelect.instrumentWPMS( "payment_option_id", "options" );
    VegGuide.Widget.PairedMultiSelect.instrumentWPMS( "attribute_id", "features" );

    VegGuide.EntryForm._instrumentCashOnly();

    
    VegGuide.EntryForm._resizeHowVeg();

    VegGuide.Form.resizeRadioOrCheckboxList("smoke_free");
    VegGuide.Form.resizeRadioOrCheckboxList("accepts_reservations");
    VegGuide.Form.resizeRadioOrCheckboxList("wheelchair_accessible");
    VegGuide.Form.resizeRadioOrCheckboxList("is_cash_only");
};

VegGuide.EntryForm._resizeHowVeg = function () {
    var hv = $("how-veg");

    if ( ! hv ) {
        return;
    }

    var radio   = $("veg-level-3");
    var longest = $("how-veg-longest");

    var li_width = radio.offsetWidth + longest.offsetWidth;
    li_width *= 1.1;

    hv.style.width = li_width + "px";
};

VegGuide.EntryForm._instrumentCashOnly = function () {
    var is_cash_only_yes = $("is_cash_only-yes");
    var is_cash_only_no = $("is_cash_only-no");

    if ( ! ( is_cash_only_yes && is_cash_only_no ) ) {
        return;
    }

    DOM.Events.addListener( is_cash_only_yes, "click", function () {
            VegGuide.EntryForm._disablePayments();
        } );

    DOM.Events.addListener( is_cash_only_no, "click", function () {
            VegGuide.EntryForm._enablePayments();
        } );

    if ( is_cash_only_yes.checked ) {
        VegGuide.EntryForm._disablePayments();
    }
};

VegGuide.EntryForm._disablePayments = function () {
    VegGuide.EntryForm._setPayments(false);
};

VegGuide.EntryForm._enablePayments = function () {
    VegGuide.EntryForm._setPayments(true);
};

VegGuide.EntryForm._setPayments = function (is_enabled) {
    var payments = $("payment_option_id");
    var poss_payments = $("possible_payment_option_id");

    if (is_enabled) {
        DOM.Element.removeClassName( payments, "disabled" );
        DOM.Element.removeClassName( poss_payments, "disabled" );
    }
    else {
        DOM.Element.addClassName( payments, "disabled" );
        DOM.Element.addClassName( poss_payments, "disabled" );
    }

    for ( var i = 0; i < payments.options.length; i++  ) {
        payments.options[i].disabled = ! is_enabled;
    }

    for ( var i = 0; i < poss_payments.options.length; i++  ) {
        poss_payments.options[i].disabled = ! is_enabled;
    }
};


/* /usr/local/share/vegguide/js-source/VegGuide/EntryImageSlideshow.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('DOM.Find');
JSAN.use('HTTP.Request');
JSAN.use('Widget.Lightbox2');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.EntryImageSlideshow = function (lb) {
    this._init(lb);
};

VegGuide.EntryImageSlideshow._loaderImage = ( function() {
    var img = document.createElement("img");

    img.src = "/images/loader.gif";
    img.className = "loader";
    img.height = 32;
    img.width = 32;

    return img;
} )();

VegGuide.EntryImageSlideshow.instrumentPage = function () {
    var main_image = $("main-image");

    if ( ! main_image ) {
        return;
    }

    var lb = new Widget.Lightbox2( { sourceElement: $("slideshow-lightbox") } );

    var show = new VegGuide.EntryImageSlideshow (lb);

    var links =
        DOM.Find.getElementsByAttributes( { tagName:   "A",
                                            className: /activate-slideshow/
                                          },
                                          $("entry-images") );

    for ( var i = 0; i < links.length; i++ ) {
        var matches = links[i].className.match( /js-display-order-(\d+)/ );

        var show_func =
            VegGuide.EntryImageSlideshow._makeShowFunction( show, matches[1] );

        DOM.Events.addListener(
            links[i],
            "click",
            show_func
        );
    }
};

VegGuide.EntryImageSlideshow._makeShowFunction = function ( show, order ) {
    var s = show;
    var o = order;

    var show_func = function (e) {
        s.start(o);

        e.preventDefault();
        if ( e.stopPropogation ) {
            e.stopPropagation();
        }
    };

    return show_func;
};

VegGuide.EntryImageSlideshow.prototype._init = function (lb) {
    this.lb = lb;

    var matches = lb.content.className.match( /slideshow-for-(\d+)/ );
    if ( ! matches ) {
        return;
    }

    this.imageContainer       = $("slideshow-image-container");
    this.captionContainer     = $("slideshow-caption-container");
    this.attributionContainer = $("slideshow-attribution-container");
    this.controlsContainer    = $("slideshow-controls-container");
    this.prevContainer        = $("slideshow-prev-container");
    this.nextContainer        = $("slideshow-next-container");

    this.vendor_id = matches[1];

    this.images = [];
};

VegGuide.EntryImageSlideshow.prototype.start = function (order) {
    if ( ! this.vendor_id ) {
        return;
    }

    this.lb.show();

    this._showImage(order);
};

VegGuide.EntryImageSlideshow.prototype._showImage = function (imageNumber) {
    this._showLoader();

    var image = this._getImage(imageNumber);

    var img = document.createElement("img");

    img.src    = image.uri;
    img.alt    = "";
    img.height = image.height;
    img.width  = image.width;
    img.style.marginTop  = image.margin_top;
    img.style.marginLeft = image.margin_left;

    this._emptyElt( this.imageContainer );

    var link = document.createElement("a");
    link.title  = "View the full size image";
    link.href   = image.original_uri;
    link.target = "_new";

    link.appendChild(img);

    this.imageContainer.appendChild(link);

    this._emptyElt( this.captionContainer );
    if ( image.caption ) {
        var caption = document.createTextNode( image.caption );
        this.captionContainer.appendChild(caption);
    }

    this._emptyElt( this.attributionContainer );

    var attribution = document.createTextNode( ' Uploaded by ' );
    var user_link = document.createElement("a");
    user_link.href = "/user/" + image.user_id;
    user_link.appendChild( document.createTextNode( image.user_real_name ) );

    this.attributionContainer.appendChild(attribution);
    this.attributionContainer.appendChild(user_link);

    var prev_link;
    if ( image.previous ) {
        prev_link = this._makeControLink( "previous", image.previous );
    }

    var next_link;
    if ( image.next ) {
        next_link = this._makeControLink( "next", image.next );
    }

    this._emptyElt( this.prevContainer );
    this._emptyElt( this.nextContainer );

    if (next_link) {
        this.nextContainer.appendChild(next_link);
    }

    if (prev_link) {
        this.prevContainer.appendChild(prev_link);
    }

    if ( prev_link || next_link ) {
        DOM.Element.removeClassName( this.controlsContainer, "empty" );
    }
    else {
        DOM.Element.addClassName( this.controlsContainer, "empty" );
    }
}

VegGuide.EntryImageSlideshow.prototype._getImage = function (imageNumber) {
    if ( ! this.images[ imageNumber - 1 ] ) {
        var req = new HTTP.Request( {
            asynchronous: false,
            method:       "get"
            }
        );

        var uri = "/entry/" + this.vendor_id + "/image/" + imageNumber;
        req.request(uri);

        var image = eval( "(" + req.transport.responseText + ")" );

        var container_height = this.imageContainer.offsetHeight;
        var container_width  = this.lb.content.offsetWidth;

        image.margin_top  = ( ( container_height - image.height ) / 2 ) + "px";
        image.margin_left = ( ( container_width - image.width ) / 2 ) + "px";

        this.images[ imageNumber - 1 ] = image;
    }

    return this.images[ imageNumber - 1 ];
};

VegGuide.EntryImageSlideshow.prototype._showLoader = function () {
    this._emptyElt( this.imageContainer );

    this.imageContainer.appendChild( VegGuide.EntryImageSlideshow._loaderImage );
};

VegGuide.EntryImageSlideshow.prototype._emptyElt = function (elt) {
    while ( elt.firstChild ) {
        elt.removeChild( elt.firstChild );
    }
};

VegGuide.EntryImageSlideshow.prototype._makeControLink = function ( text, number ) {
    var link = document.createElement("a");
    link.appendChild( document.createTextNode(text) );
    link.className = "action-button-medium " + text;
    link.href = "#";

    DOM.Events.addListener(
        link,
        "click",
        this._makeShowFunction(number)
    );

    return link;
}


VegGuide.EntryImageSlideshow.prototype._makeShowFunction = function (number) {
    var self = this;

    var func = function (e) {
        self._showImage(number);

        e.preventDefault();
        if ( e.stopPropogation ) {
            e.stopPropagation();
        }
    };

    return func;
};


/* /usr/local/share/vegguide/js-source/VegGuide/FrontPageGeolocation.js */

JSAN.use('HTTP.Request');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.FrontPageGeolocation = {};

VegGuide.FrontPageGeolocation.instrumentPage = function () {
    VegGuide.FrontPageGeolocation.nearby = $("nearby");

    if ( ! VegGuide.FrontPageGeolocation.nearby ) {
        return;
    }

    if ( ! navigator.geolocation && navigator.geolocation.getCurrentPosition ) {
        return;
    }

    VegGuide.FrontPageGeolocation.browse_all = $("nearby-browse-all");

    VegGuide.FrontPageGeolocation.nearby.innerHTML = "<p>Finding nearby restaurants ...</p>";

    navigator.geolocation.getCurrentPosition( VegGuide.FrontPageGeolocation._getNearbyList );
};

VegGuide.FrontPageGeolocation._getNearbyList = function (location) {
    
    if ( VegGuide.FrontPageGeolocation.fetching ) {
        return;
    }

    VegGuide.FrontPageGeolocation.fetching = 1;

    var uri = "/entry/near/"
              + location.coords.latitude + "%2C" + location.coords.longitude
              + "/filter/category_id=1;veg_level=2;allow_closed=0";

    var req = new HTTP.Request( {
        parameters: "limit=10;order_by=distance;address=Your+location",
        method:     "get",
        onSuccess:  VegGuide.FrontPageGeolocation._updateNearbyList
        }
    );

    req.request(uri);
};

VegGuide.FrontPageGeolocation._updateNearbyList = function (res) {
    var response = eval( "(" + res.responseText + ")" );

    if ( response.entries && response.entries.length ) {
        var list = "<ul>";

        for ( var i = 0; i < response.entries.length; i++ ) {
            list = list + '<li><a href="' + response.entries[i].uri + '">' + response.entries[i].name + " - " + response.entries[i].distance + "</a></li>";
        }

        var loc_name = response.location.name;
        if ( response.location.parent ) {
            loc_name = loc_name + ", " + response.location.parent;
        }

        if ( response.location.search_uri ) {
            list = list + '<li><a href="' + response.location.search_uri + '">';
            list = list + response.count + " ";
            list = list + ( response.count > 1 ? "restaurants" : "restaurant" );
            list = list + " near " + loc_name + "</a></li>";
        }

        list = list + "</ul>";

        var p = "<p>" + 'Browse all entries in <a href="';
        p = p + response.location.uri;
        p = p + '">' + loc_name;
        p = p + "</a>, including grocers, organizations, etc.</p>";

        VegGuide.FrontPageGeolocation.nearby.innerHTML = list + p;
    }
    else {
        VegGuide.FrontPageGeolocation.nearby.innerHTML = '<p>We don\'t have any restaurants near your current location. Please <a href="/site/help#editing">add some</a> if you can!</p>';
    }
};


/* /usr/local/share/vegguide/js-source/VegGuide/GoogleMap.js */

JSAN.use("DOM.Element");
JSAN.use('DOM.Events');
JSAN.use('DOM.Find');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.GoogleMap = function ( div_id ) {
    var map_div = $(div_id);

    if ( ! ( map_div && GBrowserIsCompatible() ) ) {
        return;
    }

    VegGuide.GoogleMap._makeIcons();
    this._createGoogleMap( map_div );
}

VegGuide.GoogleMap.prototype._createGoogleMap = function ( map_div ) {
    var map = new GMap2(map_div);

    var height;
    if ( typeof window.innerHeight == "number" ) {
        height = window.innerHeight * 0.6;
    }
    else {
        height = document.documentElement.clientHeight * 0.6;
    }

    map_div.style.height = height + "px";

    var vendor_list = $("vendor-list");
    if (vendor_list) {
        vendor_list.style.height = height + "px";
    }

    map.addControl( new GSmallMapControl() );
    map.addControl( new GMapTypeControl() );

    this.map = map;
};

VegGuide.GoogleMap.prototype.addMarkers = function (points) {
    this.map.setCenter( new GLatLng( points[0].latitude, points[0].longitude ), 13 );

    for ( var i = 0; i < points.length; i++ ) {
        var point = points[i];

        var ll = new GLatLng ( point.latitude, point.longitude );

        if ( point.info_div ) {
            var div = $( point.info_div ).cloneNode(true);
            DOM.Element.show(div);
        }

        var marker = this._createMarker( ll, point, div );

        if ( point.info_div ) {
            var show_link = $( "show-" + point.info_div );
            if (show_link) {
                this._instrumentShowLink( show_link, marker );
            }
        }

        this.map.addOverlay(marker);

        if ( ! this.marker ) {
            this.marker = marker;
        }
    }
};

VegGuide.GoogleMap.prototype.showFirstInfoWindow = function () {
    GEvent.trigger( this.marker, "click" );
};

VegGuide.GoogleMap._Icons = {};

VegGuide.GoogleMap._makeIcons = function () {
    var base_icon = new GIcon();

    base_icon.iconSize = new GSize( 29, 40 );
    base_icon.iconAnchor = new GPoint( 15, 40 );
    base_icon.infoWindowAnchor = new GPoint( 5, 1 );
    base_icon.shadow = "/images/map-icons/shadow.png";
    base_icon.shadowSize = new GSize( 60, 40 );

    
    var icons = [ [ "c1",   "restaurant" ],
                  [ "c1.1", "restaurant1" ],
                  [ "c1.2", "restaurant2" ],
                  [ "c1.3", "restaurant3" ],
                  
                  [ "c1.4", "restaurant3" ],
                  [ "c1.5", "restaurant5" ],
                  [ "c2",   "grocery" ],
                  [ "c3",   "catering" ],
                  [ "c4",   "organization" ],
                  [ "c5",   "coffee" ],
                  [ "c6",   "bar" ],
                  [ "c7",   "general_store" ],
                  [ "c8",   "other" ],
                  [ "c9",   "food_court" ],
                  [ "c10",  "lodging" ] ];

    for ( var i = 0; i < icons.length; i++ ) {
        var key  = icons[i][0];
        var name = icons[i][1];

        var image_uri = "/images/map-icons/" + name + ".png";
        VegGuide.GoogleMap._Icons[key] = new GIcon( base_icon, image_uri );
    }
};

VegGuide.GoogleMap.prototype._createMarker = function ( ll, point, div ) {
    var marker;

    if ( point.category_id && point.veg_level ) {
        var keys = [ "c" + point.category_id + "." + point.veg_level,
                     "c" + point.category_id ];

        var icon;
        for ( var i = 0; i < keys.length; i++ ) {
            if ( VegGuide.GoogleMap._Icons[ keys[i] ] ) {
                icon = VegGuide.GoogleMap._Icons[ keys[i] ];
                break;
            }
        }

        marker = new GMarker( ll, { icon: icon } );
    }
    else {
        marker = new GMarker( ll, { title: point.title } );
    }

    var self = this;

    if (div) {
        var new_div = div.cloneNode(true);
        new_div.id = "";

        marker.bindInfoWindow(new_div);
    }

    return marker;
};

VegGuide.GoogleMap.prototype._instrumentShowLink = function ( link, marker ) {
    var self = this;

    DOM.Events.addListener(
        link,
        "click",
        function (e) {
            GEvent.trigger( marker, "click" );

            e.preventDefault();
            if ( e.stopPropogation ) {
                e.stopPropagation();
            }
        }
    );
};

VegGuide.GoogleMap.prototype.showDirectionsFromForm = function (form) {
    var directions = new GDirections( this.map, $("google-maps-directions-text") );

    var query = "from: " + form.elements["from"].value + " to: " + form.elements["to"].value;
    directions.load(query);
};

DOM.Ready.onDOMDone( function () {
    if ( window.GUnload ) {
        DOM.Events.addListener(
            window,
            "unload",
            window.GUnload
        );
    }
} );


/* /usr/local/share/vegguide/js-source/VegGuide/HoursForm.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('Form.Serializer');
JSAN.use('HTTP.Request');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.HoursForm = {};

VegGuide.HoursForm.Days = [ "Monday", "Tuesday", "Wednesday",
                            "Thursday", "Friday", "Saturday", "Sunday" ];

VegGuide.HoursForm.instrumentPage = function () {
    if ( ! $("hours-form") ) {
        return;
    }

    for ( var d = 0; d <= 6; d++ ) {
        var hours0 = $( "hours-" + d + "-0" );

        DOM.Events.addListener( hours0, "blur", VegGuide.HoursForm._FetchDescriptions );

        var hours1 = $( "hours-" + d + "-1" );
        DOM.Events.addListener( hours1, "blur", VegGuide.HoursForm._FetchDescriptions );

        var checkbox = $( "is-closed-" + d );

        var closed_toggler_func = VegGuide.HoursForm._makeTextFieldEnabledToggler(d);

        DOM.Events.addListener( checkbox, "change", closed_toggler_func );
        DOM.Events.addListener( checkbox, "change", VegGuide.HoursForm._FetchDescriptions );

        closed_toggler_func( { target: checkbox } );

        var and_link = $( "and-" + d );
        
        var and_toggler_func = VegGuide.HoursForm._makeSecondaryHoursToggler(d);

        DOM.Events.addListener( and_link, "click", and_toggler_func );

        if ( hours1.value.length ) {
            var mock_event = { preventDefault: function () { } };
            and_toggler_func(mock_event);
        }
    }

    VegGuide.HoursForm._FetchDescriptions();
};

VegGuide.HoursForm._makeTextFieldEnabledToggler = function (day) {
    var d = day;

    var func = function (e) {
        var dis = e.target.checked ? true : false;

        var hours0 = $( "hours-" + d + "-0" );

        hours0.disabled = dis;

        if (dis) {
            DOM.Element.addClassName( hours0, "disabled" );
        }
        else {
            DOM.Element.removeClassName( hours0, "disabled" );
        }

        var hours1 = $( "hours-" + d + "-1" );

        if (hours1) {
            hours1.disabled = dis;

            if (dis) {
                DOM.Element.addClassName( hours1, "disabled" );
            }
            else {
                DOM.Element.removeClassName( hours1, "disabled" );
            }
        }
    };

    return func;
};

VegGuide.HoursForm._makeSecondaryHoursToggler = function (day) {
    var d = day;

    var func = function (e) {
        var sec = $( "secondary-hours-" + d );
        DOM.Element.toggle(sec);

        if ( sec.style.display == "none" ) {
            $( "hours-" + d + "-1" ).value = "";

            VegGuide.HoursForm._FetchDescriptions();
        }

        e.preventDefault();
        if ( e.stopPropogation ) {
            e.stopPropagation();
        }
    };

    return func;
};

VegGuide.HoursForm._FetchDescriptions = function () {
    var ser = new Form.Serializer("hours-form");

    var req = new HTTP.Request( {
        parameters: ser.queryString(),
        method:     "get",
        onSuccess:  VegGuide.HoursForm._updateDescriptions
        }
    );

    var uri = "/hours-descriptions";
    req.request(uri);
};

VegGuide.HoursForm._updateDescriptions = function (res) {
    var descriptions = eval( "(" + res.responseText + ")" );

    for ( var d = 0; d <= 6; d++ ) {
        if ( ! descriptions[d] ) {
            continue;
        }

        if ( descriptions[d].s0 == "closed" ) {
            var checkbox = $( "is-closed-" + d );
            checkbox.checked = true;

            var mock_event = { target: checkbox, preventDefault: function () { } };
            VegGuide.HoursForm._makeTextFieldEnabledToggler(d)(mock_event);
        }

        var hours0 = $( "hours-" + d + "-0" );
        var hours1 = $( "hours-" + d + "-1" );

        if ( typeof descriptions[d].error != "undefined" ) {
            DOM.Element.addClassName( hours0, "error" );
            DOM.Element.addClassName( hours1, "error" );

            var error = $( "error-" + d );
            error.appendChild( document.createTextNode( descriptions[d].error ) );
            DOM.Element.show(error);

            continue;
        }
        else {
            DOM.Element.removeClassName( hours0, "error" );
            DOM.Element.removeClassName( hours1, "error" );

            var error = $( "error-" + d );
            DOM.Element.hide(error);

            if ( error.firstChild ) {
                error.removeChild( error.firstChild );
            }
        }

        hours0.value = descriptions[d].s0;

        if ( descriptions[d].s1 ) {
            hours1.value = descriptions[d].s1;
            DOM.Element.show( $( "secondary-hours-" + d ) );
        }
    };
};

VegGuide.HoursForm._replaceTextWith = function ( elt, text ) {
    while ( elt.firstChild ) {
        elt.removeChild( elt.firstChild );
    }

    elt.appendChild( document.createTextNode(text) );
};


/* /usr/local/share/vegguide/js-source/VegGuide/IEPngFilter.js */

JSAN.use("VegGuide.Browser");

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.IEPngFilter = {};

(function () {
    var blank = new Image;
    blank.src = "/images/transparent.gif";

    VegGuide.IEPngFilter._blankImage = blank;
})();

VegGuide.IEPngFilter.instrumentPage = function () {
    var browser = new VegGuide.Browser;
    if ( ! browser.requiresPngFilter ) {
        return;
    }

    var images = document.images;

    for ( var i = 0; i < images.length; i++ ) {
        var image = images[i];

        if ( ! /png-filter/.test( image.className ) ) {
            continue;
        }

        var new_image = VegGuide.IEPngFilter._blankImage.cloneNode(true);
        new_image.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + image.src + "', sizing='scale')";
        new_image.className = image.className;
        new_image.className.replace( /png-filter/, "" );
        new_image.height = image.height;
        new_image.width = image.width;

        var parent = image.parentNode;
        parent.insertBefore( new_image, image );
        parent.removeChild(image);
    }
};


/* /usr/local/share/vegguide/js-source/VegGuide/LocaleList.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('DOM.Find');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.LocaleList = {};

VegGuide.LocaleList.instrumentPage = function () {
    
    if ( ! $("new-locale") ) {
        return;
    }

    var toggles = DOM.Find.getElementsByAttributes( { tagName: "A",
                                                      className: /locale-edit-toggle/ } );

    for ( var i = 0; i < toggles.length; i++ ) {
        VegGuide.LocaleList._instrumentToggle( toggles[i] );
    }      
};

VegGuide.LocaleList._instrumentToggle = function (link) {
    var matches = link.href.match( /#(\d+)$/ );
    var locale_id = matches[1];

    var form = $( "locale-form-" + locale_id );
    DOM.Events.addListener(
        link,
        "click",
        function (e) {
            DOM.Element.toggle(form);

            e.preventDefault();
            if ( e.stopPropogation ) {
                e.stopPropagation();
            }
        }
    );
};


/* /usr/local/share/vegguide/js-source/VegGuide/InlineSearchForm.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('VegGuide.Form');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.InlineSearchForm = function ( prefix, search_uri, results_function ) {
    var search_button = $( prefix + "-search-submit" );

    if ( ! search_button ) {
        return;
    }
    
    this.search_button = search_button;
    this.search_input  = $( prefix + "-name" );
    this.submit_button = $( prefix + "-search-submit");
    this.results_div   = $( prefix + "-search-results" );
    this.search_uri    = search_uri;
    this.populate_results_function = results_function;

    this._instrumentForm();
};

VegGuide.InlineSearchForm.prototype._instrumentForm = function() {
    var self = this;

    DOM.Events.addListener(
        this.search_input,
        "keypress",
        function (e) {
            self._handleEnterKey(e);
        }
    );

    DOM.Events.addListener(
        this.search_button,
        "click",
        function (e) {
            self._searchRequest(e);
        }
    );

    VegGuide.Form.resizeRadioOrCheckboxList( this.results_div );
};

VegGuide.InlineSearchForm.prototype._handleEnterKey = function (e) {
    if ( e.keyCode != 13 ) {
        return e.keyCode;
    }

    this.submit_button.click();

    e.preventDefault();
    if ( e.stopPropogation ) {
        e.stopPropagation();
    }
}

VegGuide.InlineSearchForm.prototype._searchRequest = function (e) {
    var value = this.search_input.value;

    if ( ! value ) {
        return;
    }

    var self = this;

    var req = new HTTP.Request( {
        parameters: "name=" + encodeURIComponent(value),
        method:     "get",
        onSuccess:  function (r) {
                self._clearResultsDiv();
                self.populate_results_function( r, self.results_div );
            }
        }
    );

    this._showSearchingMessage();

    req.request( this.search_uri );

    e.preventDefault();
    if ( e.stopPropogation ) {
        e.stopPropagation();
    }
};

VegGuide.InlineSearchForm.prototype._showSearchingMessage = function () {
    this._clearResultsDiv();

    var span = document.createElement("span");
    span.className = "transient-ajax-message";

    span.appendChild( document.createTextNode( "Searching ..." ) );

    this.results_div.appendChild(span);
};

VegGuide.InlineSearchForm.prototype._clearResultsDiv = function () {
    while ( this.results_div.firstChild ) {
        this.results_div.removeChild( this.results_div.firstChild );
    }
};


/* /usr/local/share/vegguide/js-source/VegGuide/LocationSearch.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('VegGuide.Form');
JSAN.use('VegGuide.InlineSearchForm');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.LocationSearch = {};

VegGuide.LocationSearch.instrumentPage = function () {
    new VegGuide.InlineSearchForm( "location", "/region/search", VegGuide.LocationSearch._populateLocationList );
};

VegGuide.LocationSearch._populateLocationList = function ( res, div ) {
    var locations = eval( "(" + res.responseText + ")" );

    if ( ! locations.length ) {
        div.appendChild( document.createTextNode( "No matching locations found." ) );
        return;
    }

    var ul = document.createElement("ul");

    for ( var i = 0; i < locations.length; i++ ) {
        var loc = locations[i];

        var radio = document.createElement("input");

        radio.type  = "radio";
        radio.name  = "location_id";
        radio.value = loc.location_id;
        radio.id    = "location_id-" + loc.location_id;
        radio.className = "radio";

        var label = document.createElement("label");
        label.htmlFor = radio.id;

        var text = loc.name;
        if ( loc.parent ) {
            text += ", " + loc.parent.name;
        }

        if ( loc.cities ) {
            text += " (has cities which match the name you provided)";
        }

        label.appendChild( document.createTextNode(text) );

        var li = document.createElement("li");

        li.appendChild(radio);
        li.appendChild(label);

        ul.appendChild(li);
    }

    DOM.Element.hide(div);

    div.appendChild(ul);

    DOM.Element.show(div);

    VegGuide.Form.resizeRadioOrCheckboxList("location-search-results");
};


/* /usr/local/share/vegguide/js-source/VegGuide/LoginForm.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.LoginForm = function () {
    this.standard = $("standard-log-in");
    this.openid = $("openid-log-in");
    this.toggle = $("switch-log-in");
    this.orig_toggle_text = this.toggle.innerHTML;
    this.is_standard = 1;

    var self = this;
    DOM.Events.addListener(
        this.toggle,
        "click",
        function (e) {
            self._switchForms();

            e.preventDefault();
            if ( e.stopPropogation ) {
                e.stopPropagation();
            }
        }
    );

    if ( $("openid_uri").value ) {
        this._switchForms();
    }
};


VegGuide.LoginForm.instrumentPage = function () {
    if ( ! $("standard-log-in") ) {
        return;
    }

    new VegGuide.LoginForm();
};

VegGuide.LoginForm.prototype._switchForms = function () {
    if ( this.is_standard ) {
        DOM.Element.hide( this.standard );
        DOM.Element.show( this.openid );

        this.toggle.innerHTML = "Or log in with your email address and password";

        this.is_standard = 0;
    }
    else {
        DOM.Element.hide( this.openid );
        DOM.Element.show( this.standard );

        this.toggle.innerHTML = this.orig_toggle_text;

        this.is_standard = 1;
    }
};


/* /usr/local/share/vegguide/js-source/VegGuide/Pagination.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('DOM.Find');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.Pagination = {};

VegGuide.Pagination.instrumentPage = function () {
    var table = $("entries-table");
    if ( ! table ) {
        return;
    }

    var selects = document.getElementsByClassName("entries-per-page");

    for ( var i = 0; i < selects.length; i++ ) {
        VegGuide.Pagination._instrumentSelect( selects[i] );
    }
};

VegGuide.Pagination._instrumentSelect = function (select) {
    var node = select;
    while ( node = node.parentNode ) {
        if ( node.tagName == "THEAD" ) {
            return;
        }
        else if ( node.tagName == "TFOOT" ) {
            break;
        }
    }

    DOM.Events.addListener(
        select,
        "change",
        VegGuide.Pagination._submitForm
    );

    DOM.Element.show( select.form );
};

VegGuide.Pagination._submitForm = function (e) {
    var select = e.target;

    select.form.submit();
};


/* /usr/local/share/vegguide/js-source/VegGuide/Element.js */

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.Element = {};

VegGuide.Element.realPosition = function (elt) {
    var top  = 0;
    var left = 0;

    var element = elt;
    do {
        top  += element.offsetTop  || 0;
        left += element.offsetLeft || 0;

        element = element.offsetParent;
    } while (element);

    return { "top": top, "left": left };
};


/* /usr/local/share/vegguide/js-source/VegGuide/RatingStars.js */

JSAN.use("DOM.Element");
JSAN.use("DOM.Events");
JSAN.use("DOM.Find");
JSAN.use("HTTP.Request");
JSAN.use("VegGuide.Browser");
JSAN.use("VegGuide.Element");

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.RatingStars = {};

VegGuide.RatingStars._ratingsDescriptions = [ "terrible", "fair", "good", "great", "excellent" ];

VegGuide.RatingStars.instrumentPage = function () {
    var stars_container = document.getElementsByClassName("rating-star-set");

    if ( ! stars_container.length ) {
        return;
    }

    VegGuide.RatingStars._makeStars();

    for ( var i = 0; i < stars_container.length; i++ ) {
        var stars =
            DOM.Find.getElementsByAttributes( { tagName: "IMG",
                                                className: /rate-\d+/ },
                                              stars_container[i] )[0];

        new VegGuide.RatingStarSet( stars_container[i].parentNode, stars );
    }
};

VegGuide.RatingStars._makeStars = function () {
    var browser = new VegGuide.Browser;

    var blue_stars = [];
    for ( var i = 1; i <= 5; i++ ) {
        var stars = new Image();
        stars.src = "/images/ratings/blue-" + i + "-00.png";

        if ( browser.requiresPngFilter ) {
            stars.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + stars.src + "', sizing='scale')";
            stars.src = "/images/transparent.gif";
        }

        stars.height = 18;
        stars.width = 90;

        blue_stars.push(stars);
    }

    VegGuide.RatingStars._blueStars = blue_stars;
};

VegGuide.RatingStarSet = function ( container, stars ) {
    this.original_image = stars;

    this.help_div = $("rating-help");

    if ( this.help_div ) {
        this.original_help_text = this.help_div.innerHTML;
    }

    var match = stars.className.match( /rate-(\d+)/ );
    this.vendor_id = match[1];

    this.current_rating = 0;

    this._instrumentStars(stars);
};

VegGuide.RatingStarSet.prototype._instrumentStars = function (stars) {
    var parent = stars.parentNode;

    var match = stars.className.match( /rate-\d+/ );

    var input = document.createElement("input");
    input.type = "image";
    input.src = stars.src;

    input.style.width = stars.width + "px";
    input.style.height = stars.height + "px";

    if ( stars.style.filter ) {
        input.style.filter = stars.style.filter;
    }

    this.input = input;

    var self = this;

    DOM.Events.addListener(
        input,
        "mouseover",
        function (e) {
            self._showRating(e);
        }
    );

    DOM.Events.addListener(
        input,
        "mousemove",
        function (e) {
            self._showRating(e);
        }
    );

    DOM.Events.addListener(
        input,
        "mouseout",
        function (e) {
            self._mouseOut();
        }
    );

    DOM.Events.addListener(
        input,
        "click",
        function (e) {
            e.target.blur();
            self._submitRating( e.target.value );

            e.preventDefault();
            if ( e.stopPropogation ) {
                e.stopPropagation();
            }
        }
    );

    parent.replaceChild( input, stars );
};

VegGuide.RatingStarSet.prototype._showRating = function (e) {
    var pos = VegGuide.Element.realPosition( e.target );
    var x = e.pageX - pos.left;

    var rating = Math.floor( x / 18 );
    rating += 1;

    
    if ( rating < 1 ) {
        rating = 1;
    }
    else if ( rating > 5 ) {
        rating = 5;
    }

    if ( this.current_rating == rating ) {
        return;
    }

    this.current_rating = rating;

    e.target.value = rating;

    var blue = VegGuide.RatingStars._blueStars[ rating - 1 ];
    if ( ! blue ) {
        alert(rating);
    }
    e.target.src = blue.src;

    if ( blue.style.filter ) {
        e.target.style.filter = blue.style.filter;
    }

    if ( this.help_div ) {
        var desc = VegGuide.RatingStars._ratingsDescriptions[ rating - 1 ];

        this.help_div.innerHTML = desc.substring( 0, 1 ).toUpperCase() + desc.substring(1);
    }
};

VegGuide.RatingStarSet.prototype._mouseOut = function () {
    this._restoreImage();

    if ( this.help_div ) {
        this.help_div.innerHTML = this.original_help_text;
    }
};

VegGuide.RatingStarSet.prototype._restoreImage = function () {
    this.input.src = this.original_image.src;

    if ( this.original_image.style.filter ) {
        this.input.style.filter = this.original_image.style.filter;
    }

    this.current_rating = 0;
}

VegGuide.RatingStarSet.prototype._submitRating = function (rating) {
    var uri = "/entry/" + this.vendor_id + "/rating";

    var req = new HTTP.Request( {
        parameters: "rating=" + rating,
        asynchronous: false,
        method:       "post"
        }
    );

    req.request(uri);

    var response = eval( "(" + req.transport.responseText + ")" );

    if ( response.uri ) {
        window.location.href = response.uri;
        return;
    }

    var avg = $( "weighted-average-" + this.vendor_id );
    if (avg) {
        avg.innerHTML = response.weighted_average;
    }

    var sep = $("average-and-count-separator");
    if (sep) {
        DOM.Element.show(sep);
    }

    var count = $( "vote-count-" + this.vendor_id );
    if (count) {
        count.innerHTML = response.vote_count;
    }

    this.original_image = VegGuide.RatingStars._blueStars[ rating - 1 ];

    this._restoreImage();

    if ( this.help_div ) {
        this.help_div.innerHTML = this.original_help_text;
    }
};


/* /usr/local/share/vegguide/js-source/VegGuide/RegionForm.js */

JSAN.use('VegGuide.Form');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.RegionForm = {};

VegGuide.RegionForm.instrumentPage = function () {
    if ( ! $("region-form") ) {
        return;
    }

    VegGuide.Form.resizeRadioOrCheckboxList("maintainers");
};


/* /usr/local/share/vegguide/js-source/VegGuide/SitewideSearch.js */

JSAN.use("DOM.Events");
JSAN.use("VegGuide.Element");

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.SitewideSearch = {};

VegGuide.SitewideSearch._defaultValue = "name, city, or address";

VegGuide.SitewideSearch.instrumentPage = function () {
    var input = $("sitewide-search-input");

    
    if ( ! input ) {
        return;
    }

    if ( input.value == undefined || ! input.value.length ) {
        input.value = VegGuide.SitewideSearch._defaultValue;
    }

    var help_div = $("sitewide-search-help");

    DOM.Events.addListener(
        input,
        "focus",
        function (e) {
            if ( e.target.value == VegGuide.SitewideSearch._defaultValue ) {
                e.target.value = "";
            }

            VegGuide.SitewideSearch._positionHelpDiv( e.target, help_div );
            DOM.Element.show(help_div);
        }
    );

    DOM.Events.addListener(
        $("sitewide-search-help-close"),
        "click",
        function (e) {
            input.focus();
            DOM.Element.hide(help_div);

            e.preventDefault();
            if ( e.stopPropogation ) {
                e.stopPropagation();
            }
        }
    );

    
    DOM.Events.addListener(
        input,
        "blur",
        function (e) {
            setTimeout( "DOM.Element.hide($('sitewide-search-help'))", 500 );
        }
    );
};

VegGuide.SitewideSearch._positionHelpDiv = function ( input, div ) {
    var pos = VegGuide.Element.realPosition(input);

    var top = pos.top;
    top += input.offsetHeight - 2;

    div.style.top = top + "px";
    div.style.left = pos.left + "px";

    
    div.style.width = ( input.offsetWidth * 0.958 ) + "px";
};


/* /usr/local/share/vegguide/js-source/VegGuide/Suggestions.js */

JSAN.use('DOM.Events');
JSAN.use('DOM.Find');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.Suggestions = {};

VegGuide.Suggestions.instrumentPage = function () {
    if ( ! $("suggestions") ) {
        return;
    }

    var rejects = DOM.Find.getElementsByAttributes( { tagName: "INPUT",
                                                      name:    "reject" } );
    for ( var i = 0; i < rejects.length; i++ ) {
        VegGuide.Suggestions._instrumentRejectSubmit( rejects[i] );
    }
};

VegGuide.Suggestions._instrumentRejectSubmit = function (reject) {
    reject.disabled = false;

    var form = reject.form;

    DOM.Events.addListener(
        reject,
        "click",
        function (e) {
            form["accepted"].value = "0";
            form["x-tunneled-method"].value = "DELETE";
        }
    );
};


/* /usr/local/share/vegguide/js-source/VegGuide/SurveyForm.js */

JSAN.use('DOM.Events');
JSAN.use('VegGuide.Form');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.SurveyForm = {};

VegGuide.SurveyForm.instrumentPage = function () {
    if ( ! $("survey-form") ) {
        return;
    }

    VegGuide.Form.resizeRadioOrCheckboxList("frequency");
    VegGuide.Form.resizeRadioOrCheckboxList("diet");
    VegGuide.Form.resizeRadioOrCheckboxList("activities");
    VegGuide.Form.resizeRadioOrCheckboxList("survey-features");
    VegGuide.Form.resizeRadioOrCheckboxList("other-sites");
};


/* /usr/local/share/vegguide/js-source/VegGuide/UserSearch.js */

JSAN.use('DOM.Element');
JSAN.use('DOM.Events');
JSAN.use('VegGuide.Form');
JSAN.use('VegGuide.InlineSearchForm');

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.UserSearch = {};

VegGuide.UserSearch.instrumentPage = function () {
    new VegGuide.InlineSearchForm( "user", "/user", VegGuide.UserSearch._populateUserList );
};

VegGuide.UserSearch._populateUserList = function ( res, div ) {
    var users = eval( "(" + res.responseText + ")" );

    if ( ! users.length ) {
        div.appendChild( document.createTextNode( "No matching users found." ) );
        return;
    }

    var ul = document.createElement("ul");

    for ( var i = 0; i < users.length; i++ ) {
        var user = users[i];

        var radio = document.createElement("input");

        radio.type  = "radio";
        radio.name  = "user_id";
        radio.value = user.user_id;
        radio.id    = "user_id-" + user.user_id;
        radio.className = "radio";

        var label = document.createElement("label");
        label.htmlFor = radio.id;

        var text = user.real_name;

        label.appendChild( document.createTextNode(text) );

        var li = document.createElement("li");

        li.appendChild(radio);
        li.appendChild(label);

        ul.appendChild(li);
    }

    DOM.Element.hide(div);

    div.appendChild(ul);

    DOM.Element.show(div);

    VegGuide.Form.resizeRadioOrCheckboxList("user-search-results");
};


/* /usr/local/share/vegguide/js-source/VegGuide/Enhancements.js */

JSAN.use("DOM.Element");
JSAN.use("DOM.Events");
JSAN.use("DOM.Ready");
JSAN.use("VegGuide.EntryFilters");
JSAN.use("VegGuide.EntryForm");
JSAN.use("VegGuide.EntryImageSlideshow");
JSAN.use("VegGuide.FrontPageGeolocation");
JSAN.use("VegGuide.GoogleMap");
JSAN.use("VegGuide.HoursForm");
JSAN.use("VegGuide.IEPngFilter");
JSAN.use("VegGuide.LocaleList");
JSAN.use("VegGuide.LocationSearch");
JSAN.use("VegGuide.LoginForm");
JSAN.use("VegGuide.Pagination");
JSAN.use("VegGuide.RatingStars");
JSAN.use("VegGuide.RegionForm");
JSAN.use("VegGuide.SitewideSearch");
JSAN.use("VegGuide.Suggestions");
JSAN.use("VegGuide.SurveyForm");
JSAN.use("VegGuide.UserSearch");
JSAN.use("VegGuide.Widget.PairedMultiSelect");

if ( typeof VegGuide == "undefined" ) {
    VegGuide = {};
}

VegGuide.Enhancements = {};

VegGuide.Enhancements.instrumentAll = function () {
    VegGuide.IEPngFilter.instrumentPage();

    VegGuide.EntryForm.instrumentPage();
    VegGuide.EntryFilters.instrumentPage();
    VegGuide.EntryImageSlideshow.instrumentPage();
    VegGuide.FrontPageGeolocation.instrumentPage();
    VegGuide.HoursForm.instrumentPage();
    VegGuide.LocaleList.instrumentPage();
    VegGuide.LocationSearch.instrumentPage();
    VegGuide.LoginForm.instrumentPage();
    VegGuide.Pagination.instrumentPage();
    VegGuide.RatingStars.instrumentPage();
    VegGuide.RegionForm.instrumentPage();
    VegGuide.SitewideSearch.instrumentPage();
    VegGuide.Suggestions.instrumentPage();
    VegGuide.SurveyForm.instrumentPage();
    VegGuide.UserSearch.instrumentPage();
};

DOM.Ready.onDOMDone( VegGuide.Enhancements.instrumentAll );


/* /usr/local/share/vegguide/js-source/VegGuide.js */

JSAN.use('DOM.Utils');
JSAN.use('VegGuide.Enhancements');

