// SpryHTMLPanel.js - version 0.4 - Spry Pre-Release 1.6
//
// Copyright (c) 2007. Adobe Systems Incorporated.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of Adobe Systems Incorporated nor the names of its
//     contributors may be used to endorse or promote products derived from this
//     software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

var Spry;if(!Spry)Spry={};if(!Spry.Widget)Spry.Widget={};Spry.Widget.HTMLPanel=function(ele,opts)
{Spry.Widget.HTMLPanel.Notifier.call(this);this.element=Spry.Widget.HTMLPanel.$(ele);this.evalScripts=Spry.Widget.HTMLPanel.evalScripts;this.loadingContentClass="HTMLPanelLoadingContent";this.errorContentClass="HTMLPanelErrorContent";this.loadingStateContent="";this.errorStateContent="";this.loadingStateClass="HTMLPanelLoading";this.errorStateClass="HTMLPanelError";this.pendingRequest=null;Spry.Widget.HTMLPanel.setOptions(this,opts);var elements=this.element.getElementsByTagName("*");var numElements=elements.length;var errorEle=null;var loadingEle=null;var d=document.createElement("div");for(var i=0;i<numElements&&(!loadingEle||!errorEle);i++)
{var e=elements[i];if(Spry.Widget.HTMLPanel.hasClassName(e,this.loadingContentClass))
loadingEle=e;if(Spry.Widget.HTMLPanel.hasClassName(e,this.errorContentClass))
errorEle=e;}
if(loadingEle)
this.loadingStateContent=Spry.Widget.HTMLPanel.removeAndExtractContent(loadingEle,this.loadingContentClass);if(errorEle)
this.errorStateContent=Spry.Widget.HTMLPanel.removeAndExtractContent(errorEle,this.errorContentClass);};Spry.Widget.HTMLPanel.evalScripts=false;Spry.Widget.HTMLPanel.Notifier=function()
{this.observers=[];this.suppressNotifications=0;};Spry.Widget.HTMLPanel.Notifier.prototype.addObserver=function(observer)
{if(!observer)
return;var len=this.observers.length;for(var i=0;i<len;i++)
{if(this.observers[i]==observer)
return;}
this.observers[len]=observer;};Spry.Widget.HTMLPanel.Notifier.prototype.removeObserver=function(observer)
{if(!observer)
return;for(var i=0;i<this.observers.length;i++)
{if(this.observers[i]==observer)
{this.observers.splice(i,1);break;}}};Spry.Widget.HTMLPanel.Notifier.prototype.notifyObservers=function(methodName,data)
{if(!methodName)
return;if(!this.suppressNotifications)
{var len=this.observers.length;for(var i=0;i<len;i++)
{var obs=this.observers[i];if(obs)
{if(typeof obs=="function")
obs(methodName,this,data);else if(obs[methodName])
obs[methodName](this,data);}}}};Spry.Widget.HTMLPanel.Notifier.prototype.enableNotifications=function()
{if(--this.suppressNotifications<0)
{this.suppressNotifications=0;Spry.Debug.reportError("Unbalanced enableNotifications() call!\n");}};Spry.Widget.HTMLPanel.Notifier.prototype.disableNotifications=function()
{++this.suppressNotifications;};Spry.Widget.HTMLPanel.prototype=new Spry.Widget.HTMLPanel.Notifier();Spry.Widget.HTMLPanel.prototype.constructor=Spry.Widget.HTMLPanel;Spry.Widget.HTMLPanel.$=function(ele)
{if(ele&&typeof ele=="string")
return document.getElementById(ele);return ele;};Spry.Widget.HTMLPanel.setOptions=function(dstObj,srcObj,ignoreUndefinedProps)
{if(srcObj)
{for(var optionName in srcObj)
{if(ignoreUndefinedProps&&srcObj[optionName]==undefined)
continue;dstObj[optionName]=srcObj[optionName];}}};Spry.Widget.HTMLPanel.addClassName=function(ele,className)
{ele=Spry.Widget.HTMLPanel.$(ele);if(!ele||!className||(ele.className&&ele.className.search(new RegExp("\\b"+className+"\\b"))!=-1))
return;ele.className+=(ele.className?" ":"")+className;};Spry.Widget.HTMLPanel.removeClassName=function(ele,className)
{ele=Spry.Widget.HTMLPanel.$(ele);if(Spry.Widget.HTMLPanel.hasClassName(ele,className))
ele.className=ele.className.replace(new RegExp("\\s*\\b"+className+"\\b","g"),"");};Spry.Widget.HTMLPanel.hasClassName=function(ele,className)
{ele=Spry.Widget.HTMLPanel.$(ele);if(!ele||!className||!ele.className||ele.className.search(new RegExp("\\b"+className+"\\b"))==-1)
return false;return true;};Spry.Widget.HTMLPanel.removeAndExtractContent=function(ele,className)
{var d=document.createElement("div");if(ele)
{d.appendChild(ele);if(className)
Spry.Widget.HTMLPanel.removeClassName(ele,className);}
return d.innerHTML;};Spry.Widget.HTMLPanel.findNodeById=function(id,node)
{if(node&&node.nodeType==1)
{if(node.id==id)
return node;var child=node.firstChild;while(child)
{var result=Spry.Widget.HTMLPanel.findNodeById(id,child);if(result)
return result;child=child.nextSibling;}}
return null;};Spry.Widget.HTMLPanel.disableSrcReferences=function(source)
{if(source)
source=source.replace(/<(img|script|link|frame|iframe|input)([^>]+)>/gi,function(a,b,c){return'<'+b+c.replace(/\b(src|href)\s*=/gi,function(a,b){return'spry_'+b+'=';})+'>';});return source;};Spry.Widget.HTMLPanel.enableSrcReferences=function(source)
{source=source.replace(/<(img|script|link|frame|iframe|input)([^>]+)>/gi,function(a,b,c){return'<'+b+c.replace(/\bspry_(src|href)\s*=/gi,function(a,b){return b+'=';})+'>';});return source;};Spry.Widget.HTMLPanel.getFragByID=function(id,contentStr)
{var frag=Spry.Widget.HTMLPanel.disableSrcReferences(contentStr);var div=document.createElement("div");div.innerHTML=frag;frag="";var node=Spry.Widget.HTMLPanel.findNodeById(id,div);if(node)
frag=node.innerHTML;return Spry.Widget.HTMLPanel.enableSrcReferences(frag);};Spry.Widget.HTMLPanel.prototype.setContent=function(contentStr,id)
{var data={content:contentStr,id:id};this.notifyObservers("onPreUpdate",data);contentStr=data.content;id=data.id;if(typeof id!="undefined")
contentStr=Spry.Widget.HTMLPanel.getFragByID(id,contentStr);Spry.Widget.HTMLPanel.setInnerHTML(this.element,contentStr,!this.evalScripts);this.removeStateClasses();this.notifyObservers("onPostUpdate",data);};Spry.Widget.HTMLPanel.prototype.loadContent=function(url,opts)
{if(!this.element)
return;this.cancelLoad();if(!opts)
opts=new Object;opts.url=opts.url?opts.url:url;opts.method=opts.method?opts.method:"GET";opts.async=opts.async?opts.async:true;opts.id=opts.id?opts.id:undefined;var self=this;opts.errorCallback=function(req){self.onLoadError(req);};this.notifyObservers("onPreLoad",opts);if(this.loadingStateContent)
this.setContent(this.loadingStateContent);Spry.Widget.HTMLPanel.addClassName(this.element,this.loadingStateClass);this.pendingRequest=Spry.Widget.HTMLPanel.loadURL(opts.method,opts.url,opts.async,function(req){self.onLoadSuccessful(req);},opts);};Spry.Widget.HTMLPanel.prototype.cancelLoad=function()
{try
{if(this.pendingRequest&&this.pendingRequest.xhRequest)
{var xhr=this.pendingRequest.xhRequest;if(xhr.abort)
xhr.abort();xhr.onreadystatechange=null;this.notifyObservers("onLoadCancelled",this.pendingRequest);}}
catch(e){}
this.pendingRequest=null;};Spry.Widget.HTMLPanel.prototype.removeStateClasses=function()
{Spry.Widget.HTMLPanel.removeClassName(this.element,this.loadingStateClass);Spry.Widget.HTMLPanel.removeClassName(this.element,this.errorStateClass);};Spry.Widget.HTMLPanel.prototype.onLoadSuccessful=function(req)
{this.notifyObservers("onPostLoad",req);this.setContent(req.xhRequest.responseText,req.id);this.pendingRequest=null;};Spry.Widget.HTMLPanel.prototype.onLoadError=function(req)
{this.notifyObservers("onLoadError",req);if(this.errorStateContent)
this.setContent(this.errorStateContent);Spry.Widget.HTMLPanel.addClassName(this.element,this.errorStateClass);this.pendingRequest=null;};Spry.Widget.HTMLPanel.msProgIDs=["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0"];Spry.Widget.HTMLPanel.createXMLHttpRequest=function()
{var req=null;if(window.ActiveXObject)
{while(!req&&Spry.Widget.HTMLPanel.msProgIDs.length)
{try{req=new ActiveXObject(Spry.Widget.HTMLPanel.msProgIDs[0]);}catch(e){req=null;}
if(!req)
Spry.Widget.HTMLPanel.msProgIDs.splice(0,1);}}
if(!req&&window.XMLHttpRequest){try{req=new XMLHttpRequest();}catch(e){req=null;}}
return req;};Spry.Widget.HTMLPanel.loadURL=function(method,url,async,callback,opts)
{var req=new Object;req.method=method;req.url=url;req.async=async;req.successCallback=callback;Spry.Widget.HTMLPanel.setOptions(req,opts);try
{req.xhRequest=Spry.Widget.HTMLPanel.createXMLHttpRequest();if(!req.xhRequest)
return null;if(req.async)
req.xhRequest.onreadystatechange=function(){Spry.Widget.HTMLPanel.loadURL.callback(req);};req.xhRequest.open(method,req.url,req.async,req.username,req.password);if(req.headers)
{for(var name in req.headers)
req.xhRequest.setRequestHeader(name,req.headers[name]);}
req.xhRequest.send(req.postData);if(!req.async)
Spry.Widget.HTMLPanel.loadURL.callback(req);}
catch(e){if(req.errorCallback)req.errorCallback(req);req=null;}
return req;};Spry.Widget.HTMLPanel.loadURL.callback=function(req)
{if(!req||req.xhRequest.readyState!=4)
return;if(req.successCallback&&(req.xhRequest.status==200||req.xhRequest.status==0))
req.successCallback(req);else if(req.errorCallback)
req.errorCallback(req);};Spry.Widget.HTMLPanel.eval=function(str){return eval(str);};Spry.Widget.HTMLPanel.setInnerHTML=function(ele,str,preventScripts)
{if(!ele)
return;if(!str)str="";ele=Spry.Widget.HTMLPanel.$(ele);var scriptExpr="<script[^>]*>(.|\s|\n|\r)*?</script>";ele.innerHTML=str.replace(new RegExp(scriptExpr,"img"),"");if(preventScripts)
return;var matches=str.match(new RegExp(scriptExpr,"img"));if(matches)
{var numMatches=matches.length;for(var i=0;i<numMatches;i++)
{var s=matches[i].replace(/<script[^>]*>[\s\r\n]*(<\!--)?|(-->)?[\s\r\n]*<\/script>/img,"");Spry.Widget.HTMLPanel.eval(s);}}};