/******************************************************************************
* gshpAjaxCatalog.js
*******************************************************************************

*******************************************************************************
*                                                                             *
* Copyright 2008
*                                                                             *
******************************************************************************/

var gshp;
if (YAHOO.lang.isUndefined(gshp))
	gshp = {};
gshp.catalog = function()
{
	return {
		getAPIURL:function() { return gshpAjaxCatalogURL; },
		createFinder:function(m) {
			var ajaxId = null;
			var elements = null;
			var method = m || "referenceByOid";
			var events = {
				error:new YAHOO.util.CustomEvent("error"),
				end:new YAHOO.util.CustomEvent("end")
			};
			return {
				onEnd:function(fn,scope) {
					events.end.subscribe(fn,scope);
				},
				onError:function(fn,scope) {
					events.error.subscribe(fn,scope);
				},
				find:function(params) {
					YAHOO.log("find using "+method,"info","gshp.catalog");
					if (ajaxId != null)
					{
						YAHOO.log("abort "+ajaxId.tId,"warn","gshp.catalog");
						YAHOO.util.Connect.abort(ajaxId,null,false);
					}
					elements = null;
					params = params || {};
					params.f = method;
					var q = [];
					for (var n in params)
						q.push(n+"="+encodeURIComponent(params[n]));
					ajaxId = YAHOO.util.Connect.asyncRequest('GET',
						gshpAjaxCatalogURL + ((gshpAjaxCatalogURL.indexOf('?') == -1)?'?':'&') + q.join("&"), {
						success:function(o) {
							YAHOO.log("onSuccess "+ajaxId.tId,"info","gshp.catalog");
							ajaxId = null;
							elements = [];
							ajax.util.readResponse(o, {
								gshp: {
									reference:function(e) {
										elements[elements.length] = ajax.util.parseDataXMLElement(e);
										return true;
									}
								}},
								function (code, params) {
									elements = null;
									events.error.fire(code,params);
								},
								function () {
									events.end.fire(elements.length);
								}
							);
						},
						failure:function(o) {
							YAHOO.log("onFailure "+ajaxId.tId,"error","gshp.catalog");
							ajaxId = null;
							events.error.fire("ajax.errors.internal","Internal error");
						}},null);
				},
				eachElement:function(fn, scope) {
					if (elements != null)
						YAHOO.util.Dom.batch(elements, fn, scope, true);
				},
				getCount:function() {
					return elements!=null ? elements.length : 0;
				}
			};
			return new Finder();
		}
	};
}();
