﻿ 

    TempestNS.ButtonOnLoad = function()
    {
    
    //test cache
    
    
        if(this._ButtonLoaded)
        {
            return;
        }
        this._ButtonLoaded=true;

        /*
            The type of this._pointer is either a HTML element or an idref (string) for 
            an existing element with in the page 
        */
        if(typeof this._Pointer =="string")
        {
            /*  its a string so get the element with the same id*/
            this._canvas= document.getElementById(this._Pointer);
        }
        else
        { 
            /* its an HTML element- we hope - */        
            this._canvas= this._Pointer;
        }
        
        this.InitStyles();
        if(this._canvas!=null)
        {
            this._elementName=this._canvas.nodeName;
            /* set up the click handler and attach it*/
            var self = this;
            //this._onclickHandler = new Function("evt", this._ref +".Click(evt)");
            this._onclickHandler = function(evt){self.Click(evt)};
            TempestNS.Client.AddEventListener(this._canvas,"click",this._onclickHandler); 
            /* set up the mouseover handler and attach it*/
           // this._onmouseoverhandler = new Function("evt", this._ref +".Over(evt)");    
           this._onmouseoverhandler =function(evt){self.Over(evt);};
            TempestNS.Client.AddEventListener(this._canvas,"mouseover",this._onmouseoverhandler); 
            /* set up the mouseout handler and attach it*/
            //this._onmouseouthandler = new Function("evt", this._ref +".Out(evt)");    
            this._onmouseouthandler =function(evt){self.Out(evt);};

            TempestNS.Client.AddEventListener(this._canvas,"mouseout",this._onmouseouthandler); 
            /* set up the mousedown handler and attach it*/
            //this._onmousedownhandler = new Function("evt", this._ref +".Down(evt)");    
            this._onmousedownhandler = function(evt){self.Down(evt);};   
            TempestNS.Client.AddEventListener(this._canvas,"mousedown",this._onmousedownhandler); 
            /* set up the mouseup handler and attach it*/
            //this._onmouseuphandler = new Function("evt", this._ref +".Up(evt)"); 
            this._onmouseuphandler = function(evt){self.Up(evt);};   

            TempestNS.Client.AddEventListener(this._canvas,"mouseup",this._onmouseuphandler); 
            if(typeof this._Action== "string"){
                this.onClick= new Function( this._Action );
            }
            else  if(typeof this._Action =="function"){
                this.onClick = this._Action;
            }
        }   
    }
    /// <summary>
    /// Button OnUnload event handler
    /// </summary>

    TempestNS.ButtonOnUnLoad = function(){

            /*clean events */
            /*remove click listener*/
            TempestNS.Client.RemoveEventListener(this._canvas,"click",this._onclickHandler); 
            /*remove mouseover listener*/
            TempestNS.Client.RemoveEventListener(this._canvas,"mouseover",this._onmouseoverhandler); 
            /*remove mouseout listener*/
            TempestNS.Client.RemoveEventListener(this._canvas,"mouseout",this._onmouseouthandler); 
            /*remove mousedown listener*/
            TempestNS.Client.RemoveEventListener(this._canvas,"mousedown",this._onmousedownhandler); 
            /*remove mouseup listener*/
            TempestNS.Client.RemoveEventListener(this._canvas,"mouseup",this._onmouseuphandler); 
            this._ButtonLoaded=false;
    }    
    
    
/*    ["normal-class","hover-class","down-class","active-class","disabled-class"]
        [normal-class]  - only one state
        [normal-class, hover-class ]:  normal : (normal, active , disable)  hover: (down, hover)
        [normal-class, hover-class,down-class] normal :(normal, active , disable)  hover:hover,  down:down
        [normal-class, hover-class,down-class, active] normal :(normal,disable)  hover:hover,  down:down, active:active;
JSonized form
        {"Button_Style"{
        "@normal":"normal-class";"@hover": "hover-class";"@down":"down-class";"@active":"active-class";"@disabled":"disabled";"$Text:null";
        }}
        const =  "DERIVE";
        
        xml form 
            <Button_Style normal="normal-class" hover="hover-class" down= "down-class" active="active-class" disabled="disabled-class"/>
        
        
*/
   



    TempestNS.ButtonInitStyles = function(){
        if(this._canvas==null)return;
        if(this._Classes)
        {
            switch(this._Classes.constructor)
            {
                case (new Array()).constructor:
                    TempestNS.Button.initStyleFromArray(this,this._Classes)
                    break;
                case (new Object().constructor):
                    TempestNS.Button.initStyleFromJson(this,this._Classes)
                    break;
                case ("".constructor):
                    TempestNS.Button.initStyleFromString(this,this._Classes)
                    break;    
                default:
                    this._defaultClassName= this._canvas.className;
                    this._normalClassname=this._defaultClassName;
                    this._hoverClassname=this._defaultClassName+"-Hover";
                    this._downClassname=this._defaultClassName+"-Down";
                    this._activeClassname=this._defaultClassName+"-Active";
                    this._disabledClassname=this._defaultClassName+"-Disabled"; 
                    break;
            }
        }         
    }

    /// <summary>
    /// Button OnClick event handler
    /// </summary>

    TempestNS.ButtonClick=function(evt){
     if(this._disabled)return;
       try
        {
            this.onClick(evt);
            var ev = new TempestNS.Client.Event(evt);
            ev.StopPropogation(); 
        }
        catch(e)
        {
          TempestNS.Debug_Out(evt,this,"click");
       }
    }

    /// <summary>
    /// Button OnMouseOut event handler
    /// </summary>

    TempestNS.ButtonOut=function(evt){
        if(this._disabled)return;
        if(this._canvas)
        {
            if(!this._active)
            {
                this._canvas.className=this._defaultClassName;
            }
            else
            {
                   this._canvas.className= this._activeClassname;
            }    
        }
        try
        {
            if(this.onMouseOut != null)
            {
                if(typeof this.onMouseOut == "string")
                {
                    this.onMouseOut = new Function("evt",this.onMouseOut);
                }
                if(typeof this.onMouseOut=="function")
                {
                    this.onMouseOut(evt);
                }        
            }
        }
        catch(exception)
        {
        
        }
    }


    /// <summary>
    /// Button OnMouseDown event handler
    /// </summary>

  TempestNS.ButtonDown=function(evt){
        if(this._disabled)return;
        if(this._canvas){
            this._canvas.className= this._downClassname;
            try
            {
                if(this.onMouseDown != null)
                {
                    if(typeof this.onMouseDown == "string")
                    {
                        this.onMouseDown = new Function("evt",this.onMouseDown);
                    }
                    if(typeof this.onMouseDown=="function")
                    {
                        this.onMouseDown(evt);
                    }        
                }
            }
            catch(exception)
            {
            
            }
        }
    }


    /// <summary>
    /// Button OnMouseUp event handler
    /// </summary>

    TempestNS.ButtonUp=function(evt){
        if(this._disabled)return;
        if(this._canvas){
            if(!this._active)
            {
                this._canvas.className=this._defaultClassName;
            }
            else
            {
                   this._canvas.className= this._activeClassname;
            }    
            try
            {
                if(this.onMouseUp != null)
                {
                    if(typeof this.onMouseUp == "string")
                    {
                        this.onMouseUp = new Function("evt",this.onMouseUp);
                    }
                    if(typeof this.onMouseUp=="function")
                    {
                        this.onMouseUp(evt);
                    }        
                }
            }
            catch(exception)
            {
            
            }
        }
    }

    /// <summary>
    /// Button OnMouseOver event handler
    /// </summary>

    TempestNS.ButtonOver=function(evt){
        if(this._disabled)return;
        if(this._canvas){
            this._canvas.className= this._hoverClassname;
            try
            {
                if(this.onMouseOver != null)
                {
                    if(typeof this.onMouseOver == "string")
                    {
                        this.onMouseOver = new Function("evt",this.onMouseOver);
                    }
                    if(typeof this.onMouseOver=="function")
                    {
                        this.onMouseOver(evt);
                    }        
                }
            }
            catch(exception)
            {
            
            }
            
            
            
        }
    }

    /// <summary>
    /// Disable the Button
    /// </summary>


    TempestNS.ButtonDisable = function(){
        this._disabled= true;
        if(this._canvas){
            this._canvas.className= this._disabledClassname;
            try
            {
                if(this.onDisable != null)
                {
                    if(typeof this.onDisable == "string")
                    {
                        this.onDisable = new Function(this.onDisable);
                    }
                    if(typeof this.onDisable=="function")
                    {
                        this.onDisable();
                    }        
                }
            }
            catch(exception)
            {
            
            }
            
        }
    }

    /// <summary>
    /// Enable the Button
    /// </summary>

    TempestNS.ButtonEnable=function(){
        this._disabled= false;
        if(this._canvas){
            this._canvas.className=this._defaultClassName;
            try
            {
                if(this.onEnable != null)
                {
                    if(typeof this.onEnable == "string")
                    {
                        this.onEnable = new Function(this.onEnable);
                    }
                    if(typeof this.onEnable=="function")
                    {
                        this.onEnable();
                    }        
                }
            }
            catch(exception)
            {
            }
        }
    }

    /// <summary>
    /// Set the Button as Active
    /// </summary>

      TempestNS.ButtonSetActive= function()
      {
        this._active= true;
        if(this._canvas){
            this._canvas.className=this._activeClassName;;
        }    
      }
    /// <summary>
    /// Set the Button Inacative
    /// </summary>
      
TempestNS.ButtonSetNormal = function()
{
        this._active= false;
        if(this._canvas){
            this._canvas.className=this._defaultClassName;
        }    
}      
      
       
       TempestNS.ButtonSetInActive  =   function()
       {
        this._active= false;
        if(this._canvas){
            this._canvas.className=this._defaultClassName;
        }    
       }
      
      
     ///#endregion
     
     
     /*
  #region TempestNS.Event Interface

     Basic Button Object used to bind any html element to be actionable

        Button_Ptr:
            Is either 
                1. a pre-create html element
                2. a string reference to one.
        Action
            The script to execute when it is press         
        Parent
            The parent TempestNS.Registered_Container         
         
        StyleClasses  as an array


        ["normal-class","hover-class","down-class","active-class","disabled-class"]
        
        [normal-class]  - only one state
        [normal-class, hover-class ]:  normal : (normal, active , disable)  hover: (down, hover)
        [normal-class, hover-class,down-class] normal :(normal, active , disable)  hover:hover,  down:down
        [normal-class, hover-class,down-class, active] normal :(normal,disable)  hover:hover,  down:down, active:active;
        const =  "DERIVE";
        if(Derive) setect and assume classnames
    */
    
    

        TempestNS.Button =  function(Button_Ptr,Action,Parent,StyleClasses)
        {
            TempestNS.Registered_Component.call(this);
            this._Pointer = Button_Ptr;
            this._Action= Action;
            this._Classes = StyleClasses;

        /* 
            the canvas defines the element being bound
        */

        this._canvas= null;
        this.register("BUTTON",Parent);    
        this._defaultClassName = "";
        this._normalClassname="";
        this._hoverClassname="";
        this._downClassname="";
        this._activeClassname="";
        this._disabledClassname="";
        
        this._elementName="";


        this._disabled= false;
        this._active= false;
        this._ButtonLoaded=false;
/*
    these are events handlers specific to the 
    instance object so they arer not defined on the class 
*/
        this.onClick = function(){};    
        this.onMouseOver = function(){};
        this.onMouseOut = function(){};
        this.onMouseDown = function(){};
        this.onMouseUp = function(){};
        this.onDisable = function(){};
        this.onEnable= function(){};
    }


    TempestNS.Button.prototype             = new TempestNS.Registered_Component();
    TempestNS.Button.prototype.OnLoad      = TempestNS.ButtonOnLoad;
    TempestNS.Button.prototype.OnUnload    = TempestNS.ButtonOnUnLoad;    
    TempestNS.Button.prototype.InitStyles  = TempestNS.ButtonInitStyles;
    TempestNS.Button.prototype.Click       = TempestNS.ButtonClick;
    TempestNS.Button.prototype.Out         = TempestNS.ButtonOut;
    TempestNS.Button.prototype.Down        = TempestNS.ButtonDown;
    TempestNS.Button.prototype.Up          = TempestNS.ButtonUp;
    TempestNS.Button.prototype.Over        = TempestNS.ButtonOver;
    TempestNS.Button.prototype.Disable     = TempestNS.ButtonDisable;
    TempestNS.Button.prototype.Enable      = TempestNS.ButtonEnable;
    TempestNS.Button.prototype.SetActive   = TempestNS.ButtonSetActive;
    TempestNS.Button.prototype.SetNormal   = TempestNS.ButtonSetNormal;
    
    
    /*Static methods*/
    
    
     TempestNS.Button.initStyleFromArray= function(Button,Class_Array)
    {
        switch(Class_Array.length)            
        {
           case 1:
                Button._defaultClassName = Class_Array[0];
                Button_normalClassname=Class_Array[0];
                Button._hoverClassname=Class_Array[0];
                Button._downClassname=Class_Array[0];
                Button._activeClassname=Class_Array[0];
                Button._disabledClassname=Class_Array[0];
                break;
            case 2:
                Button._defaultClassName = Class_Array[0];
                Button._normalClassname=Class_Array[0];
                Button._hoverClassname=Class_Array[1];
                Button._downClassname=Class_Array[1];
                Button._activeClassname=Class_Array[0];
                Button._disabledClassname=Class_Array[0];
                break;
            case 3:
                Button._defaultClassName = Class_Array[0];
                Button._normalClassname=Class_Array[0];
                Button._hoverClassname=Class_Array[1];
                Button._downClassname=Class_Array[2];
                Button._activeClassname=Class_Array[0];
                Button._disabledClassname=Class_Array[0];
                break;
            case 4:
                Button._defaultClassName = Class_Array[0];
                Button._normalClassname=Class_Array[0];
                Button._hoverClassname=Class_Array[1];
                Button._downClassname=Class_Array[2];
                Button._activeClassname=Class_Array[3];
                Button._disabledClassname=Class_Array[0];
                break;
            case 5:
                Button._defaultClassName = Class_Array[0];
                Button._normalClassname=Class_Array[0];
                Button._hoverClassname=Class_Array[1];
                Button._downClassname=Class_Array[2];
                Button._activeClassname=Class_Array[3];
                Button._disabledClassname=Class_Array[4];
                break;
        }
    }
    
    
    TempestNS.Button.initStyleFromJson= function(Button,Style_JSON)
    {
    

        if(Style_JSON.ButtonStates["@normal"]){
        
            Button._defaultClassName=Style_JSON.ButtonStates["@normal"];
            Button._normalClassname=Button._defaultClassName;
        }
        if(Style_JSON.ButtonStates["@hover"]){
             Button._hoverClassname=Style_JSON.ButtonStates["@hover"];
        }        
        else
        {
             Button._hoverClassname=Button._defaultClassName;
        }
        if(Style_JSON.ButtonStates["@down"]){
            Button._downClassname=Style_JSON.ButtonStates["@down"];
        }
        else
        {
             Button._downClassname=Button._hoverClassname;
        }
        if(Style_JSON.ButtonStates["@active"]){
            Button._activeClassname=Style_JSON.ButtonStates["@active"];
        }
        else
        {
             Button._activeClassname=Button._defaultClassName;
        }

        if(Style_JSON.ButtonStates["@disabled"]){
            Button._disabledClassname=Style_JSON.ButtonStates["@disabled"];
        }
        else
        {
             Button._disabledClassname=Button._defaultClassName;
        }
   }
   
   
    TempestNS.Button.initStyleFromString = function(Button, className){
        Button._defaultClassName = className;
        Button_normalClassname=className;
        Button._hoverClassname=className;
        Button._downClassname=className;
        Button._activeClassname=className;
        Button._disabledClassname=className;
    }


   
 



/**
 <summary>
 
 </summary>
**/
TempestNS.Widget.ArgsBuilder = function(argsObj)
{
	var args = "";
	for(var i = 0; i < argsObj.length; i++)
	{
		var val = new String(argsObj[i].value);
		val = val.replace(/\%3[Bb]/g,'%20');
		val = val.replace(/\%27/g,'%20');
		val = val.replace(/\'/g,'%20');
		args += argsObj[i].name +":"+ val +";";
	}
	return args;
}


/**
 <summary>
 
 </summary>
**/
TempestNS.Widget.ArgsSplitter = function(args)
{
	
	var argsObj = new Array();
	var arg = args.split(";");
	for(var i = 0; i < arg.length; i++)
	{
		if(arg[i] != "")
		{
			var a = arg[i].split(":");
			argsObj[i] = {"name":a[0], "value":a[1]};
		}
	}
	return argsObj;
}



/**
 <summary>
 
 </summary>
**/
TempestNS.Widget.ArgsUpdater = function(argsObj, changes)
{
	for(var i = 0; i < changes.length; i++)
	{
		var notFound = true;
		for(var j = 0; j < argsObj.length; j++)
		{
			if(argsObj[j].name == changes[i].name)
			{
				argsObj[j].value = changes[i].value;
	   			notFound = false;
				break;
			}
		}
		if(notFound)
		{
			argsObj[argsObj.length] = {"name":changes[i].name, "value":changes[i].value};
		}
	}
	return argsObj;
}




 



if(!TempestNS.Components)
{
    TempestNS.Components = function(){};
}


/**
 <summary>
 </summary>
 <param name="elementId"></param>
 <param name="parent"></param>
 <param name="widgetId"></param>
 <param name="webtag"></param>
**/
TempestNS.Components.Talkback = function(elementId, parent, widgetId, webtag, contentId, contentURL, currentPage, folderId, messageException, messageEmptyComments, messageLoading, messageModerated, messageOk, messageSubmittingComments, messageTime, noResizeTOS, pages, subject, tid, charCounting, returnUrl, messageTosOk, editTsn)
{
  /* Register the Container */
  TempestNS.Registered_Container.call(this);
  /* Set data members that seem to be common to all child components */
  this._canvas = null;
  this._loaded = false;
  this._pointer = elementId;
  this._webtag = webtag;
  this._widgetParentTest = false;
  this._parent = parent;
  this._widgetId = widgetId;
  /* If I don't have a parent, assume it is a widget */
  if(this._parent == null && this._widgetId != '')
  {
    if(TempestNS.WIDGETMANAGER)
    {
      this._parent = TempestNS.WIDGETMANAGER.Widgets[this._widgetId];
      this._widgetParentTest = true;
    }
  }
  this.register("Talkback", this._parent);
  
  /* Set data members unique to Talkback */
  this._talkbackFields = {
      'contentId':contentId, 
    'contentUrl':contentURL, 
    'currentPage':currentPage,
    'folderId':folderId, 
    'messageException':messageException, 
    'messageEmptyComments':messageEmptyComments, 
    'messageLoading':messageLoading, 
    'messageModerated':messageModerated, 
    'messageOk':messageOk, 
    'messageSubmittingComments':messageSubmittingComments, 
    'messageTime':messageTime, 
    'noResizeTOS':noResizeTOS, 
    'pages':pages, 
    'subject':subject, 
    'tid':tid,
    'charCounting':charCounting,
    'returnUrl':returnUrl,
    'messageTosOk':messageTosOk,
    'editTsn':editTsn
  };
  
  /* create optional tooltip object */
  this._talkbackToolTipper = null;

  /* Needed to handle browser differences with JS and setting the class name */
  if(document.addEventListener)
  {
    this._classAttribute = "class";
  }
  else
  {
    this._classAttribute = "className";
  }
}


/**
 <summary>
  
 </summary>
 <param name=""></param>
**/  
TempestNS.Components.Talkback.AddURLParam = function(elmId, encode)
{
  var ctl = document.getElementById(this._pointer + "_" + elmId);
  if(ctl) 
  {
    if(encode)
    {
      return "&" + elmId + "=" + escape(ctl.value);
    }
    else
    {
      return "&" + elmId + "=" + ctl.value;
    }
  }
  else 
  {
    return "";
  }
}


/**
 <summary>
  
 </summary>
 <param name=""></param>
**/  
TempestNS.Components.Talkback.CharCounter = function(id, maxLen, message)
{
  var elm = document.getElementById(id);
  if(maxLen)
  {
    if(elm.value.length > maxLen)
    {
      elm.value = elm.value.slice(0, maxLen);
      if(message)
      {
        this.SystemMessage("alert", false, message);
      }
    }
    if(document.getElementById(id + "_CharCount_Remain"))
    {
      document.getElementById(id + "_CharCount_Remain").innerHTML = maxLen - elm.value.length;
    }
    if(document.getElementById(id + "_CharCount_Max"))
    {
      document.getElementById(id + "_CharCount_Max").innerHTML = maxLen;
    }
  }
  if(document.getElementById(id + "_CharCount_Current"))
  {
    document.getElementById(id + "_CharCount_Current").innerHTML = elm.value.length;
  }
}
  
  
/**
 <summary>
  Find all input tags.  Encode their values. Return big string to be added to call to ACPost.
  This is meant to catch extra stuff left my ratings or future DPs.  Looking at improving this mechanism.
 </summary>
 <param name=""></param>
**/  
TempestNS.Components.Talkback.GetURLParams = function()
{
  /* Start string */
  var encodedInputs = "";
  /* Get All inputs */
  var allInputs = this._canvas.getElementsByTagName("input");
  for(var i = 0; i < allInputs.length; i++)
  {
    if(allInputs.type == "hidden")
    {
      encodedInputs += "&"+ allInputs.name +"="+ escape(allInputs.value);
    }

  }
  /* Return endcoded string of values */
  return encodedInputs;
}


/**
 <summary>
  Handle returned objects
 </summary>
**/
TempestNS.Components.Talkback.HandleCommandResult = function(result)
{  
  if(result.CommandResultInfo["@succeeded"] == "true")
  {
    switch(result.CommandResultInfo["@commandName"])
    {
      case "cmdSendTos":
      {
        this.SystemMessage("go", true, this._talkbackFields.messageTosOk);
      }
      default:
      {
      
      }
    }
  }
  else
  {
    this.SystemMessage("alert", false, result.CommandResultInfo["@message"]);
  }
}


/**
 <summary>
  Handle returned object
 </summary>
**/
TempestNS.Components.Talkback.HandleResult = function(result)
{
  if(this.HandleResultXML(result) == 0)
  {
    this.HandleResultJSON(result);
  }
}


/**
 <summary>
 </summary>
 <param name="jargs"></param>
 <param name="self"></param>
**/
TempestNS.Components.Talkback.HandleResultJSON = function(jargs, self)
{
  try
  {
    /* Depending upon status, perform different actions */
    var self = this;
    switch(jargs.status)
    {
      case "exception":
      {
        if(this._widgetParentTest)
        {
          self.SystemMessage("error", false, self._talkbackFields.messageException);
        }
        else
        {
          /* Raise it to any parents listenting */
          this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':jargs.status});
        }
        break;
      }
      case "login":
      {
        /* Remove ampersand from url */
        var loginRedirect = jargs.loginUrl.replace(/amp;/g,'');
        /* If the client passes a returnUrl, append it to the login link */
        if(this._talkbackFields.returnUrl)
        {
          loginRedirect += "&returnUrl="+ escape(this._talkbackFields.returnUrl);
        }
        
        /* Raise it to any parents listenting */
        this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':jargs.status, 'loginUrl':loginRedirect});
        
        /* Find hidden login div */
        var loginDiv = document.getElementById(self._pointer + "_Message_Login");
        if(loginDiv)
        {
          /* Find the Login Yes and No Buttons and "bind" it to the appropriate method here */
          var anchors = loginDiv.getElementsByTagName("a");
          var length = anchors.length;
          var notFound = true;
          for(var i = 0; i < length; i++)   
          {
            /* Redirect user to login */
            if(anchors[i].className == "ptcLoginYesButton")
            {
              new TempestNS.Button(anchors[i], function(){ window.location.replace(loginRedirect); }, self, ["ptcLoginYesButton"]).OnLoad();
              notFound = false;
            }
            /* Hide User Message */
            if(anchors[i].className == "ptcLoginNoButton")
            {
              new TempestNS.Button(anchors[i], function(){ loginDiv.setAttribute(self._classAttribute, "ptcPostMessageOff"); }, self, ["ptcLoginYesButton"]).OnLoad();
              notFound = false;
            }
          }
          /* If no button is found, redirect user after the following message is displayed */
          if(notFound)
          {
            setTimeout(function(){ window.location.replace(loginRedirect); } , this._talkbackFields.messageTime);
          }
          /* Alert User */
          this.SystemMessage("remove", false, "");
          loginDiv.setAttribute(self._classAttribute, "ptcPostMessageBefore");
        }
        else
        {
          window.location.replace(loginRedirect);
        }
        break;
      }
      case "MessagePost: ok Rating: ok":
      {
        this.RaiseEvent("REVIEWS", {'type':'reviews', 'response':jargs.status});
        break;
      }
      case "moderated":
      {
        /* Raise it to any parents listenting */
        this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':jargs.status});
        
        this.SystemMessage("go", true, self._talkbackFields.messageModerated);
        break;
      }
      case "MessagePost: moderated Rating: ok":
      {
        this.RaiseEvent("REVIEWS", {'type':'reviews', 'response':jargs.status});
      }
      case "ok":
      {
        if(this._widgetParentTest)
        {
          self.SystemMessage("go", true, self._talkbackFields.messageOk);
        }
        else
        {
          /* Raise it to any parents listenting */
          this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':jargs.status, 'tid':this._talkbackFields.tid});
        }
        break;
      }
      default:
      {
        self.SystemMessage("remove", false, "");
      }
    }
    return 1;
  }
  catch(e)
  {
    return 0;
  }
}


/**
 <summary>
  Handle returned XML object
 </summary>
**/
TempestNS.Components.Talkback.HandleResultXML = function(result)
{  
  try
  {
    /* Set ref to this object */
    var self = this;
    /* Get the XML data that we need */
    try
    {
      /* See if the browser can read responseXML */
      if(result.responseXML.hasChildNodes())
      {
        var response = result.responseXML;
      }
    }
    catch(e)
    {
      /* Otherwise, place responseText into a div and refer to it below */
      var xmlDiv = document.createElement("div");
      xmlDiv.id = "ptcWidgetTalbackXMLResult";
      xmlDiv.style.height = "0px";
      xmlDiv.style.width = "0px";
      xmlDiv.style.visibility = "hidden";
      xmlDiv.innerHTML = result.responseText;
      this._canvas.appendChild(xmlDiv);
      var response = document.getElementById("ptcWidgetTalbackXMLResult");
    }
    /* Depending upon the response, show a message for resultTime seconds and perform the related action */
    var status = response.getElementsByTagName("status")[0].firstChild.nodeValue;
    switch(status)
    {
      case "exception":
      {
        /* Raise it to any parents listenting */
        this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':status});
        
        this.SystemMessage("error", false, self._talkbackFields.messageException +" Error Message: "+ response.getElementsByTagName("message")[0].firstChild.nodeValue);
        break;
      }
      case "login":
      {
        try
        {
          var loginUrl = response.getElementsByTagName("loginUrl")[0].firstChild.nodeValue;
        }
        catch(e)
        {
          var responseArray = response.innerHTML.split(">");
          var loginArray = responseArray[4].split("<");
          var loginUrlEncoded = loginArray[0];
          var loginUrl = loginUrlEncoded.replace(/\&amp;/g,"&");
        }
        /* If the client passes a returnUrl, append it to the login link */
        if(this._talkbackFields.returnUrl)
        {
          loginUrl += "&returnUrl="+ escape(this._talkbackFields.returnUrl);
        }
        /* Raise it to any parents listenting */
        this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':status, 'loginUrl':loginUrl});
        /* Find hidden login div */
        var loginDiv = document.getElementById(this._pointer + "_Message_Login");
        if(loginDiv)
        {
          /* Find the Login Yes and No Buttons and "bind" it to the appropriate method here */
          var anchors = loginDiv.getElementsByTagName("a");
          var length = anchors.length;
          for(var i = 0; i < length; i++)    
          {
            /* Redirect user to login */
            if(anchors[i].className == "ptcLoginYesButton")
            {
              new TempestNS.Button(anchors[i], function(){ window.location.replace(loginUrl); }, this, ["ptcLoginYesButton"]).OnLoad();
            }
            /* Hide User Message */
            if(anchors[i].className == "ptcLoginNoButton")
            {
              new TempestNS.Button(anchors[i], function(){ loginDiv.setAttribute(self._classAttribute, "ptcPostMessageOff"); }, this, ["ptcLoginYesButton"]).OnLoad();
            }
          }
          /* Kill last system message */
          this.SystemMessage("remove", false, "");
          /* Alert User */
          loginDiv.setAttribute(this._classAttribute, "ptcPostMessageBefore");
        }
        else
        {
          window.location.replace(loginUrl);
        }
        break;
      }
      case "MessagePost: ok Rating: ok":
      {
        this.RaiseEvent("REVIEWS", {'type':'reviews', 'value':'Okay'});
        break;
      }
      case "moderated":
      {
        /* Raise it to any parents listenting */
        this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':status});
        
        this.SystemMessage("go", true, self._talkbackFields.messageModerated);
        break;
      }
      case "ok":
      {
        /* Raise it to any parents listenting */
        this.RaiseEvent("TALKBACK", {'type':'talkbackpostresponse', 'status':status, 'tid':this._talkbackFields.tid});
        
        this.SystemMessage("go", true, self._talkbackFields.messageOk);
        break;
      }
      default:
      {
        self.SystemMessage("remove", false, "");
      }
    }
    /* Remove Old IFrame */
    if(this._iFrame)
    {
      var oldFrame = document.getElementById("ptcWidgetTalkbackSubmitIframe");
      this._canvas.removeChild(oldFrame);
      this._iFrame = null;
      this._postPrefix = null;
      this._postParams = null;
    }
    /* Testing */
    if(TempestNS.Server.dbg == '52')
    {
      var myResults = document.createElement('div');
      myResults.id = "ptcXMLResults";
      myResults.style.border = "2px solid #336699";
      myResults.style.width = "95%";
      myResults.innerHTML = "<p>Status: "+ result.status +"</p><p>Response: "+ result.responseText +"</p><p>Headers: "+ result.getAllResponseHeaders() +"</p>";
      this._canvas.appendChild(myResults);
    }
    return 1;
  }
  catch(e)
  {
    return 0;
  }
}


/**
 <summary>
 </summary>
**/
TempestNS.Components.Talkback.OnLoad = function()
{
  /* Load only once */
  if(this._loaded)
  {
    return;
  }
  this._loaded = true;
   
  /* Set the canvas */
  if(typeof this._pointer == "string")
  {
    this._canvas = document.getElementById(this._pointer);
  }
  else
  {      
    this._canvas = this._pointer;
  }
   
  /* If the canvas exist, add additional 'stuff' */
  if(this._canvas)
  {
    /* If this is apart of a widget */
    if(this._widgetId)
    {
      /* Find All Buttons and "bind" it to the appropriate method */
      var allButtons = this._canvas.getElementsByTagName("button");
      var allAnchors = this._canvas.getElementsByTagName("a");
      var allInputs = this._canvas.getElementsByTagName("input");
      this.SetWidgetButtons(allButtons);
      this.SetWidgetButtons(allAnchors);
      this.SetWidgetCounters();
      this.SetWidgetToolTips(allInputs);
    }
  }
  
  if(TempestNS.Server.dbg == '52')
  {
    alert(this._ref);
  }
   
  /* Load Children */
  this.LoadChildren();
}


/**
 <summary>
 </summary>
**/
TempestNS.Components.Talkback.OnUnload = function()
{
  var self = this;
  for(var i = 0; i < this.KeyUp.length; i++)
  {
    TempestNS.Client.RemoveEventListener(this.KeyUp[i].elem, "keyup", this.KeyUp[i].func, false);
  }
    this.UnloadChildren();
}


/**
 <summary>
 </summary>
**/
TempestNS.Components.Talkback.Pagination = function(page)
{
  if(this._widgetParentTest)
  {
    this._parent.Refresh({'args':TempestNS.Widget.ArgsBuilder(
      TempestNS.Widget.ArgsUpdater(
        TempestNS.Widget.ArgsSplitter(this._parent.args), [{"name":"page","value":page}])
      )});
    this.SystemMessage("alert", false, this._talkbackFields.messageLoading);
  }
  this.RaiseEvent("TALKBACK", {'type':'paging', 'page':page, 'widget':TempestNS.WIDGETMANAGER.Widgets[this._widgetId],'_ref':this._ref});
}


/**
 <summary>
 </summary>
 <param name="buttons"></param>
**/
TempestNS.Components.Talkback.SetWidgetButtons = function(anchors)
{
  var widget = TempestNS.WIDGETMANAGER.Widgets[this._widgetId];
  /* Create a Base URL used by most of the buttons below */
  var app =  widget.app;
  var baseNavURL = "http://"+ TempestNS.Server.domain;
  baseNavURL += TempestNS.Server.Apps[app];
  baseNavURL += "?webtag="+ this._webtag;
  if(widget.config)
  {
    baseNavURL += "&config="+ widget.config
  }
  if(widget._includeCSS == "false")
  {
    baseNavURL += "&includeCSS=false";
  }
  if(TempestNS.Server.dbg != '')
  {
    baseNavURL += "&dbg="+TempestNS.Server.dbg;
  }
  
  var self = this;
  /* Loop through the collection of tags to find buttons to bind */
  for(var i = 0; i < anchors.length; i++)  
  {
    var currentPage = 1;
    if(this._talkbackFields.currentPage != '')
    {
      currentPage = this._talkbackFields.currentPage;
    }
    /* Bind "Prev" button */
    if(anchors[i].className == "ptcWidgetTalkbackNavPrev")
    {
      new TempestNS.Button(anchors[i], function(evt){               
        currentPage--;
        self.Pagination(currentPage);
        TempestNS.Client.ScrollToId(self._pointer+"_Bottom");
      }, this, ["ptcWidgetTalkbackNavPrev"]);
    }
    /* Bind "Next" button */
    if(anchors[i].className == "ptcWidgetTalkbackNavNext")
    {
      new TempestNS.Button(anchors[i], function(evt){
        currentPage++;
        self.Pagination(currentPage);
        TempestNS.Client.ScrollToId(self._pointer+"_Top");  
      }, this, ["ptcWidgetTalkbackNavNext"]);
    }
    /* Bind/Remove pagination buttons */
    if(anchors[i].className == "ptcWidgetTalkbackNavPage")
    {
      new TempestNS.Button(anchors[i], function(evt){ 
          var t = TempestNS.Client.GetMouseTarget(evt);
          var info = t.id.split("_");
          self.Pagination(info[info.length - 1]);
        }, this, ["ptcWidgetTalkbackNavPage"]);
    }
    /* Bind "Show TOS" button */
    if(anchors[i].className == "ptcWidgetTalkbackNavTOS")
    {
      var tosURL = baseNavURL +"&nav=tosReportMaster&aw=y&ptpw=y&noResize="+ this._talkbackFields.noResizeTOS +"&tid="+ this._talkbackFields.tid +"&tsn=";
      new TempestNS.Button(anchors[i], function(evt){ 
          var t = TempestNS.Client.GetMouseTarget(evt); 
          var info = t.id.split("_");
          self.RaiseEvent("Talkback", {'buttonId':t.id, 'buttonText':t.innerHTML, 'buttonURL':tosURL + info[1] +"&sender="+ info[2]});
          var inlineTOS = document.getElementById(self._widgetId +"_TOSForm_"+ info[1]);
          if(inlineTOS)
          {
            inlineTOS.setAttribute(self._classAttribute, "ptcWidgetReviewsTOSForm");
          }
          else
          {
            window.open(tosURL + info[1] +"&sender="+ info[2]);
          }
        }, this, ["ptcWidgetTalkbackNavTOS"]);
    }
    /* Bind "Submit" button if render=anchor */
    if(anchors[i].className == "ptcWidgetTalkbackSubmitButton")
    {
      new TempestNS.Button(anchors[i], new Function(this._ref+".Submit();"), this, ["ptcWidgetTalkbackSubmitButton"]);
    }
    /* Bind "Go To Submit" button */
    if(anchors[i].className == "ptcWidgetButtonPostBox")
    {
      var postScroll = this._pointer +"_Submit";
      new TempestNS.Button(anchors[i], function(){ TempestNS.Client.ScrollToId(postScroll); }, this, ["ptcWidgetButtonPostBox"]);
    }
    
    /* Bind Hide TOS button */
    if(anchors[i].className == "ptcWidgetTOSCancelButton")
    {
      new TempestNS.Button(anchors[i], function(evt){
            var t = TempestNS.Client.GetMouseTarget(evt);
            var info = t.id.split("_");
            document.getElementById(self._widgetId +"_TOSForm_"+ info[1]).setAttribute(self._classAttribute, "ptcPostMessageOff");
          }, this, [anchors[i].className]);
    }
    /* Bind Send TOS button */
    if(anchors[i].className == "ptcWidgetTOSSendButton")
    {
      /* Load CommandHandler */
      new TempestNS.CommandHandler();
      /* Set PTCommand */
      new TempestNS.Button(anchors[i], function(evt){
          var t = TempestNS.Client.GetMouseTarget(evt);
          var info = t.id.split("_");
          var controlList = new Array();
          controlList.push(document.getElementById(self._widgetId +"_TOSForm_"+ info[1]).getElementsByTagName('input'));
          controlList.push(document.getElementById(self._widgetId +"_TOSForm_"+ info[1]).getElementsByTagName('select'));
          controlList.push(document.getElementById(self._widgetId +"_TOSForm_"+ info[1]).getElementsByTagName('textarea'));
          var cmdId = 'PCmd' + TempestNS.COMMANDHANDLER.nextCommandId;
          TempestNS.COMMANDHANDLER.nextCommandId++;
          TempestNS.COMMANDHANDLER.SendCommand(cmdId, 'forum', self._webtag, 'cmdSendTos(mMsg'+ info[1] +',Forum.TOSViolationStd,msg)', null, controlList, function(result){ self.HandleCommandResult(result); });
        }, this, [anchors[i].className]);
    }
    /* Bind Cancel comment button */
    if(anchors[i].className == "ptcWidgetTalkbackCancelButton")
    {
      new TempestNS.Button(anchors[i], function(evt){
        self._parent.Refresh({'args':TempestNS.Widget.ArgsBuilder(TempestNS.Widget.ArgsUpdater(TempestNS.Widget.ArgsSplitter(self._parent.args), [{"name":"editTsn","value":""}]))});
      }, this, [anchors[i].className]);
    }
    /* Bind edit comment button */
    if(anchors[i].className == "ptcWidgetTalkbackButtonEditComment")
    {
      new TempestNS.Button(anchors[i], function(evt){
        var t = TempestNS.Client.GetMouseTarget(evt);
        var info = t.id.split("_");
        self._parent.Refresh({'args':TempestNS.Widget.ArgsBuilder(TempestNS.Widget.ArgsUpdater(TempestNS.Widget.ArgsSplitter(self._parent.args), [{"name":"cdsn","value":TempestNS.Widget.GetSeq()},{"name":"editTsn","value":info[1]}]))});
      }, this, [anchors[i].className]);
    }
  }
}


/**
 <summary>
 </summary>
 <param name="tips"></param>
**/
TempestNS.Components.Talkback.SetWidgetCounters = function()
{
  if(this._talkbackFields.charCounting)
  {
    var self = this;
    for(var i = 0; i < this._talkbackFields.charCounting.length; i++)
    {
      currElm = document.getElementById(this._pointer + this._talkbackFields.charCounting[i].id);
      if(currElm)
      {  
        self.CharCounter(self._pointer + self._talkbackFields.charCounting[i].id, self._talkbackFields.charCounting[i].maxLen, self._talkbackFields.charCounting[i].message);
        TempestNS.Client.AddEventListener(currElm, "keyup", function(evt){
                var t = TempestNS.Client.GetMouseTarget(evt); 
                var idArr = t.id.split('_');
                var id = "_" + idArr[idArr.length - 1];
                for(var i = 0; i < self._talkbackFields.charCounting.length; i++)
                {
                  if(id == self._talkbackFields.charCounting[i].id)
                  {
                    self.CharCounter(self._pointer + self._talkbackFields.charCounting[i].id, self._talkbackFields.charCounting[i].maxLen, self._talkbackFields.charCounting[i].message);
                  }
                }
            }, false);
      }
    }
  }
}


/**
 <summary>
 </summary>
 <param name="tips"></param>
**/
TempestNS.Components.Talkback.SetWidgetToolTips = function(tips)
{
  /* Loop through the collection of tags to find hidden inputs and bind related divs to some action */
  for(var i = 0; i < tips.length; i++)  
  {
    if(tips[i].className == "ptcWidgetTalkbackTextMessageToolTipMsg")
    {
      /* if the first tooltip, create ToolTip Object */
      if(this._talkbackToolTipper == null)
      {
        this._talkbackToolTipper = new TempestNS.Client.ToolTip();
      }
      /* get tsn */
      var Tsn = tips[i].id.split("_");
      var myTsn = Tsn[Tsn.length - 1];
      /* add tooltip */
      this._talkbackToolTipper.AddToolTip(myTsn, tips[i].value);
      /* get the div that holds the message */
      var messageDivId = Tsn[0] +"_"+ Tsn[1] +"_"+ Tsn[2] +"_"+ myTsn;
      var messageDiv = document.getElementById(messageDivId);
      /* bind the messageDiv to show the tooltip when mouseover event occurs on it */
      var self = this;
      var myButton = new TempestNS.Button(messageDiv, function(evt){ }, this, ["ptcWidgetTalkbackTextMessage"]);
      myButton.onMouseOver = function(evt) {
        var t = TempestNS.Client.GetMouseTarget(evt); 
        var info = t.id.split("_");
        self._talkbackToolTipper.ShowToolTip(info[info.length - 1], evt);
      };
      myButton.onMouseOut = function(evt) {
        self._talkbackToolTipper.HideToolTip();
      };
    }
  }
}


/**
 <summary>
 </summary>
**/
TempestNS.Components.Talkback.Submit = function()
{
  this.RaiseEvent("Talkback", {'buttonAction':'Submit'}); 
  var commentBox = document.getElementById(this._pointer + "_body");
  if(commentBox)
  {
    if(commentBox.value == '')
    {
      if(this._widgetParentTest)
      {
        /* Add Error Message */
          this.SystemMessage("error", false, this._talkbackFields.messageEmptyComments);
      }
      else
      {
        /* Pass this as an oject to the parent */
        this.RaiseEvent("TALKBACK", {'type':'talkback', 'postParamsEncoded':null, 'postParamsNotEncoded':null});
      }
    }
    else
    {
      /* Set Params to pass to ACPost */
      var paramsEncoded = "";
      var paramsNotEncoded = new Array();
      /* Component Ref */
      paramsEncoded += "&componentRef=" + escape(this._ref);
      paramsNotEncoded[0] = {"name":"componentRef", "type":"input", "value":"window.parent."+this._ref};
      /* Current Page */
      paramsEncoded += "&curPage="+ escape(window.location.href);
      paramsNotEncoded[1] = {"name":"curPage", "type":"input", "value":window.location.href};
      /* ContentId or Tid */
      if(this._talkbackFields.contentId != "")
      {
        paramsEncoded += "&contentId="+ this._talkbackFields.contentId;
        paramsNotEncoded[2] = {"name":"contentId", "type":"input", "value":this._talkbackFields.contentId};
      }
      else
      {
        paramsEncoded += "&tid="+ this._talkbackFields.tid;
        paramsNotEncoded[2] = {"name":"tid", "type":"input", "value":this._talkbackFields.tid};
      }
      /* folderId */
      paramsEncoded += "&folderId="+ this._talkbackFields.folderId;
      paramsNotEncoded[3] = {"name":"folderId", "type":"input", "value":this._talkbackFields.folderId};
      /* widgetId */
      paramsEncoded += "&widgetId="+ this._widgetId;
      paramsNotEncoded[4] = {"name":"widgetId", "type":"input", "value":this._widgetId};
      /* contentUrl */
      paramsEncoded += "&contentUrl="+ escape(this._talkbackFields.contentUrl);
      paramsNotEncoded[5] = {"name":"contentUrl", "type":"input", "value":this._talkbackFields.contentUrl};
      /* subject */
      paramsEncoded += "&subject="+ escape(this._talkbackFields.subject);
      paramsNotEncoded[6] = {"name":"subject", "type":"textarea", "value":this._talkbackFields.subject};
      /* body */
      paramsEncoded += this.AddURLParam("body", true);
      paramsNotEncoded[7] = {"name":"body", "type":"textarea", "value":document.getElementById(this._pointer+"_body").value};
      /* returnUrl */
      if(this._talkbackFields.returnUrl)
      {
        paramsEncoded += "&returnUrl="+ escape(this._talkbackFields.returnUrl);
        paramsNotEncoded[paramsNotEncoded.length] = {"name":"returnUrl", "type":"input", "value":this._talkbackFields.returnUrl};
      }
      /* Edit Tsn */
      if(this._talkbackFields.editTsn)
      {
        paramsEncoded += "&editTsn="+ escape(this._talkbackFields.editTsn);
        paramsNotEncoded[paramsNotEncoded.length] = {"name":"editTsn", "type":"input", "value":this._talkbackFields.editTsn};
      }
      /* To */
      if(document.getElementById(this._pointer+"_toUserId"))
      {
        paramsEncoded += this.AddURLParam("toUserId", true);
        paramsNotEncoded[paramsNotEncoded.length] = {"name":"toUserId", "type":"input", "value":document.getElementById(this._pointer+"_toUserId").value};
      }
      /* signature */
      if(document.getElementById(this._pointer+"_signature"))
      {
        paramsEncoded += this.AddURLParam("signature", true);
        paramsNotEncoded[paramsNotEncoded.length] = {"name":"signature", "type":"textarea", "value":document.getElementById(this._pointer+"_signature").value};
      }

      if(this._widgetParentTest)
      {
        /* Add Submitting Message */
        this.SystemMessage("alert", false, this._talkbackFields.messageSubmittingComments);
        /* Submit Contents */
        this.WidgetSubmission(paramsNotEncoded, paramsEncoded);
      }
      else
      {
        /* Pass this as an oject to the parent */
        this.RaiseEvent("TALKBACK", {'type':'talkback', 'postParamsEncoded':paramsEncoded, 'postParamsNotEncoded':paramsNotEncoded, '_ref':this._ref, '_self':this, 'tid':this._talkbackFields.tid});
      }
    }
  }
}


/**
 <summary>
 </summary>
**/
TempestNS.Components.Talkback.SystemMessage = function(type, rebuild, message)
{
  var sysClass = "";
  switch(type)
  {
    case "error":
    {
      sysClass = "ptcPostMessageError";
      break;
    }
    case "alert":
    {
      sysClass = "ptcPostMessageBefore";
      break;
    }
    case "go":
    {
      this._parent.args = TempestNS.Widget.ArgsBuilder(TempestNS.Widget.ArgsUpdater(TempestNS.Widget.ArgsSplitter(this._parent.args), [{"name":"cdsn","value":TempestNS.Widget.GetSeq()},{"name":"editTsn","value":""}]));
      sysClass = "ptcPostMessageAfter";
      break;
    }
    case "remove":
    {
      sysClass = "ptcPostMessageOff";
      break;
    }
    default:
    {
      sysClass = "ptcPostMessageOff";
    }
  }
  /* Set System Div */
  var sysDiv = document.getElementById(this._pointer + "_Message_System");
  var sysDivText = document.getElementById(this._pointer + "_Message_System_Text");
  /* Add Error Message */
  if(sysDivText)
  {
    sysDivText.innerHTML = message;
  }
  /* Alert User */
  if(sysDiv)
  {
    sysDiv.setAttribute(this._classAttribute, sysClass);
  
    /* Remove Message and Refesh Widget */
    var self = this;
    if(type != "remove")
    {
      setTimeout(function(){ self.SystemMessage("remove", rebuild, ""); } , this._talkbackFields.messageTime);
    }
    else if(this._widgetId && rebuild)
    { 
      /*
      if(this._talkbackFields.editTsn)
      {
        
        if(TempestNS.Server.dbg == '20'){ alert(this._talkbackFields.editTsn); }
        this._parent.Refresh({'args':TempestNS.Widget.ArgsBuilder(TempestNS.Widget.ArgsUpdater(TempestNS.Widget.ArgsSplitter(this._parent.args), [{"name":"cdsn","value":TempestNS.Widget.GetSeq()},{"name":"editTsn","value":""}]))});
      }
      else
      {}*/
        
      this._parent.Refresh();
      
    }
  }
}



/**
 <summary>
 </summary>
**/
TempestNS.Components.Talkback.WidgetSubmission = function(paramsNE, paramsE)
{
  /* Get the environment */
  var myEnvironment = TempestNS.WidgetManager.GetEnvironment();
  /* TODO: For now, submit type is based on 'environment'.  This could be also be decided by url length */
  switch(myEnvironment)
  {
    /* Same Server */
    case 2: /* Needs further Testing */
    {
      var src = "http://" + TempestNS.Server.domain + "/dir-app/acx/ACPost.aspx?webtag=" + this._webtag + "&widgetPost=y";
          var callback = new Function('args',this._ref + ".HandleResult(args);");
      var xhr = new TempestNS.Ajax(src, callback);
      xhr.Open("post");
      xhr.Send(paramsE);
      break;
    }
    /* Same Domain */
    case 1:
    {
      /* Set Domain */
      this._originalDomain = document.domain;
      document.domain = TempestNS.WIDGETMANAGER.GetRootDomain(window.location.host);
         
      /* Set Params */
      this._postParams = paramsNE;
      
      /* Add Listener */
      var self = this;
      this.AddEventListener("ACPostResponse", function(JSON){ self.HandleResult(JSON, self);} );
      
      /* Create iFrame */
      this._iFrame = document.createElement('iframe');
      this._iFrame.id = "ptcWidgetTalkbackSubmitIframe";  
      var iFrameSrc = "http://" + TempestNS.Server.domain;
      iFrameSrc += TempestNS.Server.Apps['forum'];
      iFrameSrc += "?webtag=" + this._webtag;
      iFrameSrc += "&nav=iframe&template=AWidgetsBridgeEncoded";
      iFrameSrc += "&parentDomain="+ document.domain;
      iFrameSrc += "&parent="+ this._ref;
      if(TempestNS.Server.dbg)
      {
        iFrameSrc += "&dbg=" + TempestNS.Server.dbg;
      }
      if(TempestNS.Server.dbg == '52')
      {
        this._iFrame.style.height = "500px";
        this._iFrame.style.width = "500px";
      }
      else
      {
        this._iFrame.style.height = "0px";
        this._iFrame.style.width = "0px";
        this._iFrame.style.visibility = "hidden";
      }
      this._iFrame.setAttribute('src',iFrameSrc);
      this._canvas.appendChild(this._iFrame);
      break;
    }
    /* Different Universe */
    case 0:
    {
      var self = this;
      this.AddEventListener("ACPostResponse", function(JSON){ self.HandleResult(JSON, self);} );
      var newUrl = "http://" + TempestNS.Server.domain; 
      newUrl += "/dir-app/acx/ACPost.aspx?returnStatus=y&webtag="+ this._webtag +"&jss=y";
      newUrl += paramsE;
      TempestNS.Client.IncludeScript(newUrl);
      break;
    }
  }
}




TempestNS.Components.Talkback.prototype            = new TempestNS.Registered_Container();
TempestNS.Components.Talkback.prototype.AddURLParam      = TempestNS.Components.Talkback.AddURLParam;
TempestNS.Components.Talkback.prototype.CharCounter     = TempestNS.Components.Talkback.CharCounter;
TempestNS.Components.Talkback.prototype.CreateParam      = TempestNS.Components.Talkback.CreateParam;
TempestNS.Components.Talkback.prototype.GetURLParams    = TempestNS.Components.Talkback.GetURLParams;
TempestNS.Components.Talkback.prototype.HandleCommandResult    = TempestNS.Components.Talkback.HandleCommandResult;
TempestNS.Components.Talkback.prototype.HandleResult    = TempestNS.Components.Talkback.HandleResult;
TempestNS.Components.Talkback.prototype.HandleResultJSON  = TempestNS.Components.Talkback.HandleResultJSON;
TempestNS.Components.Talkback.prototype.HandleResultXML    = TempestNS.Components.Talkback.HandleResultXML;
TempestNS.Components.Talkback.prototype.OnLoad        = TempestNS.Components.Talkback.OnLoad;
TempestNS.Components.Talkback.prototype.OnUnload      = TempestNS.Components.Talkback.OnUnload;
TempestNS.Components.Talkback.prototype.Pagination  = TempestNS.Components.Talkback.Pagination;
TempestNS.Components.Talkback.prototype.SetWidgetButtons  = TempestNS.Components.Talkback.SetWidgetButtons
TempestNS.Components.Talkback.prototype.SetWidgetCounters   = TempestNS.Components.Talkback.SetWidgetCounters;
TempestNS.Components.Talkback.prototype.SetWidgetToolTips  = TempestNS.Components.Talkback.SetWidgetToolTips
TempestNS.Components.Talkback.prototype.Submit        = TempestNS.Components.Talkback.Submit;
TempestNS.Components.Talkback.prototype.SystemMessage    = TempestNS.Components.Talkback.SystemMessage;
TempestNS.Components.Talkback.prototype.WidgetSubmission  = TempestNS.Components.Talkback.WidgetSubmission;
TempestNS.Components.Talkback.ComponentScript = null;





 TempestNS.RegisterScript('Buttons');TempestNS.RegisterScript('WidgetArgs');TempestNS.RegisterScript('Talkback');
