/*
Foundation
Copyright © 2005-2010 Scott Nesin, all rights reserved.
Documentation: http://FoundationDotJS.org/
*/
/*
   ***** Preprocessed code, any modifications will be lost. *****
     Foundation.js, object oriented JavaScript framework:
     http://FoundationDotJS.org/
     Preprocessed for speed:
     http://FoundationDotJS.org/Foundation.Preprocessor.htm
*/
var Foundation;
if (!Foundation)
{
if (typeof(String.prototype.htmlEncode)!="function")String.prototype.htmlEncode=function(){return this.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");};
if (typeof(String.prototype.xmlEncode)!="function")String.prototype.xmlEncode=function(){return this.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&apos;");};
if (typeof(String.prototype.urlEncode)!="function")String.prototype.urlEncode=function(){return escape(this).replace(/\+/g,"%2B").replace(/\//g,"%2F").replace(/@/g,"%40").replace(/%20/g,"+").replace(/%21/g,"!").replace(/%27/g,"'").replace(/%28/g,"(").replace(/%29/g,")");};
if (typeof(String.prototype.cEncode)!="function")String.prototype.cEncode=function(){return this.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/"/g,"\\\"").replace(/\r/g,"\\r").replace(/\n/g,"\\n");};
if (typeof(String.prototype.trim)!="function")String.prototype.trim=function(){return this.replace(/^\s+/,"").replace(/\s+$/,"");};
if (typeof(String.prototype.setAt)!="function")String.prototype.setAt=function(index,value){value=value.toString();return this.substr(0,index)+value+this.substr(index+value.length);};

/*@cc_on @*/
/*@if (@_jscript_version >= 5.5)
if (typeof(String.prototype.regExpEncode)!="function")String.prototype.regExpEncode=function(){return this.replace(/\\|\^|\$|\*|\+|\?|\.|\||\-|\{|\}|\(|\)|\[|\]/g,"\\$&");};
if (typeof(String.prototype.replaceEncode)!="function")String.prototype.replaceEncode=function(){return this.replace(/\$/g,"$$$$");};
  @else @*/
if (typeof(String.prototype.regExpEncode)!="function")String.prototype.regExpEncode=function(){return this.replace(/\\/g,"\\\\").replace(/\^/g,"\\^").replace(/\$/g,"\\$").replace(/\*/g,"\\*").replace(/\+/g,"\\+").replace(/\?/g,"\\?").replace(/\./g,"\\.").replace(/\|/g,"\\|").replace(/\-/g,"\\-").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/\(/g,"\\(").replace(/\)/g,"\\)").replace(/\[/g,"\\[").replace(/\]/g,"\\]");};
if (typeof(String.prototype.replaceEncode)!="function")String.prototype.replaceEncode=function(){return this;};
/*@end @*/
if (typeof(Array.prototype.push)!="function")Array.prototype.push=new Function("var l=this.length;var i;for(i=0;i<arguments.length;i++)this[l+i]=arguments[i];return l+i;");
if (typeof(Array.prototype.pop)!="function")Array.prototype.pop=new Function("if (this.length>0){var v=this[this.length-1];this.length--;return v;}");
if (typeof(Function.prototype.apply)!="function")Function.prototype.apply=new Function("o","a","o.$=this;var c='o.$(';var i;for(i=0;i<a.length;i++){if(i>0)c+=',';c+='a['+i+']';}c+=')';var v=eval(c);o.$=(function(){})();return v;");
if (typeof(Function.prototype.call)!="function")Function.prototype.call=new Function("o","o.$=this;var c='o.$(';var i;for(i=1;i<arguments.length;i++){if(i>1)c+=',';c+='arguments['+i+']';}c+=')';var v=eval(c);o.$=(function(){})();return v;");

Foundation=function(name,container)
{
   if (arguments.length==3)
      arguments[2][name]=this;
   else
      (container ? container : Foundation.getGlobalObject())[name]=this;
   this.$name=name;
   this.$container=container ? container : null;
};
Foundation.prototype.constructor=Foundation;
Foundation.prototype.getTypePath=function()
{
   return (this.$container ? this.$container.getTypePath()+"." : "")+this.$name;
};
Foundation=new Foundation("Foundation",null,this);
Foundation.Namespace=Foundation.constructor;
Foundation.establishNamespace=function(namespace)
{
   var path=namespace.split(".");
   var name=path.pop();
   var container=path.length>0 ? Foundation["namespace"](path.join(".")) : null;
   var c=container ? container : Foundation.getGlobalObject();
   if (c[name])
      namespace=c[name];
   else
      namespace=new Foundation.Namespace(name,container);
   return namespace;
};
Foundation.namespace=function(namespace,propertyList)
{
   namespace=Foundation.establishNamespace(namespace);
   if (propertyList)
      Foundation["addToNamespace"](namespace,propertyList);
   return namespace;
};
Foundation.addToNamespace=function(namespace,propertyList)
{
   for (var i in propertyList)
      if (i!="prototype" && i!="constructor")
         namespace[i]=propertyList[i];
   return namespace;
};
Foundation.getGlobalObject=function(path) 
{ 
   if (arguments.length==0 || typeof(arguments[0])=="string")
   {
      var getGlobalObject=arguments.callee;
      return getGlobalObject(true,arguments.length>0 ? arguments[0] : null);
   }
   var o=this;
   if (arguments.length>1 && typeof(arguments[1])=="string" && arguments[1].length>0)
   {
      path=arguments[1].split('.');
      for (var i=0;i<path.length;i++)
         if (!(o=o[path[i]]))
            return null;
   }
   return o; 

};
Foundation.Class=function()
{
};
Foundation.Class.prototype.constructor=Foundation.Class;
Foundation.Class.prototype.dispose=function(){};
Foundation.Class.getTypePath=Foundation.getTypePath;
Foundation.Class.isInstanceOf=function(theClass)
{
   for (var c=this;c;c=c.$parentClass)
      if (c==theClass)
         return true;
      else
         if (c.$interfaces)
            for (var i=0;i<c.$interfaces.length;i++)
               if (c.$interfaces[i]==theClass)
                  return true;
   return false;
};
Foundation.Interface=function()
{
};
Foundation.Interface.prototype.constructor=Foundation.Interface;
Foundation.Interface.prototype.dispose=function(){};
Foundation.Interface.getTypePath=Foundation.getTypePath;
Foundation.establishNamespace("Foundation");
Foundation.$registry=new Array(null);
Foundation.createClass=function()
   {
      var container=null;
      var name="";
      var parentClassIndex=0;
      var parentClass=null;
      var interfaces=new Array();
      var virtualConstructor=null;
      var virtualProperties=null;
      var staticConstructor=null;
      var staticProperties=null;
      var isInterface=false;
      var argStartIndex=0;
      if (arguments.length>0 && typeof(arguments[0])=="string")
      {
         var path=arguments[0].split('.');
         name=path.pop();
         if (path.length>0)
            container=Foundation["namespace"](path.join("."));
         argStartIndex=1;
         parentClassIndex=1;
      }
      for (var constructorIndex=arguments.length-1;constructorIndex>=argStartIndex;constructorIndex--)
         if (typeof(arguments[constructorIndex])=="function")
         {
            virtualConstructor=arguments[constructorIndex];
            if (constructorIndex>parentClassIndex)
               parentClass=arguments[parentClassIndex];
            for (var i=parentClassIndex+1;i<constructorIndex;i++)
               interfaces.push(arguments[i]);
            break;
         }
      if (arguments.length>constructorIndex+1 && typeof(arguments[constructorIndex+1])=="object")
          virtualProperties=arguments[constructorIndex+1];
      if (arguments.length>constructorIndex+2 && typeof(arguments[constructorIndex+2])=="object")
          staticProperties=arguments[constructorIndex+2];
      if (arguments.length>0 && typeof(arguments[arguments.length-1])=="boolean" && arguments[arguments.length-1])
         isInterface=true;
      if (virtualProperties && virtualProperties.constructor && virtualProperties.constructor!=Object)
      {
         if (constructorIndex==argStartIndex)
            parentClass=virtualConstructor;
         else
            if (constructorIndex>argStartIndex)
               interfaces.push(virtualConstructor);
         virtualConstructor=virtualProperties.constructor;
      }
      if (staticProperties && staticProperties.constructor && staticProperties.constructor!=Object)
         staticConstructor=staticProperties.constructor;

      var newClass=Foundation.$createClass(container,name,parentClass,interfaces,virtualConstructor,virtualProperties,staticConstructor,staticProperties,isInterface);
      if (newClass.$name.length>0 &&
          newClass.$container==null)
      {
         var globalObject=Foundation.getGlobalObject();
         globalObject[newClass.$name]=newClass;
      }
      newClass.$constructor();
      return newClass;
   };
Foundation.createInterface=function()
   {
      arguments[arguments.length++]=true;
      return Foundation.createClass.apply(this,arguments);
   };
Foundation.$createClass=function(container,name,parentClass,interfaces,virtualConstructor,virtualProperties,staticConstructor,staticProperties,isInterface)
   {
      if (!virtualConstructor)
         virtualConstructor=new Function();
      if (!staticConstructor)
         staticConstructor=new Function();
      var interfaceDisposeList=new Array();
      for (var i=0;i<interfaces.length;i++)
         if (interfaces[i].prototype.dispose)
            interfaceDisposeList.push("("+interfaces[i].prototype.dispose.toString().replace(/^function\s+anonymous\s*\(/,"function(")+")");
      if (isInterface || !parentClass || !parentClass.isInstanceOf)
      {
         for (var i=interfaces.length;i>0;i--)
            interfaces[i]=interfaces[i-1];
         if (isInterface)
            interfaces[0]=Foundation.Interface;
         else
            interfaces[0]=Foundation.Class;
      }
      virtualConstructor=Foundation.transformVirtualConstructor(virtualConstructor,parentClass,interfaces,interfaceDisposeList);
      if (parentClass)
      {
         virtualConstructor.$parentClass=parentClass;
         if (!virtualConstructor.$parentClass.$childClasses)
            virtualConstructor.$parentClass.$childClasses=new Array();
         virtualConstructor.$parentClass.$childClasses.push(virtualConstructor);
         staticConstructor=Foundation.transformStaticConstructor(staticConstructor,parentClass);
      }
      else
         virtualConstructor.$parentClass=null;
      virtualConstructor.$constructor=staticConstructor;
      virtualConstructor.$interfaces=new Array();
      virtualConstructor.$childClasses=new Array();
      virtualConstructor.$container=container;
      virtualConstructor.$name=name;
      virtualConstructor.getTypePath=Foundation.getTypePath;
      for (var i=0;i<interfaces.length;i++)
         virtualConstructor.$interfaces.push(interfaces[i]);
      interfaces=virtualConstructor.$interfaces;
      for (var i=interfaces.length-1;i>=0;i--)
         Foundation.inheritInterface(virtualConstructor,interfaces[i]);
      if (parentClass)
         Foundation.inheritInterface(virtualConstructor,parentClass);
      for (var i=0;i<interfaces.length;i++)
         Foundation.inheritInterface(virtualConstructor,interfaces[i],true);
      if (virtualProperties)
         Foundation.addVirtualProperties(virtualConstructor,virtualProperties,interfaceDisposeList);
      if (staticProperties)
         Foundation.addStaticProperties(virtualConstructor,staticProperties);
      virtualConstructor.prototype.constructor=virtualConstructor;
      virtualConstructor.$constructor=staticConstructor;
      if (!virtualConstructor.prototype.dispose)
         virtualConstructor.prototype.dispose=this.createDefaultDisposeMethod(virtualConstructor);
      if (virtualConstructor.$container && virtualConstructor.$name && !virtualConstructor.$container[virtualConstructor.$name])
         virtualConstructor.$container[virtualConstructor.$name]=virtualConstructor;
      return virtualConstructor;
   };
Foundation.addVirtualProperties=function(theClass,properties,interfaceDisposeList)
   {
      var n=null;
      var noTransform=(!theClass.$parentClass && theClass.$interfaces.length==0);
      while (n=Foundation.getNextCustomPropertyName(properties,n))
      {
         var p=properties[n];
         theClass.prototype[n]=(noTransform || typeof(p)!="function" ? p : Foundation.transformMethodSupers(p,theClass.$parentClass ? theClass.$parentClass.prototype : null,interfaceDisposeList));
      }
   };
Foundation.addStaticProperties=function(theClass,properties)
   {
      var n=null;
      var noTransform=!theClass.$parentClass;
      while (n=Foundation.getNextCustomPropertyName(properties,n))
      {
         var p=properties[n];
         theClass[n]=(noTransform || typeof(p)!="function" ? p : Foundation.transformMethodSupers(p,theClass.$parentClass,null));
      }
   };
Foundation.inheritInterface=function(theClass,theInterface,precedenceOnly)
   {
      Foundation.copyProperties(theClass.prototype,theInterface.prototype,precedenceOnly);
      Foundation.copyProperties(theClass,theInterface,precedenceOnly);
   };
Foundation.copyProperties=function(object,properties,precedenceOnly)
   {
      var n=null;
      while (n=Foundation.getNextCustomPropertyName(properties,n,true,true))
         if (n!="dispose")
            if (n.length>11 && n.substr(0,11)=="precedence$")
               object[n.substr(11)]=properties[n];
            else
               if (!precedenceOnly)
                  object[n]=properties[n];
   };
Foundation.getFunctionParts=function(theFunction)
   {
      if (theFunction.toString().search(/function[^\(]*\(([^)]*)\)[^\{]*\{([\w\W]*)\}[^\}]*$/)<0)
         return null;
      return {parameters:RegExp.$1,body:RegExp.$2};
   };
Foundation.getNativeClassName=function(theClass)
   {
      if (theClass==Array) return "Array";
      if (theClass==String) return "String";
      if (theClass==Number) return "Number";
      if (theClass==Object) return "Object";
      if (theClass==Date) return "Date";
      if (theClass==Boolean) return "Boolean";
      if (theClass==Function) return "Function";
      return null;
   };
Foundation.transformStaticConstructor=function(staticConstructor,parentClass)
   {
      if (parentClass.$constructor)
      {
         var constructorParts=Foundation.getFunctionParts(staticConstructor);
         var parentParts=Foundation.getFunctionParts(parentClass.$constructor);
         var constructorCode="function("+constructorParts.parameters+"){";
         constructorCode+="(function("+parentParts.parameters+"){"+parentParts.body+"}).apply(this,arguments);";
         constructorCode+=constructorParts.body;
         constructorCode+="}";
         eval("staticConstructor="+constructorCode);
      }
      return staticConstructor;
   };
Foundation.transformVirtualConstructor=function(virtualConstructor,parentClass,interfaces,interfaceDisposeList)
   {
      var needIt=false;
      if (parentClass)
         needIt=true;
      else
         for (var i=0;i<interfaces.length;i++)
            if (interfaces[i])
            {
               needIt=true;
               break;
            }
      if (!needIt)
         return virtualConstructor;
      var constructorParts=Foundation.getFunctionParts(virtualConstructor);
      var nativeParentName=parentClass ? Foundation.getNativeClassName(parentClass) : null;
      var parentParts=parentClass ? Foundation.getFunctionParts(parentClass) : null;
      var constructorCode="function("+constructorParts.parameters+"){";
      if (parentClass && constructorParts.body.search(/^([\w\W]*[^\$\w])Super\s*\(([^\)]*)\)([\w\W]*)$/)==0)
      {
         var p1=RegExp.$1;
         var p2=RegExp.$2;
         var p3=RegExp.$3;
         constructorCode+=p1;
         if (nativeParentName)
            constructorCode+=nativeParentName+".call(this";
         else
            constructorCode+="(function("+parentParts.parameters+"){"+parentParts.body+"}).call(this";
         if (p2.trim().length>0)
            constructorCode+=","+p2;
         constructorCode+=")";
         for (var i=0;i<interfaces.length;i++)
            if (interfaces[i] &&
                interfaces[i]!=Foundation.Class &&
                interfaces[i]!=Foundation.Interface)
            {
               constructorCode+=";\n(";
               constructorCode+=interfaces[i];
               constructorCode+=").call(this)";
            }
         constructorCode+=p3;
      }
      else
      {
         if (parentClass && !nativeParentName)
            constructorCode+="(function("+parentParts.parameters+"){"+parentParts.body+"}).apply(this,arguments);";
         for (var i=0;i<interfaces.length;i++)
            if (interfaces[i] &&
                interfaces[i]!=Foundation.Class &&
                interfaces[i]!=Foundation.Interface)
            {
               constructorCode+="\n(";
               constructorCode+=interfaces[i];
               constructorCode+=").call(this);";
            }
         constructorCode+=constructorParts.body;
      }
      constructorCode+="}";
      if (parentClass)
      {
         var rootParent=parentClass;
         while (rootParent.$parentClass)
            rootParent=rootParent.$parentClass;
         var nativeRootParentName=Foundation.getNativeClassName(rootParent);
         if (nativeRootParentName)
            constructorCode=Foundation.wrapConstructorForNatives(constructorCode,nativeRootParentName);
      }
      try
      {
         eval("virtualConstructor="+constructorCode);
      }
      catch (e)
      {
         alert("error transforming constructor\n\n"+constructorCode);
         throw(e);
      }
      if (parentClass)
         virtualConstructor=Foundation.transformMethodSupers(virtualConstructor,parentClass.prototype,interfaceDisposeList);
      return virtualConstructor;
   };
Foundation.wrapConstructorForNatives=function(constructorCode,nativeName)
   {
      var newCode="";
      newCode+="function(){var $_=null;if(this.constructor==arguments.callee){";
      if (nativeName=="Function")
         newCode+="$_=Function.apply(null,arguments.length<1||typeof(arguments[0])==\"string\"?arguments:arguments[0]);";
      else if (nativeName=="Array")
         newCode+="$_=new Array;";
      else
         newCode+="$_="+nativeName+".call(null,arguments[0]);";
      newCode+="$_.constructor=arguments.callee;for(var i in arguments.callee.prototype)$_[i]=arguments.callee.prototype[i];}";
      if (constructorCode)
      {
         newCode+="(";
         newCode+=constructorCode;
         newCode+=").apply($_!=null?$_:this,arguments);";
      }
      newCode+="if($_!=null)return $_;}";
      return newCode;
   };
Foundation.transformMethodSupers=function(theFunction,parentObject,interfaceDisposeList)
   {
      var parts=Foundation.getFunctionParts(theFunction);
      var transformedCode=Foundation.transformSuperCode(parts.body,parentObject,interfaceDisposeList);
      if (transformedCode!=parts.body)
      {
         var functionCode="function("+parts.parameters+"){"+transformedCode+"}";
         try
         {
            eval("theFunction="+functionCode);
         }
         catch (e)
         {
            prompt("","Error transforming method:\n\n"+functionCode);
            throw(e);
         }
      }
      return theFunction;
   };
Foundation.transformSuperCode=function(code,parentObject,interfaceDisposeList)
   {
      var outCode="";
      var s;
      while ((s=code.search(/(^|[^\$\w]+)Super\s*\.\s*([\$\w]+)\s*\(([\w\W]*)$/))>=0)
      {
         outCode+=code.substr(0,s+RegExp.$1.length);
         var name=RegExp.$2;
         code=RegExp.$3;
         if (name=="dispose" && interfaceDisposeList)
            for (var i=interfaceDisposeList.length-1;i>=0;i--)
            {
               outCode+=interfaceDisposeList[i]+".call(this";
               if (i>0 || parentObject)
                  outCode+=");\n      ";
            }
         if (parentObject)
            if (typeof(parentObject)=="string")
               if (name=="dispose")
                  outCode+="if ("+parentObject+"."+name+") "+parentObject+"."+name+".call(this";
               else
                  outCode+=parentObject+"."+name+".call(this";
            else
            {
               var parentParts=Foundation.getFunctionParts(parentObject[name]);
               if (parentParts==null)
                  throw("Method "+name+" not implemented in parent class");
               outCode+="(function("+parentParts.parameters+"){"+parentParts.body+"}).call(this";
            }
         else
            if (name=="dispose")
            {
               if (!interfaceDisposeList || interfaceDisposeList.length==0)
                  outCode+="(function(){}).call(this";   
            }
            else
               throw("Not inheriting!");
         if (code.search(/^\s*\)/)<0)
            outCode+=",";
      }
      outCode+=code;
      return outCode;
   };
Foundation.createDefaultDisposeMethod=function(theClass)
   {
      var code="";
      code+="/* "+theClass.getTypePath()+" */\n";
      for (var i=theClass.$interfaces.length-1;i>=0;i--)
         if (theClass.$interfaces[i] &&
             theClass.$interfaces[i].prototype.dispose)
            code+="("+theClass.$interfaces[i].prototype.dispose.toString().replace(/^function\s+anonymous\s*\(/,"function(")+").apply(this,arguments);\n";
      if (theClass.$parentClass &&
          theClass.$parentClass.prototype.dispose)
         code+="("+theClass.$parentClass.prototype.dispose.toString().replace(/^function\s+anonymous\s*\(/,"function(")+").apply(this,arguments);\n";
      return new Function(code);
   };
Foundation.isNativeFunction=function(theFunction)
   {
      theFunction=theFunction.toString();
      var b=theFunction.indexOf("{");
      if (b>0)
         theFunction=theFunction.substr(b+1);
      b=theFunction.lastIndexOf("}");
      if (b>0)
         theFunction=theFunction.substr(0,b);
      theFunction=theFunction.trim().toLowerCase();
      return (theFunction=="[native code]" || theFunction=="(internal function)");

   };
Foundation.getNextCustomPropertyName=function(object,property,functionsOnly,noHidden)
   {
      if (!property) property=null;
      for (var i in object)
         if (i!="prototype" && i!="constructor" && i!="toString" && i!="valueOf" && (!functionsOnly || typeof(object[i])=="function") && (!noHidden || i.charAt(0)!='$'))
            if (property==null)
               return i;
            else
               if (i==property)
                  property=null;
      if (!Foundation.isNativeFunction(object.toString))
         if (property==null)
            return "toString";
         else
            if ("toString"==property)
               property=null;
      if (!Foundation.isNativeFunction(object.valueOf))
         if (property==null)
            return "valueOf";
         else
            if ("valueOf"==property)
               property=null;
      return null;
   };
Foundation.getXmlHttpRequest=function()
   {
      if (typeof(XMLHttpRequest)!="undefined")
         return new XMLHttpRequest();
      if (typeof(ActiveXObject)!="undefined")
         return new ActiveXObject("Microsoft.XMLHTTP");
      return null;
   };
Foundation.urlDomain=function(url)
   {
      if (url.search(/\:\/\/([^\/\:]+)\//)>0)
                     return RegExp.$1;
      return document.domain;
   };
Foundation.conformUrlToDocumentDomain=function(url)
   {
      if (!document.domain)
         return url;
      var urlDomain=Foundation.urlDomain(url);
      var docDomain=document.domain;
      if (urlDomain.toLowerCase()!=docDomain.toLowerCase() &&
          ("www."+urlDomain.toLowerCase()==docDomain.toLowerCase() ||
           urlDomain.toLowerCase()=="www."+docDomain.toLowerCase()))
         url=url.replace(urlDomain,docDomain);
      return url;
   };
Foundation.loadScriptDomainsMustMatch=(function()
   {
      if (typeof(document)!="undefined" && document.domain &&
          window.navigator.appVersion.search(/Safari\/(\d+)/i)>=0)
         return (parseFloat(RegExp.$1)<412.5);
      return false;
   })();
Foundation.loadScriptDomainMismatch=function(url)
   {
      if (Foundation.loadScriptDomainsMustMatch)
      {
         var domain=Foundation.urlDomain(url);
         var dir=domain.split('.')[0];
         return url.replace(domain,document.domain+'/'+dir);
      }
      throw("domain mismatch");
   };
Foundation.scriptsToExec=new Array();
Foundation.handleXmlHttpRequestOnreadystatechange=function(request,url,postData,catchFunction)
   {
      if (request && request.readyState==4)
         if (typeof(request.responseText)=="string" && request.responseText.length>0)
         {
            postData=(postData ? "'"+postData.cEncode()+"'" : "null");
            if(window.execScript)
               if (catchFunction)
               {
                  var i=Foundation.scriptsToExec.length;
                  Foundation.scriptsToExec[i]=request.responseText;
                  window.setTimeout("try{eval(Foundation.scriptsToExec["+i+"]);}catch(e){"+catchFunction+"('"+url.cEncode()+"',"+postData+",Foundation.scriptsToExec["+i+"],e);}Foundation.scriptsToExec["+i+"]=null;",1);
               }
               else
                  window.execScript(request.responseText);
            else
            {
               var i=Foundation.scriptsToExec.length;
               Foundation.scriptsToExec[i]=request.responseText;
               if (catchFunction)
               {
                  window.setTimeout("try{eval(Foundation.scriptsToExec["+i+"]);}catch(e){"+catchFunction+"('"+url.cEncode()+"',"+postData+",Foundation.scriptsToExec["+i+"],e);}Foundation.scriptsToExec["+i+"]=null;",1);
               }
               else
                  window.setTimeout("eval(Foundation.scriptsToExec["+i+"]);Foundation.scriptsToExec["+i+"]=null;",1);
            }
            return 1;
         }
         else
            return -1;
      return 0;
   };
Foundation.loadScript=function(url,postData,debug,catchFunction)
   {
      if (typeof(catchFunction)=="string")
         catchFunction="'"+catchFunction.cEncode()+"'";
      else
         catchFunction="null";
      if (arguments.length>4 && arguments[4])
      {
         url=Foundation.conformUrlToDocumentDomain(url);
         if (debug)
            window.open(url,"_blank");
         else
         {
            try
            {
               if (document.domain &&
                   Foundation.urlDomain(url).toLowerCase()!=document.domain.toLowerCase())
                  url=Foundation.loadScriptDomainMismatch(url);
               var callback=new Function("var r=Foundation.handleXmlHttpRequestOnreadystatechange(arguments.callee.request,arguments.callee.url,arguments.callee.postData,"+catchFunction+");if(r!=0)arguments.callee.request=null;if(r<0)throw('xmlhttprequestfailed');");
               callback.url=url;
               callback.request=Foundation.getXmlHttpRequest();
               callback.request.onreadystatechange=callback;
               if (typeof(postData)=="string")
               {
                  callback.postData=postData;
                  callback.request.open("POST",url,true);
                  callback.request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                  callback.request.send(postData);
               }
               else
               {
                  callback.postData=null;
                  callback.request.open("GET",url,true);
                  callback.request.send("");
               }
            }
            catch (e)
            {
               if (typeof(postData)=="string")
                  return false;
               var script=document.createElement("SCRIPT");
               script.src=url;
               document.body.appendChild(script);
            }
         }
         if (Foundation.onScriptStartLoad)
            Foundation.onScriptStartLoad();
      }
      else
         window.setTimeout("Foundation.loadScript(\""+url.cEncode()+"\","+(typeof(postData)=="string" ? "\""+postData.toString().cEncode()+"\"" : "null")+","+(debug ? "true" : "false")+","+catchFunction+",true);",1);
      return true;
   };
Foundation.findScriptSrc=function(searchKey)
   {
      if (typeof(searchKey)=="string")
      {
         var e=document.getElementById(searchKey);
         return (e && e.tagName=="SCRIPT" && e.src) ? e.src : null;
      }
      var scripts=document.scripts ? document.scripts : document.getElementsByTagName("script");
      for (var i=0;i<scripts.length;i++)
         if (scripts[i].src && scripts[i].src.search(searchKey)>=0)
            return scripts[i].src;
      return null;
   };
Foundation.stripFileNameFromPath=function(path)
   {
      path=path.replace(/\\/g,"/");
      var s=path.lastIndexOf("/");
      return s<0 ? "" : path.substr(0,s+1);
   };
Foundation.getScriptSearchKeys=function(theType)
   {
      var keys=new Array();
      var path;
      while (theType && theType.getTypePath)
      {
         keys.push(path=theType.getTypePath());
         keys.push(new RegExp("^([\\s\\S]*[\\\\\\/])?"+(path=path.regExpEncode())+"\\.js(\\?[\\s\\S]*)?$","i"));
         keys.push(new RegExp("^([\\s\\S]*[\\\\\\/])?"+path+"(\\.\\w+)?\\.js(\\?[\\s\\S]*)?$","i"));
         if (theType.$parentClass && theType.$parentClass.getTypePath)
            theType=theType.$parentClass;
         else
            theType=theType.$container;
      }
      return keys;
   };
Foundation.validateEmailFormat=function(emailAddress,allowMultiple,allowEmpty)
   {
      if (allowEmpty && emailAddress.search(/[^\s;,]/)<0)
         return true;
      if (allowMultiple)
         return (emailAddress.search(/((^|[\s;,])[\s;,]*[\w-'\+]+(\.[\w-'\+]+)*@((([a-zA-Z0-9]+(-+[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,})|((((25[0-5])|(2[0-4]\d)|(([01]?\d)?\d))\.){3}((25[0-5])|(2[0-4]\d)|(([01]?\d)?\d)))))+[\s;,]*$/)==0);
      return (emailAddress.search(/^\s*[\w-'\+]+(\.[\w-'\+]+)*@((([a-zA-Z0-9]+(-+[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,})|((((25[0-5])|(2[0-4]\d)|(([01]?\d)?\d))\.){3}((25[0-5])|(2[0-4]\d)|(([01]?\d)?\d))))\s*$/)==0);
   };
Foundation.caseInsensitiveSorter=function(a,b)
   {
      if (a==null)
         if (b==null)
            return 0;
         else
            return 1;
      else
         if (b==null)
            return -1;
      var la=a.toLowerCase();
      var lb=b.toLowerCase();
      if (la<lb) return -1;
      if (la>lb) return 1;
      return 0;
   };
Foundation.$uniqueIdIndex=0;
Foundation.generateUniqueId=function()
   {
      return "Foundation.generateUniqueId."+(Foundation.$uniqueIdIndex++);
   };
Foundation.KEY_CODE={RETURN:13,ESCAPE:27,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40};
Foundation.HALIGN={FAR_LEFT:"FAR_LEFT",LEFT:"LEFT",CENTER:"CENTER",RIGHT:"RIGHT",FAR_RIGHT:"FAR_RIGHT"};
Foundation.VALIGN={FAR_TOP:"FAR_TOP",TOP:"LEFT",MIDDLE:"MIDDLE",BOTTOM:"BOTTOM",FAR_BOTTOM:"FAR_BOTTOM"};
Foundation.CURSOR={DEFAULT:"default",
      CROSSHAIR:"crosshair",
      HAND:(typeof(document)=="object" && typeof(navigator)=="object" && document.all && navigator.userAgent.indexOf("Opera")<0) ? "hand" : "pointer"
   };
Foundation.getElementOffset=function(element)
   {
      var offset={x:0,y:0};
      for (var e=element;e;e=e.offsetParent)
      {
         offset.x+=e.offsetLeft;
         offset.y+=e.offsetTop;
      }
      for (var e=element;e;e=e.parentNode)
      {
         if (e.tagName=="BODY")
            break;
         offset.x-=e.scrollLeft;
         offset.y-=e.scrollTop;
      }
      return offset;
   };
Foundation.getElementRectangle=function(element)
   {
      var origin=this.getElementOffset(element);
      return {x:origin.x,y:origin.y,width:element.offsetWidth,height:element.offsetHeight};
   };
Foundation.isElementInView=function(element)
   {
      var rect=this.getElementRectangle(element);
      return (rect.x>=document.body.scrollLeft &&
              rect.y>=document.body.scrollTop &&
              rect.x+rect.width<=document.body.scrollLeft+document.body.offsetWidth &&
              rect.y+rect.height<=document.body.scrollTop+document.body.offsetHeight);
   };
Foundation.debug=function()
   {
      if (typeof(Foundation.console)!="undefined")
         Foundation.console.write.apply(Foundation.console,arguments);
   };
Foundation.StringBuilder=function(initialSize)
   {
      if(!initialSize)initialSize=1000;this.strings=new Array(initialSize+1);this.strings[0]="";
   };
Foundation.StringBuilder.$parentClass=null;
Foundation.StringBuilder.$constructor=function(){};
Foundation.StringBuilder.$interfaces=new Array();
Foundation.StringBuilder.$interfaces.push(Foundation.Class);
Foundation.StringBuilder.$name="StringBuilder";
Foundation.StringBuilder.$childClasses=new Array();
Foundation.StringBuilder.$container=Foundation;
Foundation.StringBuilder.prototype={
   constructor:Foundation.StringBuilder,   
   append:function(value){this.strings.push(value);return this;},   
   clear:function(){this.strings.length=1;return this;},   
   toString:function(){this.strings[1]=this.strings.join("");this.strings.length=2;return this.strings[1];},
   dispose:function()
   {
   }
};
Foundation.StringBuilder.getTypePath=Foundation.Class.getTypePath;
Foundation.StringBuilder.isInstanceOf=Foundation.Class.isInstanceOf;
Foundation.StringBuilder.$constructor();
   Foundation.Elemental=function()
   {
      Foundation.$registry[this.$Foundation_$registry_index=Foundation.$registry.length]=this;
   };
Foundation.Elemental.$parentClass=null;
Foundation.Elemental.$constructor=function(){};
Foundation.Elemental.$interfaces=new Array();
Foundation.Elemental.$interfaces.push(Foundation.Interface);
Foundation.Elemental.$name="Elemental";
Foundation.Elemental.$childClasses=new Array();
Foundation.Elemental.$container=Foundation;
Foundation.Elemental.prototype={
   constructor:Foundation.Elemental,   
   dispose:function()
      {
         if (this.$Foundation_$registry_index)
         {
            Foundation.$registry[this.$Foundation_$registry_index]=null;
            this.$Foundation_$registry_index=null;
         }
      },   
   event:function(code,delayed,disable)
      {
         code="Foundation.$registry["+this.$Foundation_$registry_index+"]"+(code ? "."+code : "");
         if (delayed)
         {
            if (arguments.length<3)
               disable=true;
            code=(disable ? "this.disabled=true;" : "")+"window.setTimeout('"+code.cEncode()+"',1);";
         }
         return code;
      },   
   elementId:function(id,index)
      {
         return "Foundation_Elemental_"+this.$Foundation_$registry_index+"_"+id+(typeof(index)=="number" ? "_"+index : "");
      },   
   getElement:function(id,index)
      {
         return document.getElementById(this.elementId(id,index));
      },   
   getElementValue:function(id,defaultValue)
      {
         var element=this.getElement(id);
         if (element)
            return element.value;
         return defaultValue;
      },   
   parseElementId:function(id)
      {
         var subId=this.elementId("");
         if (!id || id.length<subId.length || id.substr(0,subId.length)!=subId)
            return null;
         return id.substr(subId.length);
      },   
   attachEvent:function(element,eventName,code)
      {
         var f;
         if (typeof(element)=="string")
            element=document.getElementById(element);
         if (document.attachEvent)
            element.attachEvent(eventName,f=new Function("return "+this.event(code)));
         else
            if (eventName=="onkeypress" && Foundation.loadScriptDomainsMustMatch && !element.onkeypress)
               element.onkeypress=f=new Function("event","return "+this.event(code));
            else
               element.addEventListener(eventName.substr(2),f=new Function("event","return "+this.event(code)),false);
         return f;
      },   
   detachEvent:function(element,eventName,f)
      {
         if (typeof(element)=="string")
            element=document.getElementById(element);
         if (!element)
            return;
         if (document.detachEvent)
            element.detachEvent(eventName,f);
         else
            if (eventName=="onkeypress" && Foundation.loadScriptDomainsMustMatch && element.onkeypress)
               element.onkeypress=null;
            else
               element.removeEventListener(eventName.substr(2),f,false);
      }
};
Foundation.Elemental.getById=function(id,decendantsToo)
      {
         var o;
         for (var i=Foundation.$registry.length-1;i>0;i--)
            if ((o=Foundation.$registry[i]) &&
                o.id==id &&
                (decendantsToo ? o.constructor.isInstanceOf(this) : o.constructor==this))
               return o;
         return null;
      };
Foundation.Elemental.getFirst=function(decendantsToo)
      {
         var o;
         for (var i=1;i<Foundation.$registry.length;i++)
            if ((o=Foundation.$registry[i]) &&
                (decendantsToo ? o.constructor.isInstanceOf(this) : o.constructor==this))
               return o;
         return null;
      };
Foundation.Elemental.getNext=function(o,decendantsToo)
      {
         for (var i=o.$Foundation_$registry_index+1;i<Foundation.$registry.length;i++)
            if ((o=Foundation.$registry[i]) &&
                (decendantsToo ? o.constructor.isInstanceOf(this) : o.constructor==this))
               return o;
         return null;
      };
Foundation.Elemental.getTypePath=Foundation.Interface.getTypePath;
Foundation.Elemental.$constructor();
Foundation.Resourceful=function()
   {
   };
Foundation.Resourceful.$parentClass=null;
Foundation.Resourceful.$constructor=function(){};
Foundation.Resourceful.$interfaces=new Array();
Foundation.Resourceful.$interfaces.push(Foundation.Interface);
Foundation.Resourceful.$name="Resourceful";
Foundation.Resourceful.$childClasses=new Array();
Foundation.Resourceful.$container=Foundation;
Foundation.Resourceful.prototype={
   constructor:Foundation.Resourceful,   
   resource:function(index)
      {
         if (this.resourcePack && typeof(this.resourcePack[index])!="undefined")
            return Foundation.Resourceful.$transformResource(this.resourcePack[index],arguments);
         for (var c=this.constructor;c;c=c.$parentClass)
            if (c.resourcePack && typeof(c.resourcePack[index])!="undefined")
               return Foundation.Resourceful.$transformResource(c.resourcePack[index],arguments);
         return null;
      },
   dispose:function()
   {
   }
};
Foundation.Resourceful.resource=function(index)
      {
         for (var c=this;c;c=c.$parentClass)
            if (c.resourcePack && typeof(c.resourcePack[index])!="undefined")
               return Foundation.Resourceful.$transformResource(c.resourcePack[index],arguments);
         return null;
      };
Foundation.Resourceful.$transformResource=function(resource,args)
      {
         if (typeof(resource)=="string" && args.length>1)
         {
            resource=resource.split('%');
            var cookedResource=new Array(resource.length);
            var ia=2;
            var oddTest=0;
            while (true)
            {
               while (ia<args.length)
               {
                  var a=args[ia-1].toString();
                  for (var ir=1;ir<resource.length;ir++)
                  {
                     var r=resource[ir];
                     if (r!=null &&
                         r.length>=a.length &&
                         r.substr(0,a.length)==a)
                     {
                        cookedResource[ir]=args[ia]+r.substr(a.length);
                        resource[ir]=null;
                     }
                  }
                  ia+=2;
               }
               if (args.length%2==oddTest)
               {
                  args=args[args.length-1];
                  if (typeof(args.length)!="number")
                     break;
                  oddTest=ia=1;
               }
               else
                  break
            }
            for (var ir=0;ir<resource.length;ir++)
               if (resource[ir]!=null)
                  cookedResource[ir]=(ir>0 ? '%' : '')+resource[ir];
            resource=cookedResource.join("");
         }
         return resource;
      };
Foundation.Resourceful.getTypePath=Foundation.Interface.getTypePath;
Foundation.Resourceful.$constructor();
Foundation.Control=function(resourcePack)
      {
      Foundation.Elemental.call(this);
      Foundation.Resourceful.call(this);
         if (resourcePack)
            this.resourcePack=resourcePack;
         this.id=this.resource("id");
         this.boundElementIdList=new Array();
         this.setDisabled(this.resource("disabled") ? true : false);
         this.setValue(this.resource("value"));
         this.resourceFolder=null;
      };
Foundation.Control.$parentClass=null;
Foundation.Control.$constructor=function()
         {
            var rules=this.getCssRules();
            if (rules && document.readyState!="complete")
               document.write("<STYLE>"+rules+"</STYLE>");
            if (Foundation.Control && !Foundation.Control.$binding && this.resource("bindElementTagName"))
            {
               if (window.attachEvent)
                  window.attachEvent("onload",new Function("event","Foundation.Control.$bindClassesToElements(Foundation.Control,event)"));
               else
                  window.addEventListener("load",new Function("event","Foundation.Control.$bindClassesToElements(Foundation.Control,event)"),false);
               Foundation.Control.$binding=true;
            }
         };
Foundation.Control.$interfaces=new Array();
Foundation.Control.$interfaces.push(Foundation.Class);
Foundation.Control.$interfaces.push(Foundation.Elemental);
Foundation.Control.$interfaces.push(Foundation.Resourceful);
Foundation.Control.$name="Control";
Foundation.Control.$childClasses=new Array();
Foundation.Control.$container=Foundation;
Foundation.Control.prototype={
   constructor:Foundation.Control,   
   dispose:function()
         {
            this.unbindEvents();
            Foundation.Resourceful.prototype.dispose.call(this);
      Foundation.Elemental.prototype.dispose.call(this);
         },   
   bindToElement:function(element,postWrite,event)
         {
            if (typeof(element)=="string")
               element=document.getElementById(element);
            var cssName=this.constructor.getCssName();
            element.setAttribute(cssName+"_id",this.id==null ? "" : this.id.toString(),1);
            if (element.className.indexOf(cssName)<0)
               element.className+=" "+cssName;
            this.boundElementIdList.push(element.id);
            return this;
         },   
   bindEvents:function(element)
         {
            var elementId;
            if (typeof(element)=="string")
               element=document.getElementById(elementId=element);
            else
               elementId=element.id;
            if (!this.eventBindings)
               this.eventBindings=new Object();
            if (!this.eventBindings[elementId])
               this.eventBindings[elementId]=new Object();
            var args=arguments;
            var index=1;
            while (index<args.length)
               if (index==args.length-1)
               {
                  args=args[index];
                  index=1;
               }
               else
               {
                  var name=args[index];
                  var code=args[index+1];
                  if (this.eventBindings[elementId][name])
                     this.detachEvent(element,name,this.eventBindings[elementId][name]);
                  this.eventBindings[elementId][name]=this.attachEvent(element,name,code);
                  index+=2;
               }
         },   
   unbindFromElement:function(element)
         {
            if (typeof(element)=="string")
               element=document.getElementById(element);
            this.unbindEvents(element);
            for (var i=0;i<this.boundElementIdList.length;i++)
               if (element.id==this.boundElementIdList[i])
               {
                  for (i++;i<this.boundElementIdList.length;i++)
                     this.boundElementIdList[i-1]=this.boundElementIdList[i];
                  this.boundElementIdList.length--;
                  break;
               }
            return this;
         },   
   unbindEvents:function(element,eventName)
         {
            var elementId=null;
            if (element)
               if (typeof(element)=="string")
                  element=document.getElementById(elementId=element);
               else
                  elementId=element.id;
            if (this.eventBindings)
               for (var i in this.eventBindings)
                  if (!elementId || i==elementId)
                  {
                     var eb=this.eventBindings[i];
                     if (eb)
                        for (var j in eb)
                           if ((!eventName || j==eventName) &&
                               eb[j])
                           {
                              this.detachEvent(i,j,eb[j]);
                              eb[j]=null;
                           }
                  }
         },   
   getScriptSearchKeys:function()
         {
            return Foundation.getScriptSearchKeys(this.constructor);
         },   
   getResourceFolder:function()
         {
            if (this.resourceFolder==null &&
                !(this.resourceFolder=this.resource("resourceFolder")))
            {
               this.resourceFolder="";
               var scriptSearch=this.getScriptSearchKeys();
               var src;
               if (scriptSearch)
                  for (var i=0;i<scriptSearch.length;i++)
                     if (src=Foundation.findScriptSrc(scriptSearch[i]))
                     {
                        this.resourceFolder=Foundation.stripFileNameFromPath(src);
                        break;
                     }
            }
            return this.resourceFolder;
         },   
   getResourcePath:function(resourceKey)
         {
            return this.getResourceFolder()+this.resource(resourceKey);
         },   
   setValue:function(value,force)
         {
            if (force || this.compareValues(this.value,value)!=0)
            {
               var oldValue=this.value;
               this.value=value;
               if (typeof(oldValue)!="undefined")
                  this.onValueChanged(this.value,oldValue);
            }
         },   
   compareValues:function(value1,value2)
         {
            if (typeof(value1)=="undefined" ||
                typeof(value2)=="undefined")
               return 1;
            if (value1==null)
               if (value2==null)
                  return 0;
               else
                  return 1;
            else
               if (value2==null)
                  return -1;
            value1=value1.toString();
            value2=value2.toString();
            if (value1<value2)
               return -1;
            if (value1>value2)
               return 1;
            return 0;
         },   
   onValueChanged:function(newValue,oldValue)
         {
         },   
   getValue:function()
         {
            return this.value;
         },   
   parseValue:function(value)
         {
            return value;
         },   
   getDisabled:function()
         {
            return this.disabled;
         },   
   setDisabled:function(disabled)
         {
            if (disabled!=this.disabled)
            {
               var oldValue=this.disabled;
               this.disabled=disabled;
               if (typeof(oldValue)!="undefined")
                  this.onDisabledChanged(this.disabled,oldValue);
            }
         },   
   onDisabledChanged:function(newValue,oldValue)
         {
         },   
   getInnerHtml:function(preBind)
         {
            return "";
         },   
   getHtml:function()
         {
            if (!this.id)
               this.id=Foundation.generateUniqueId();
            return this.resource("html"
                                 ,'tagName',this.resource("bindElementTagName")
                                 ,'className',this.constructor.getCssName()
                                 ,'id',this.id
                                 ,'innerHtml',this.getInnerHtml(true)
                                 ,arguments
                                );
         },
   resource:Foundation.Resourceful.prototype.resource,
   event:Foundation.Elemental.prototype.event,
   elementId:Foundation.Elemental.prototype.elementId,
   getElement:Foundation.Elemental.prototype.getElement,
   getElementValue:Foundation.Elemental.prototype.getElementValue,
   parseElementId:Foundation.Elemental.prototype.parseElementId,
   attachEvent:Foundation.Elemental.prototype.attachEvent,
   detachEvent:Foundation.Elemental.prototype.detachEvent
};
Foundation.Control.resourcePack={
            html:"<%tagName class=\"%className\" %className_id=\"%id\">%innerHtml</%tagName>"
         };
Foundation.Control.$forcedResourcePack=function(resourcePack,elementId)
         {
            if (!resourcePack)
               resourcePack={id:elementId ? elementId : Foundation.generateUniqueId()};
            else
               if (!resourcePack.id)
                  resourcePack.id=elementId ? elementId : Foundation.generateUniqueId();
            return resourcePack; 
         };
Foundation.Control.resourcePackFromElement=function(element)
         {
            var resourcePack=element.getAttribute(this.getCssName()+"_resourcePack");
            if (!resourcePack)
               resourcePack=element.getAttribute("resourcePack");
            if (resourcePack)
            {
               try
               {
                  if (resourcePack.charAt(0)!="{")
                     resourcePack="{"+resourcePack+"}";
                  eval("resourcePack="+resourcePack);
               }
               catch(e)
               {
                  resourcePack=null;
               }
            }
            return Foundation.Control.$forcedResourcePack(resourcePack,element.id);
         };
Foundation.Control.$compileInternalBindIds=function(list,args)
         {
            if (typeof(args.length)=="number")
               for (var i=0;i<args.length;i++)
                  if (typeof(args[i])=="string")
                     list.push(args[i]);
                  else
                     this.$compileInternalBindIds(list,args[i]);
         };
Foundation.Control.bindToElement=function(element,resourcePack,event)
         {
            if (typeof(element)=="string")
               element=document.getElementById(element);
            if (!element.id)
               element.id=Foundation.generateUniqueId();
            var o=null;
            var id=element.getAttribute(this.getCssName()+"_id",1);
            var postWrite=false;
            if (id)
            {
               o=this.getById(id);
               postWrite=true;
            }
            if (!o)
            {
               if (!resourcePack)
                  resourcePack=this.resourcePackFromElement(element);
               o=this.getById(resourcePack.id);
               if (!o)
                  o=new this(resourcePack);
            }
            o.bindToElement(element,postWrite,event);
            return o;
         };
Foundation.Control.getCssName=function()
         {
            return this.getTypePath().replace(/\./g,"_");
         };
Foundation.Control.bindToElements=function(event)
         {
            var num=0;
            var tagName=this.resource("bindElementTagName");
            if (tagName)
            {
               var cssName=this.getCssName();
               var classPathExp=new RegExp("(^|\\s)"+cssName.regExpEncode()+"(\\s|$)","i");
               var inputs=document.getElementsByTagName(tagName);
               for (var i=0;i<inputs.length;i++)
                  if (typeof(inputs[i].className)=="string" &&
                      inputs[i].className.search(classPathExp)>=0)
                  {
                     this.bindToElement(inputs[i],null,event);
                     num++;
                  }
            }
            return num;
         };
Foundation.Control.getCssRules=function()
         {
            return this.resource("cssRules","className",this.getCssName(),arguments);
         };
Foundation.Control.$bindClassesToElements=function(controlClass,event)
         {
            controlClass.bindToElements(event);
            for (var i=0;i<controlClass.$childClasses.length;i++)
               Foundation.Control.$bindClassesToElements(controlClass.$childClasses[i],event);
         };
Foundation.Control.writeToPage=function(resourcePack)
         {
            var control=new this(Foundation.Control.$forcedResourcePack(resourcePack));
            document.write(control.getHtml());
            return control;
         };
Foundation.Control.getTypePath=Foundation.Class.getTypePath;
Foundation.Control.resource=Foundation.Resourceful.resource;
Foundation.Control.getById=Foundation.Elemental.getById;
Foundation.Control.getFirst=Foundation.Elemental.getFirst;
Foundation.Control.getNext=Foundation.Elemental.getNext;
Foundation.Control.isInstanceOf=Foundation.Class.isInstanceOf;
Foundation.Control.$constructor();
   Foundation.FloatControl=function(resourcePack)
   {
   Foundation.Control.apply(this,arguments);
      this.floatCount=0;
      this.floatWaitingActivation=false;
      this.defaultValue=null;
      this.activeBoundElementId=null;
      this.lastFloatChildId=null;
      this.$firefoxIsAPieceOfCrap=new Array(false,false,false);
      this.ignoreUps=false;
   };
Foundation.FloatControl.$parentClass=Foundation.Control;
if (!Foundation.Control.$childClasses) Foundation.Control.$childClasses=new Array();
Foundation.Control.$childClasses.push(Foundation.FloatControl);
Foundation.FloatControl.$constructor=Foundation.Control.$constructor ? Foundation.Control.$constructor : function(){};
Foundation.FloatControl.$interfaces=new Array();
Foundation.FloatControl.$name="FloatControl";
Foundation.FloatControl.$childClasses=new Array();
Foundation.FloatControl.$container=Foundation;
Foundation.FloatControl.prototype={
   constructor:Foundation.FloatControl,   
   bindToElement:function(element,postWrite,event)
      {
         this.bindFloatEvents(element);
         return Foundation.Control.prototype.bindToElement.call(this,element,postWrite,event);
      },   
   getActiveFloatBoundElement:function()
      {
         return this.activeBoundElementId ? document.getElementById(this.activeBoundElementId) : null;
      },   
   bindFloatEvents:function(element)
      {
         this.bindEvents(element
                        ,"onfocus","floatBoundOnFocus(event)"
                        ,"onblur","floatBoundOnBlur(event)"
                        ,"onkeydown","floatBoundOnKeyDown(event)"
                        ,arguments
                        );
      },   
   onDisabledChanged:function(newValue,oldValue)
      {
         if (!newValue)
            this.hideFloat();
         else
            if (this.floatCount>0)
               this.showFloat();
         Foundation.Control.prototype.onDisabledChanged.call(this,newValue,oldValue);
      },   
   floatBoundOnFocus:function(event)
      {
         var element=(event.srcElement || event.target);
         var floatShowing=false;
         if (this.isFloatShown())
            if (this.activeBoundElementId==element.id)
               floatShowing=true;
            else
               this.hideFloat(element);
         this.resetFloatCount();
         if (floatShowing)
            this.maybeShowFloatActivation();
         else
            this.showFloat(element);
         this.incrementFloatCount();
         this.ignoreUps=true;
         return true;
      },   
   floatBoundOnBlur:function(event)
      {
         this.decrementFloatCount();
         return true;
      },   
   floatBoundOnKeyDown:function(event)
      {
         if (this.isFloatShown())
            if (this.floatWaitingActivation)
            {
               if (event.keyCode==40)
                  this.setFloatActivationSelected(true);
               else if (event.keyCode==38)
                  this.setFloatActivationSelected(false);
               else if (event.keyCode==13 &&
                        this.getFloatActivationSelected())
               {
                  event.cancelBubble=true;
                  event.returnValue=false;
                  if (event.stopPropagation)
                     event.stopPropagation();
                  if (event.preventDefault)
                     event.preventDefault();
                  this.activateFloat(event.srcElement || event.target);
                  return false;
               }
            }
            else
               if (event.keyCode==27)
               {
                  event.cancelBubble=true;
                  event.returnValue=false;
                  if (event.stopPropagation)
                     event.stopPropagation();
                  if (event.preventDefault)
                     event.preventDefault();
                  this.abortFloat(event.srcElement || event.target);
                  return false;
               }
         return true;
      },   
   getFloatActivationSelected:function()
      {
         return this.floatActivationSelected;
      },   
   setFloatActivationSelected:function(value)
      {
         if (value!=this.floatActivationSelected)
         {
            var oldValue=this.floatActivationSelected;
            this.floatActivationSelectedOnChange(this.floatActivationSelected=value,oldValue);
         }
      },   
   floatActivationSelectedOnChange:function(newValue,oldValue)
      {
         var floatElement;
         this.floatActivationActivity();
         if (this.floatWaitingActivation &&
             (floatElement=this.getFloatElement()))
            floatElement.style.cssText=this.combineFloatStyle(floatElement,this.resource(newValue ? "activateFloatSelectedStyle" : "activateFloatUnselectedStyle"));
      },   
   activateFloat:function(element)
      {
         if (this.floatActivationHandle)
            this.floatActivationHandle=window.clearTimeout(this.floatActivationHandle);
         if (this.floatWaitingActivation)
         {
            this.floatWaitingActivation=false;
            this.positionFloat(element);
            this.setFloatHtml(this.getFloatHtml(),this.resource("floatStyle"));
            this.focusToFloat(element);
         }
      },   
   focusToFloat:function(boundElement)
      {
      },   
   getFloatHtml:function()
      {
         return this.resource("floatHtml",arguments);
      },   
   getActivateFloatHtml:function()
      {
         return this.resource("activateFloatHtml",arguments);
      },   
   getFloatElement:function()
      {
         return this.getElement("float");
      },   
   combineFloatStyle:function(floatElement,style)
      {
         return "position:absolute;top:"+floatElement.style.top+";left:"+floatElement.style.left+";display:"+floatElement.style.display+";"+style;
      },   
   setFloatFocusEvents:function(childNodes,attach)
      {
         for (var i=0;i<childNodes.length;i++)
         {
            var e=childNodes[i];
            if (e.id)
               if (attach)
                  this.bindEvents(e
                                  ,"onfocus","floatChildOnFocus(event)"
                                  ,"onblur","floatChildOnBlur(event)"
                                 );
               else
                  this.unbindEvents(e);
            this.setFloatFocusEvents(e.childNodes,attach);
         }
      },   
   floatChildOnFocus:function(event)
      {
         this.lastFloatChildId=(event.srcElement || event.target).id;
         this.incrementFloatCount(event);
      },   
   floatChildOnBlur:function(event)
      {
         this.decrementFloatCount(event);
      },   
   saveFloatData:function()
      {
      },   
   setFloatHtml:function(html,style,floatElement)
      {
         this.saveFloatData();
         if (!floatElement)
            floatElement=this.getFloatElement();
         if (!floatElement)
            return;
         if (style)
            floatElement.style.cssText=this.combineFloatStyle(floatElement,style);
         this.lastFloatChildId=null;
         this.setFloatFocusEvents(floatElement.childNodes,false);
         floatElement.innerHTML=html;
         this.setFloatFocusEvents(floatElement.childNodes,true);
      },   
   startFloatActivation:function()
      {
         floatActivationPeriod         
      },   
   floatActivationPeriodExpired:function()
      {
         this.floatActivationHandle=null;
         this.hideFloat();
      },   
   floatActivationActivity:function()
      {
         if (this.floatActivationHandle)
         {
            window.clearTimeout(this.floatActivationHandle);
            this.floatActivationHandle=window.setTimeout(this.event("floatActivationPeriodExpired()"),this.resource("floatActivationPeriod"));
         }
      },   
   maybeShowFloatActivation:function(floatElement)
      {
         var html=this.getActivateFloatHtml();
         if (html)
         {
            this.floatWaitingActivation=true;
            this.floatActivationSelected=false;
            this.setFloatHtml(html,this.resource("activateFloatUnselectedStyle"),floatElement);
            var period=this.resource("floatActivationPeriod");
            if (period>0)
               this.floatActivationHandle=window.setTimeout(this.event("floatActivationPeriodExpired()"),period);
            return true;
         }
         else
            this.floatWaitingActivation=false;
         return false;
      },   
   maybePopulateFloat:function(floatElement)
      {
         if (!this.maybeShowFloatActivation(floatElement) &&
             floatElement)
            this.setFloatHtml(this.getFloatHtml(),this.resource("floatStyle"),floatElement);
      },   
   createFloat:function(element)
      {
         var floatElement=document.createElement("DIV");
         floatElement.id=this.elementId("float");
         floatElement.style.position="absolute";
         floatElement.style.left=0;
         floatElement.style.top=0;
         floatElement.style.display="none";
         this.bindEvents(floatElement
                         ,"onfocus","floatOnFocus(event)"
                         ,"onblur","floatOnBlur(event)"
                         ,"onmousedown","floatOnMouseDown(event)"
                         ,"onmouseup","floatOnMouseUp(event)"
                         ,"ondblclick","floatOnDoubleClick(event)"
                         ,"onmouseover","floatOnMouseOver()"
                         ,"onmousemove","floatOnMouseMove()"
                         ,"onmouseout","floatOnMouseOut()"
                        );
         this.maybePopulateFloat(floatElement);
         document.body.appendChild(floatElement);
         if (!document.all)
            floatElement.style.MozUserSelect="none";
         return floatElement;
      },   
   getActivationFloatSize:function(element)
      {
         return {width:100,height:18};
      },   
   getFloatSize:function(element)
      {
         return {width:100,height:100};
      },   
   getFloatPosition:function(element)
      {
         var rect=element ? Foundation.getElementRectangle(element) : {x:0,y:0,width:0,height:0};
         var hAlign=this.resource("hAlign");
         var vAlign=this.resource("vAlign");
         var size;
         if (this.floatWaitingActivation)
            size=this.getActivationFloatSize(element);
         else
            size=this.getFloatSize(element);

         var left,top;
         if (hAlign=="FAR_LEFT")
            left=rect.x-size.width;
         else if (hAlign=="CENTER")
            left=Math.floor(rect.x+rect.width/2-size.width/2);
         else if (hAlign=="RIGHT")
            left=rect.x+rect.width-size.width;
         else if (hAlign=="FAR_RIGHT")
            left=rect.x+rect.width;
         else
            left=rect.x;

         if (vAlign=="FAR_TOP")
            top=rect.y+rect.height;
         else if (vAlign=="MIDDLE")
            top=Math.floor(rect.y+rect.height/2-size.height/2);
         else if (vAlign=="BOTTOM")
            top=rect.y+rect.height;
         else if (vAlign=="FAR_BOTTOM")
            top=rect.y+rect.height;
         else
            top=rect.y+rect.height;

         if (left<document.body.scrollLeft)
            left=document.body.scrollLeft;
         if (left+size.width>document.body.scrollLeft+document.body.clientWidth)
            left=document.body.scrollLeft+document.body.clientWidth-size.width;

         if (top<document.body.scrollTop)
            top=document.body.scrollTop;
         if (top+size.height>document.body.scrollTop+document.body.clientHeight)
            top=document.body.scrollTop+document.body.clientHeight-size.height;
         return {left:left,top:top};
      },   
   positionFloat:function(element)
      {
         var floatElement=this.getFloatElement();
         var position=this.getFloatPosition(element);
         floatElement.style.left=position.left;
         floatElement.style.top=position.top;
      },   
   isFloatShown:function()
      {
         var floatElement=this.getFloatElement();
         return floatElement && floatElement.style.display!="none";
      },   
   canShowFloat:function(element)
      {
         return !this.getDisabled();
      },   
   updateFloat:function(element)
      {
         this.synchFloat(element);
         this.setFloatHtml(this.getFloatHtml(),this.resource("floatStyle"));
         this.showFloat();
      },   
   showFloat:function(element)
      {
         if (element)
            this.activeBoundElementId=element.id;
         else
            element=this.getActiveFloatBoundElement();
         this.defaultValue=element.value;
         this.synchFloat(element);
         if (!this.canShowFloat(element))
         {
            this.hideFloat(element);
            return false;
         }
         var floatElement=this.getFloatElement();
         if (!floatElement)
            floatElement=this.createFloat(element);
         else
            this.maybePopulateFloat(floatElement);
         if (floatElement.style.display!="block")
         {
            this.positionFloat(element);
            floatElement.style.display="block";
         }
         this.focusToFloat(element);
         if (typeof(this.onShow)=="function")
            this.onShow(element);
         return true;
      },   
   synchFloat:function(element)
      {
         this.setValue(this.parseValue(element.value));
      },   
   setFloatBoundElementValue:function(element,value)
      {
         if (element && element.value!=value)
         {
            element.value=value;
            this.floatBoundElementOnChange(element);
         }
         return element;
      },   
   floatBoundElementOnChange:function(element)
      {
         if (element && element.onchange)
            element.onchange();
      },   
   abortFloat:function(element)
      {
         this.hideFloat(element,true);
         if (element)
         {
            if (this.defaultValue!=null)
               this.setFloatBoundElementValue(element,this.defaultValue);
            element.blur();
         }
         this.resetFloatCount();
      },   
   hideFloat:function(element,aborted)
      {
         if (this.floatHandle)
            this.floatHandle=window.clearTimeout(this.floatHandle);
         if (this.floatActivationHandle)
            this.floatActivationHandle=window.clearTimeout(this.floatActivationHandle);
         this.floatWaitingActivation=false;
         var floatElement=this.getFloatElement();
         if (floatElement)
            floatElement.style.display="none";
         if (typeof(this.onHide)=="function")
            this.onHide(element,aborted ? true : false);
      },   
   floatOnFocus:function(event)
      {
         this.incrementFloatCount(event);
      },   
   floatOnBlur:function(event)
      {
         this.decrementFloatCount(event);
      },   
   floatOnMouseDown:function(event)
      {
         this.ignoreUps=false;
         this.incrementFloatCount(event);
      },   
   floatOnMouseUp:function(event)
      {
         if (this.ignoreUps)
            this.ignoreUps=false;
         else
            this.decrementFloatCount(event);
         if (this.floatWaitingActivation)
            this.activateFloat(this.getActiveFloatBoundElement());
         else
            this.focusToDefaultElement(event);
      },   
   floatOnMouseOver:function(event)
      {
         this.setFloatActivationSelected(true);
      },   
   floatOnMouseMove:function(event)
      {
         this.floatActivationActivity();
      },   
   floatOnMouseOut:function(event)
      {
         this.setFloatActivationSelected(false);
      },   
   focusToDefaultElement:function(event)
      {
         var element;
         if ((this.lastFloatChildId &&
              (element=document.getElementById(this.lastFloatChildId))) ||
             (element=this.getActiveFloatBoundElement()))
            element.focus();
      },   
   synchActiveFloatBoundElement:function()
      {
         var value=this.getValue();
         if (value!=null)
            return this.setFloatBoundElementValue(this.getActiveFloatBoundElement(),value.toString());
      },   
   floatOnDoubleClick:function(event)
      {
         this.incrementFloatCount(event);
      },   
   incrementFloatCount:function(event)
      {
         if (event && event.which && event.type=="mousedown")
            if (this.$firefoxIsAPieceOfCrap[event.button])
               return;
            else
               this.$firefoxIsAPieceOfCrap[event.button]=true;
         if (event && event.type=="dblclick" && event.which)
            return;
         this.floatCount++;
         if (this.floatHandle)
            this.floatHandle=window.clearTimeout(this.floatHandle);
      },   
   decrementFloatCount:function(event)
      {
         if (event && event.type=="mouseup" && event.which)
            if (this.$firefoxIsAPieceOfCrap[event.button])
               this.$firefoxIsAPieceOfCrap[event.button]=false;
            else
               return;
         if (this.floatCount>0)
            this.floatCount--;
         if (this.floatCount==0 && !this.floatHandle)
            this.floatHandle=window.setTimeout(this.event("hideFloat()"),this.resource("floatHideDelay"));
      },   
   resetFloatCount:function()
      {
         this.floatCount=0;
      },
   dispose:function()
   {
      if (Foundation.Control.prototype.dispose) Foundation.Control.prototype.dispose.call(this);
   },
   resource:Foundation.Control.prototype.resource,
   event:Foundation.Control.prototype.event,
   elementId:Foundation.Control.prototype.elementId,
   getElement:Foundation.Control.prototype.getElement,
   getElementValue:Foundation.Control.prototype.getElementValue,
   parseElementId:Foundation.Control.prototype.parseElementId,
   attachEvent:Foundation.Control.prototype.attachEvent,
   detachEvent:Foundation.Control.prototype.detachEvent,
   bindEvents:Foundation.Control.prototype.bindEvents,
   unbindFromElement:Foundation.Control.prototype.unbindFromElement,
   unbindEvents:Foundation.Control.prototype.unbindEvents,
   getScriptSearchKeys:Foundation.Control.prototype.getScriptSearchKeys,
   getResourceFolder:Foundation.Control.prototype.getResourceFolder,
   getResourcePath:Foundation.Control.prototype.getResourcePath,
   setValue:Foundation.Control.prototype.setValue,
   compareValues:Foundation.Control.prototype.compareValues,
   onValueChanged:Foundation.Control.prototype.onValueChanged,
   getValue:Foundation.Control.prototype.getValue,
   parseValue:Foundation.Control.prototype.parseValue,
   getDisabled:Foundation.Control.prototype.getDisabled,
   setDisabled:Foundation.Control.prototype.setDisabled,
   getInnerHtml:Foundation.Control.prototype.getInnerHtml,
   getHtml:Foundation.Control.prototype.getHtml
};
Foundation.FloatControl.resourcePack={
         bindElementTagName:"INPUT",
         hAlign:"LEFT",
         vAlign:"FAR_BOTTOM",
         floatHideDelay:100,
         floatHtml:"",
         floatStyle:"border:1px solid #0000ff;background-color:#eeeeff;padding:5px",
         //activateFloatHtml:"Click here to activate whatever",
         activateFloatSelectedStyle:"border:1px solid #0000ff;background-color:#aaaaff",
         activateFloatUnselectedStyle:"border:1px solid #0000ff;background-color:#eeeeff",
         floatActivationPeriod:5000
      }
   ;
Foundation.FloatControl.getTypePath=Foundation.Control.getTypePath;
Foundation.FloatControl.resource=Foundation.Control.resource;
Foundation.FloatControl.getById=Foundation.Control.getById;
Foundation.FloatControl.getFirst=Foundation.Control.getFirst;
Foundation.FloatControl.getNext=Foundation.Control.getNext;
Foundation.FloatControl.isInstanceOf=Foundation.Control.isInstanceOf;
Foundation.FloatControl.resourcePackFromElement=Foundation.Control.resourcePackFromElement;
Foundation.FloatControl.bindToElement=Foundation.Control.bindToElement;
Foundation.FloatControl.getCssName=Foundation.Control.getCssName;
Foundation.FloatControl.bindToElements=Foundation.Control.bindToElements;
Foundation.FloatControl.getCssRules=Foundation.Control.getCssRules;
Foundation.FloatControl.writeToPage=Foundation.Control.writeToPage;
Foundation.FloatControl.$constructor();
Foundation.ClientLoader=function()
      {
      Foundation.Elemental.call(this);
      Foundation.Resourceful.call(this);
         this.debug=this.constructor.debug;
         this.parameterStore=new Object();
         this.scripts=null;
         this.timerHandle=0;
         this.testInterval=this.resource("testInterval");;
      };
Foundation.ClientLoader.$parentClass=null;
Foundation.ClientLoader.$constructor=function(){};
Foundation.ClientLoader.$interfaces=new Array();
Foundation.ClientLoader.$interfaces.push(Foundation.Class);
Foundation.ClientLoader.$interfaces.push(Foundation.Elemental);
Foundation.ClientLoader.$interfaces.push(Foundation.Resourceful);
Foundation.ClientLoader.$name="ClientLoader";
Foundation.ClientLoader.$childClasses=new Array();
Foundation.ClientLoader.$container=Foundation;
Foundation.ClientLoader.prototype={
   constructor:Foundation.ClientLoader,   
   requestScriptList:function(resourceKey,parameters)
         {
            var url=this.resource(resourceKey);
            url+=(url.indexOf('?')<0 ? "?" : "&")+(parameters ? parameters+"&" : "")+"callback="+this.event("receiveScriptList").urlEncode()+"&debug="+(this.debug?"true":"false")+"&nocache="+Date.parse(new Date());
            Foundation.loadScript(url,null,this.debug);
         },   
   receiveScriptList:function(scripts)
         {
            this.scripts=scripts;
            this.loadScriptList();
         },   
   abort:function()
         {
            var inProgress=this.timerHandle!=0;
            this.clearTestInterval();
            return inProgress;
         },   
   clearTestInterval:function()
         {
            if (this.timerHandle!=0)
            {
               window.clearInterval(this.timerHandle);
               this.timerHandle=0;
            }
         },   
   loadScriptList:function()
         {
            for (var i=0;i<this.scripts.length;i++)
            {
               if (eval(this.scripts[i].test))
                  if (this.scripts[i].execute)
                  {
                     eval(this.scripts[i].execute);
                     this.scripts[i].test="false";
                  }
                  else
                  {
                     if (!this.scripts[i].requested)
                     {
                        if (this.timerHandle==0)
                           this.timerHandle=window.setInterval(this.event("loadScriptList();"),this.testInterval);
                        this.scripts[i].requested=true;
                        Foundation.loadScript(this.scripts[i].src);
                     }
                     return;
                  }
            }
            this.clearTestInterval();
            window.setTimeout(this.event("readyToProcess()"),1);
         },   
   readyToProcess:function()
         {
         },
   dispose:function()
   {
      Foundation.Resourceful.prototype.dispose.call(this);
      Foundation.Elemental.prototype.dispose.call(this);
   },
   resource:Foundation.Resourceful.prototype.resource,
   event:Foundation.Elemental.prototype.event,
   elementId:Foundation.Elemental.prototype.elementId,
   getElement:Foundation.Elemental.prototype.getElement,
   getElementValue:Foundation.Elemental.prototype.getElementValue,
   parseElementId:Foundation.Elemental.prototype.parseElementId,
   attachEvent:Foundation.Elemental.prototype.attachEvent,
   detachEvent:Foundation.Elemental.prototype.detachEvent
};
Foundation.ClientLoader.resourcePack={
            testInterval:100
         }
      ;
Foundation.ClientLoader.getTypePath=Foundation.Class.getTypePath;
Foundation.ClientLoader.resource=Foundation.Resourceful.resource;
Foundation.ClientLoader.getById=Foundation.Elemental.getById;
Foundation.ClientLoader.getFirst=Foundation.Elemental.getFirst;
Foundation.ClientLoader.getNext=Foundation.Elemental.getNext;
Foundation.ClientLoader.isInstanceOf=Foundation.Class.isInstanceOf;
Foundation.ClientLoader.$constructor();

}
