/**
 * ProWave static object
 */
var ProWave = function()  {};
// Check MSIE version under 7
ProWave.oldIE = (function() {
	var ua = window.navigator.userAgent;
	var msie = ua.indexOf ("MSIE ");
	if ( msie > 0 ) { // If Internet Explorer, check version number
		var ver = parseInt(ua.substring (msie+5, ua.indexOf (".", msie )));
		return (ver < 7)?true:false;
	} else { // If another browser
		return false;
	}
})();
// workaround inline script for IE6 Background Flicker Bug
if (ProWave.oldIE) {
	try {
	  document.execCommand('BackgroundImageCache', false, true);
	} catch(e) {}
}
ProWave.getVisibleRect = function(topleft) {
	// get browser visible area
	var rect = {top:0,left:0,bottom:0,right:0};

	if (window.pageYOffset != undefined){
		//Most non IE
		rect.top = window.pageYOffset;
		rect.left = window.pageXOffset;
	}
	else if (document.body && document.body.scrollTop){
		//IE 6 strict mode
		rect.top = document.body.scrollTop;
		rect.left = document.body.scrollLeft;
	}
	else if (document.documentElement && document.documentElement.scrollTop){
		//Older IE
		rect.top = document.documentElement.scrollTop;
		rect.left = document.documentElement.scrollLeft;
	}
	if(topleft) return rect;
	
	if (window.innerWidth != undefined) {
		//Most non-IE
		rect.right = rect.left + window.innerWidth;
		rect.bottom = rect.top + window.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight){
		//IE 6 strict mode
		rect.right = rect.left + document.documentElement.clientWidth;
		rect.bottom = rect.top + document.documentElement.clientHeight;
	}
	else if (document.body && document.body.clientHeight) {
		//IE 4 compatible
		rect.right = rect.left + document.body.clientWidth;
		rect.bottom = rect.top + document.body.clientHeight;
	}
	return rect;
}
// workaround for IE SelectBox Bug (this workaround can hide the window controls like select box)
ProWave.hideMSCtl = function(over,container,unshared) {
	if (!container) {
		container = over.parentNode;
	}
	var iframeId = container.id + ":iframe";
	if (unshared) {
		iframeId = over.id + "_iframe";
	}
	var iframe = document.getElementById(iframeId);
	if (iframe == null) {
		iframe = document.createElement("iframe");
		iframe.setAttribute("src","");
		iframe.setAttribute("id",iframeId);
		iframe.setAttribute("frameborder","0");
		iframe.style.position = "absolute";
		iframe.style.display = "none";
//		iframe = document.createElement("<iframe src='' id='" + iframeId + "' frameborder='0' style='position:absolute;display:none;'/>");
		container.appendChild(iframe);
	}
	over.style.zIndex = 999;
	iframe.style.zIndex = over.style.zIndex - 1;
	iframe.style.width = over.offsetWidth+"px";
	iframe.style.height = over.offsetHeight+"px";
	iframe.style.top = over.style.top;
	iframe.style.left = over.style.left;
	iframe.style.display = "block";
}
ProWave.showMSCtl = function(over,container,unshared) {
	if (!container) {
		container = over.parentNode;
	}
	var iframeId = container.id + ":iframe";
	if (unshared) {
		iframeId = over.id + "_iframe";
	}
	var iframe = document.getElementById(iframeId);
	if (iframe != null) {
		iframe.style.display = "none";
	}
}
ProWave.fireEvent = function(elem, evtName) {
	if (elem.fireEvent) { //IE
		elem.fireEvent("on"+evtName);
	} else { // DOM2
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(evtName, false, false);
		elem.dispatchEvent(evt);
	}
}
/**
 * Caches rollover images to prevent image request
 */
ProWave.cachedImages = new Object();
ProWave.swapImage = function(obj, url) {
	if (!obj.oSrc) { // cache original image
		obj.oSrc = obj.src;
		if (!ProWave.cachedImages[obj.oSrc]) {
			ProWave.cachedImages[obj.oSrc] = new Image();
			ProWave.cachedImages[obj.oSrc].src = obj.oSrc;
		}
	}
	if (!ProWave.cachedImages[url]) { // cache swap image
		ProWave.cachedImages[url] = new Image();
		ProWave.cachedImages[url].src = url;
	}
	obj.src = url;
}
ProWave.restoreImage = function(obj) {
	if (obj.oSrc) {
		obj.src = obj.oSrc;
	}
}
// set helpText on inputText or inputSecret
ProWave.setHelpText = function(obj, helpText, helpTextClass, secret) {
	if (obj.value == "" || obj.value == helpText) {
		if (secret) {
			try {
				obj.type = "text";
			} catch(e) {
				// IE´Â ±âÁ¸ÀÇ input.typeÀ» º¯°æÇÒ ¼ö ¾ø¾î¼­ workaround Ã³¸®
				var newObj = document.createElement("input");
				newObj.mergeAttributes(obj);
				newObj.type="text";
				newObj.id=obj.id;
				newObj.name=obj.name;
				obj.parentNode.replaceChild(newObj, obj);
				obj = newObj;
			}
		}
		obj.value=helpText;
		if (helpTextClass!="") {
			$(obj).addClassName(helpTextClass);
		}
	}
}
// clear helpText on inputText or inputSecret
ProWave.clearHelpText = function(obj, helpText, helpTextClass, secret) {
	if (obj.value == helpText) {
		if (secret) {
			try {
				obj.type = "password";
				obj.style.overflow="auto";
			} catch(e) {
				// IE´Â ±âÁ¸ÀÇ input.typeÀ» º¯°æÇÒ ¼ö ¾ø¾î¼­ workaround Ã³¸®
				var newObj = document.createElement("input");
				newObj.mergeAttributes(obj);
				newObj.type="password";
				newObj.id=obj.id;
				newObj.name=obj.name;
				obj.parentNode.replaceChild(newObj, obj);
				obj = newObj;
				// ±³Ã¼ÈÄ select()½Ã focusÀÌº¥Æ® Áßº¹ ¹ß»ýÇÏ¹Ç·Î clear ÈÄ ¹Ù·Î ¸®ÅÏ
				obj.value="";
				if (helpTextClass!="") {
					$(obj).removeClassName(helpTextClass);
				}
				if (obj.activate) {
					obj.activate();
				} else {
					obj.select();
					obj.focus();
				}
				return true;
			}
		}
		obj.value="";
		if (helpTextClass!="") {
			$(obj).removeClassName(helpTextClass);
		}
		if (obj.activate) {
			obj.activate();
		} else {
			obj.select();
			obj.focus();
		}
	}
}
// focus on the next input when current input's value is maxlength
ProWave.focusNext = function(obj) {
	if (obj.value.length < obj.maxLength) return;
	var f = obj.form;
	if (f) {
		var elems = f.elements;
		var flag = false;
		for (var i=0; i < elems.length; i++) {
			if (flag) {
				elems[i].focus();
				return;
			}
			if (elems[i] == obj) {
				flag = true;
			}
		}
	}
}
ProWave.clearInputs = function(obj) {
	var f = obj.form;
	if (f) {
		var elems = f.elements;
		for (var i=0; i < elems.length; i++) {
			var elem = elems[i];
			if (!elem.readonly && !elem.disabled) {
			    if (elem.type=="text"||elem.type=="passward"||elem.type=="textarea"||elem.type=="select-one"||elem.type=="select-multiple") {
			    	elem.value = "";
				} else if (elem.type=="radio"||elem.type=="checkbox") {
					elem.checked = false;
				}
			} 
		}
		return false;
	}
}

ProWave.CID = 'prowave.ajax.cid';
ProWave.ACCEPT = 'prowave.ajax.accept';

/**
 * Caches ajax event handlers to destroy when no longer used
 */
ProWave.cached = new Hash();
/**
 * privides ajaxSupport functionality
 * @param elementId client id of JSF UIComponent
 * @param eventName	javascript event name
 * @param options ajax options
 */
ProWave.ajaxSupport = function(elementId, eventName, options) {
    var opts = $H(options);
	var element = $(elementId);
    if (element) {
        opts.set(ProWave.CID, elementId);
        opts.set('event', eventName);
        if (eventName.indexOf(':') == -1) { // custom event
            ProWave.deferEvent(elementId, eventName);
	    	if (eventName.indexOf('on') == 0) {
	            eventName = eventName.substring(2);
	        }
        } else {
            if (element && element.tagName == 'A') {
                ProWave.deferEvent(elementId, 'onclick');
            }
        }
        if (eventName == 'timer' && opts.get('periodical') >= 0) {
        	var form = element.up('form');
            var executor = element.executor;
            if (executor) {
                executor.stop();
                element.executor = null;
            }
            var periodic = opts.unset('periodical');
            if (periodic > 0) {
            	var delay = opts.unset('throttleTimeout');
            	if (!delay) delay = 1000;
            	window.setTimeout(function() {
		            element.executor = new PeriodicalExecuter(function(pe) {
		            	if (this.fail && !confirm('Continue ajax polling?')) {
		            		pe.stop();
		            		element.executor = null;
		            		return;
		            	}
		                ProWave.ajaxFormSubmit(form, element, opts);
		            }, periodic);
            	}, delay);
            } else {
            	element.observe('pw:pushStart', function(e) {
            		var elm = e.element();
            		if (e.memo.periodical) {
            			var interval = e.memo.periodical;
            			if (elm.executor || interval < 1) { // already listening
            				return;
            			}
            			elm.executor = new PeriodicalExecuter(function(pe) {
    		            	if (this.fail && !confirm('Continue ajax polling?')) {
    		            		pe.stop();
    		            		elm.executor = null;
    		            		return;
    		            	}
            				ProWave.ajaxFormSubmit(form, elm, opts);
            			}, interval);
            		}
            	});
            	element.observe('pw:pushStop', function(e) {
            		var elm = e.element();
            		if (elm.executor) {
            			elm.executor.stop();
            			elm.executor = null;
            		}
            	});	
            }
        	return;
        }
        var listener = ProWave.ajaxEventHandler.bindAsEventListener({options:opts});
        ProWave.cached.set(elementId, {'event': eventName, 'handler': listener});
        Event.observe(element, eventName, listener);
    } else {
        throw new Error('Can not find component identified by ' + elementId);
    }
}

/**
 * removes ajax event handlers registered when page is loading
 */
ProWave.collectGarbage = function(element) {
    if (!element) {
        return;
    }
    var len = element.id.split(':').length;
    ProWave.cached.keys().each(function(id) {
        if (len < id.split(':').length && id.startsWith(element.id)) {
            var g = ProWave.cached.unset(id);
            if (g) {
            	if ($(id)) {
	                var e = $(id).stopObserving(g.event, g.handler);
	                e = null;
            	} else {
            		g.event = null;
            		g.handler = null;
            	}
            	g = null;
		   }
        }
    });
}
/**
 * unloads event handlers remained in cache
 */
/*
window.onbeforeunload = function() {
    ProWave.cached.keys().each(function(key) {
        ProWave.collectGarbage($(key));
    });
}
*/
/**
 * ajax event handler, when user clicks control registered as ajax this handler will be
 * invoked
 * @param event javascript event
 */
ProWave.ajaxEventHandler = function(event) {
    var element = Event.element(event);
    var anchor = element.up('a');
    if (anchor) {
    	element = anchor;
    }
    var form = element.up('form');
    if (!form) {
        throw new Error('Can not find form element in this document!');
        return;
    }
	var options = $H(this.options);
	var bubble = options.unset('handleBubble');
	if (!bubble && element.id != options.get(ProWave.CID)) {
	   return; // it's not a ajax component
	} 
	var throttleTimeout = options.unset('throttleTimeout');
	if (throttleTimeout) {
		if (element.timerId) { // timerId is a proprietary attribute
			window.clearTimeout(element.timerId);
			element.timerId = null;
		}
	} else {
		throttleTimeout = 0;
	}
	element.timerId = window.setTimeout(function() {
		element.timerId = null;
	    var onsubmitHandler = ProWave.loadHandler(options.unset('onsubmit'));
	    if (onsubmitHandler && onsubmitHandler.call(element) == false) {
	        return;
	    }
	    if (form.onsubmit) {
	    	ProWave.deferredHandler.set(form.id+'_onsubmit', form.onsubmit);
	    }
	    if (element && element.tagName == 'A') { // A tag
	    	var href = element.getAttribute("href");
	    	if (href.startsWith('#') || href.endsWith('#')) {  // CommandLink
	    		ProWave.handleCommandLinkEvent(form, element, options);
	    	} else { // OutputLink
	    		ProWave.handleOutputLinkEvent(form, element, options);
	    	}
	    } else { // INPUT or other tags
	        var type = element.getAttribute('type');
	        if (type == 'submit') {
	        	ProWave.handleCommandButtonEvent(form, element, options);
	        	return;
	        }
	        // default form submit
	        ProWave.ajaxFormSubmit(form, element, options);
	    }
	}, throttleTimeout);
}

/**
 * Saves original javascript event registered on UI control
 */
ProWave.deferredHandler = new Hash();

/**
 * Defers original javascript event
 * @param elementId client id of JSF component
 * @param handle event name
 */
ProWave.deferEvent = function(elementId, handle) {
	var script = '$(\''+elementId+'\').'+ handle;
    var handler = eval(script);
    if (handler) {
	    ProWave.deferredHandler[elementId] = handler;
	   	eval(script + ' = function() {return false;};');
	}
}

/**
 * Submits form data in ajax mode!
 * @param form HTML form object
 * @param element UI control fired ajax event
 * @param options options used to make ajax communication
 */
ProWave.ajaxFormSubmit = function(form, element, options) {
    // need not to send oncomplete option to server!
    var accepts = options.get(ProWave.ACCEPT).evalJSON(); // array object
    $(element).fire('pw:onsubmit', {accept:accepts});
    var oncompleteHandler = ProWave.loadHandler(options.unset('oncomplete'));
    var onsuccessHandler = ProWave.loadHandler(options.unset('onsuccess'));
    var onfailureHandler = ProWave.loadHandler(options.unset('onfailure'));
    
    var type = element.getAttribute('type');
    if (type && (type == 'submit' || type == 'image' || type == 'button')) {
		var eName = element.id;
		if (element.name) {
			eName = element.name;
		}
		if (element.tagName == 'BUTTON') {
			eName += ".b"; // ie6 button submit bug workround
		}
		options.set(eName, element.value); // include itself
    }
    var timerId = null;
    var eId = element.id;
    form.request({
       method: 'post',
       parameters: options.toQueryString(),
       onComplete: function() { 
       		if (timerId) {
       			window.clearTimeout(timerId);
       			window.defaultStatus = '';
       		}
       		if (oncompleteHandler) {
       			oncompleteHandler.call($(eId));
       		}
       		var target = $(eId) ? $(eId) : document;
       		if (target.disabled) {
         	   target = form;
            }
       		target.fire('pw:oncomplete', {accept:accepts});
       		//form.onsubmit = null; // return to original status
       		if (typeof ProWave.deferredHandler.get(form.id+'_onsubmit') == 'undefined') {
       			form.onsubmit = null;
       		} else {
	       		form.onsubmit = ProWave.deferredHandler.get(form.id+'_onsubmit');
	       	}
       		element = null; // garbage collect
       		if (ProWave.href) {
       			document.location.href = ProWave.href;
       		}
       },
       onSuccess: function(response) {
    	   var target = $(eId) ? $(eId) : document;
    	   if (response.status == 0 || response.status >= 400) { // if firefox
				if (target.executor) {
					target.executor.fail = true;
				}
				return;
    	   }
           if (onsuccessHandler) {
               onsuccessHandler.call($(eId));
           }
   			if (target.disabled) {
         	   target = form;
            }
           target.fire('pw:onsuccess', {accept:accepts});
       },
       onFailure: function(req, header) {
           var target = $(eId) ? $(eId) : document;
       		if (target.disabled) {
         	   target = form;
            }
    	   	if (target.executor) {
    	   		target.executor.fail = true;
    	   	}
           target.fire('pw:onfailure', {accept:accepts});
           if (onfailureHandler) {
               onfailureHandler.call($(eId));
           } else {
           		if (req.status == 12029) { // if IE
           		   throw new Error('Can not connect with Server!\n\nURL: ' + form.action);
           		} else {
           		   throw new Error('Failed asynchronous communication!\n\nURL: ' + form.action 
                        + '\n'+ req.status + ': ' + req.statusText);
           		}
           }
       },
       onException: function(req, err) { // Firefox
       		var target = $(eId) ? $(eId) : document;
       		if (target.disabled) {
         	   target = form;
            }
    	   	if (target.executor) {
    	   		target.executor.fail = true;
    	   	}
       		target.fire('pw:onexception', {accept:accepts});
            throw new Error('Exception is raised during asynchronous communication!\nURL: '
                   + form.action +'\n' + err.message);
       }
    });
    var msg = 'Asynchronous transaction is underway. Please wait...';
    timerId = window.setTimeout('window.defaultStatus = \'' + msg + '\';', 1000);
	
}

/**
 * loads anonymous javascript handler using specified javascript handle
 */
ProWave.loadHandler = function(handle) {
    if (handle) {
        return new Function(handle);
    }
    return null;
}

/**
 * Handles event when user clicks CommandButton control
 * @param form HTML form object
 * @param element UI component fired ajax event
 * @param options options used to make ajax communication
 */
ProWave.handleCommandButtonEvent = function(form, element, options) {
	var script = ProWave.deferredHandler[element.id];
    if (script) {
        script();
    }
 	ProWave.ajaxFormSubmit(form, element, options);        
}

/**
 * Handles event when user clicks CommandLink control
 * @param form HTML form object
 * @param element UI component fired ajax event
 * @param options options used to make ajax communication
 */
ProWave.handleCommandLinkEvent = function(form, element, options) {
	form.onsubmit = function() {
	    ProWave.ajaxFormSubmit(form, element, options); // sends form data in ajax mode
	    return false;
	}
	var script = ProWave.deferredHandler[element.id];
	if (script)  script();
}

/**
 * Handles event when user click OutputLink control
 * @param form HTML form object
 * @param element UI component fired ajax event
 * @param options options used to make ajax communication
 */
ProWave.handleOutputLinkEvent = function(form, element, options) {
	var script = ProWave.deferredHandler[element.id];
	if (script)  script();
	var href = element.getAttribute("href");
	var params = href.toQueryParams();
	if (options) {
		options.merge(params);
	} else {
		options = params;
	}
	ProWave.ajaxFormSubmit(form, element, options);
}

ProWave.refresh = function(id, content) {
    if (content) {
        ProWave.collectGarbage($(id));// collect garbage first
        var del = 'id="';
        var idx = content.indexOf(del);
        if (idx != -1) { // extract id from content
            var idxx = content.indexOf('"', idx + del.length + 1);
            id = content.substring(idx + del.length, idxx);
            // id can be different from original id(param)
        }
    }
    var v = $(id);
	if (v) {
	    if (typeof Validator != 'undefined') {
	       Validator.removeOverlay(id);
	    } 
		if (!content) {
			v.hide();
		} else {
		    try {
		      v.fire('pw:refresh');// notifies listenes that it's about to refresh
		    } catch (e) {}
			ProWave.swap(v, content);
		}
	} else {
	   throw new Error('There is no element to render: ' + id);
	}
	v = null;
}

ProWave._evalScript = function(e, c) {
	c.extractScripts().collect(function(s) {
		var t = document.createElement('script');
		t.text = s;
		e.appendChild(t);
		t.text = "";
	});
}

ProWave.swap = function(element, content) {
	if (content && content.toElement) content = content.toElement();
	else if (!Object.isElement(content)) {
		content = Object.toHTML(content);
		if (element.outerHTML && !Prototype.Browser.Gecko) {
			var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
			if (Element._insertionTranslations.tags[tagName]) {
				var nextSibling = element.next();
				var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
				parent.removeChild(element);
				if (nextSibling)
					fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
				else
					fragments.each(function(node) { parent.appendChild(node) });
				ProWave._evalScript($(element.id), content);
			} else {
				element.outerHTML = content.stripScripts();
				ProWave._evalScript($(element.id).parentNode, content);
			}
		} else {
			var range = element.ownerDocument.createRange();
			range.selectNode(element);
			content.evalScripts.bind(content).defer();
			content = range.createContextualFragment(content.stripScripts());
			element.parentNode.replaceChild(content, element);
		}
	}
    try {
	    if (element.outerHTML && element.outerHTML.length > 0) {
	        element.outerHTML = '';
	    } else if (element.innerHTML && element.innerHTML.length > 0) {
	        element.innerHTML = '';
	    }
    } catch (e) {}
}

ProWave.updateViwState = function(formIds, state) {
    for (var i = 0; i < formIds.length; i++) {
        var form = $(formIds[i]);
        if (form) {
            var en = form.getInputs('hidden', 'javax.faces.ViewState');
            if (en.size() > 0) {
	            en.each(function(input) {
		            input.value = state;
		        });
		    } else { // if no element exist, create one
                var e = new Element('input',{'type':'hidden', 
                    'id':'javax.faces.ViewState', 
                    'name':'javax.faces.ViewState', 'value':state});
                form.appendChild(e);
		    } 
	    }
    }
}

ProWave.include = function (tag, s) {
    if (!ProWave._included(tag, s)) {
        var h = $$('head');
        if (h && h.length > 0) {
            var mime = (tag == 'script') ? 'javascript' : 
                            (tag == 'link') ? 'css' : '*';
            if (mime == 'javascript') {
            	if (!h.scriptNames || !h.scriptNames.include(s)) {
	                new Ajax.Request(s, {
	                    asynchronous: false, 
	                    method: 'get',
	                    onSuccess: function(response){
	                        ProWave.inline(tag, response.responseText);
                            response.evaluated = true; // custom property
	                }});
	                if (!h.scriptNames) {
	                    h.scriptNames = [];
	                }
	                h.scriptNames[h.scriptNames.length] = s;
            	}
            }
            if (mime == 'css') {
                var t = document.createElement(tag);
                t.setAttribute('type', 'text/'+mime);
                t.setAttribute('rel', 'stylesheet');
                t.href = s;
                h[0].appendChild(t);
            }
        }
    }
}

ProWave.inline = function(tag, src) {
    var defined = $A(document.getElementsByTagName(tag)).findAll(function(s) {
        return (s.text == src);
    });
    if (!defined || defined.length == 0) {
        var h = $$('head');
        if (h && h.length > 0) {
            var t = document.createElement(tag);
            var type = (tag == 'script') ? 'text/javascript' : (tag == 'style') ? 'text/css' : null;  
            if (type) {
                t.setAttribute('type', type);
            }
            if (tag == 'script') {
                t.text = src;
            }
            h[0].appendChild(t);
            if (tag == 'style') {
                if (Prototype.Browser.IE) {
                    var ssLen = document.styleSheets.length;
                    if (document.styleSheets[ssLen-1].cssText.length == 0) {
                        document.styleSheets[ssLen-1].cssText = src;
                    }
                } else {
                    var txt = document.createTextNode(src);
                    t.appendChild(txt);
                }
            }
        }
    }
}

ProWave._included = function (tag, s) {
    var nm = s;
    var idx = s.lastIndexOf('/');
    if (idx != -1) {
        nm = s.substring(idx);
    }
    var defined = $A(document.getElementsByTagName(tag)).findAll(function(ss) {
        return (ss.src && ss.src.endsWith(nm)) || ss.href && ss.href.endsWith(nm);
    });
    return (defined && defined.length > 0);
}

/** remote method invocation in asynchronous mode */
ProWave.ajaxCall = function(name, el, params, async, formNm) {
    params = params ? new Hash(params) : new Hash();
    params.set('prowave.ajax.rmi', el);
    params.set('javax.portlet.SoloPortletRender', 'true');
    var ret = null;
    async = (typeof async == 'undefined') ? true : async;
    var url = document.URL;
    if (formNm && document.forms[formNm]) {
    	url = document.forms[formNm].action;
    }
    
	if (url.endsWith('#')) { // if IE it doesn't process properly
		var i = url.lastIndexOf('#');
		url = document.URL.substring(0, i);
	}
	var callback = eval('typeof ' + name + ' != \'undefined\'') ? eval(name) : null;
    new Ajax.Request(url, {
       method: 'post',
       asynchronous: async,
       parameters: params.toQueryString(),
       onSuccess: function(res) {
          var json = res.responseJSON;
          json = (json != null) ? json.value : res.responseText;
          ret = {status:res.status, result:json};
          if (async) {
            $(document).fire('pw:'+name, ret);
            if (callback) {
            	callback.call(null, json, res.status);
            }
          }
       },
       onFailure: function(res) {
          ret = {status:res.status, result:res.responseText};
          if (async) {
            $(document).fire('pw:'+name, ret);
            if (callback) {
            	callback.call(null, ret, res.status);
            }
          }
       }
    });
    return ret;
}
/** remote method invocation in synchronous mode */
ProWave.remoteCall = function(el, params, formNm) {
    return ProWave.ajaxCall('_remoteCall_', el, params, false, formNm);
}

ProWave.ajaxRefresh = function() {
    if (arguments.length == 0) {
        return;
    }
    var args = [];
    for (var i = 0; i < arguments.length; i++) { // remove redundancy
        args[args.length] = arguments[i];
    }
    args = args.uniq();
    
    var c = $(args[0]);
    if (!c) {
        throw new Error('Element identified by "'+args[0]+'" does not exist!'); 
    }
    var f = c.up('form');
    if (!f) {
        throw new Error('Element identified by "'+args[0]+'" does not have form ancestor!');
    }
    var accept = '[' ;
    for (var i = 0; i < args.length; i++) {
        if (i > 0) accept += ',';
        accept += ('"' + args[i] + '"');
    }
    accept += ']';
    var o = new Hash(); // options
    o.set(ProWave.CID, c.identify());
    o.set(ProWave.ACCEPT, accept);
    o.set('javax.portlet.SoloPortletRender', 'true');
    ProWave.ajaxFormSubmit(f, c, o);
    
    return false;
}




