function FormHelper(autoLoad)
{
    //constructor
}

//create a global FormHelper instance
var formHelper = new FormHelper();

FormHelper.prototype.GetElementById = function( pID )
{
    if( Browser.w3c )
    {
	    if (document.getElementById(pID))
       		return this.SetupElement(document.getElementById(pID));
       	else
       	  	return this.SetupElement(document.getElementsByName(pID)[0]);
    }
    else if( Browser.iex )
    {
       return this.SetupElement(document.all[pID]);
    }
}
//method shortcut
function $(pID)
{
   return formHelper.GetElementById(pID);
}

FormHelper.prototype.GetElementByRef = function( pEment )
{
    return this.SetupElement(pEment);
}
//method shortcut
function $r(pEment)
{
   return formHelper.GetElementByRef(pEment);
}

FormHelper.prototype.HasClassName = function( pclassname ) 
{
   //Case insensitive search
   reRegExp = new RegExp(pclassname, "ig");
   return this.className.match(reRegExp);
}

FormHelper.prototype.RemoveClassName = function( pclassname ) 
{
   if(this.classid && (this.classid.toUpperCase() == classIdProblemType || this.classid.toUpperCase() == classIdDatePicker || this.classid.toUpperCase() == classIdHtmlEditor))
   {
   	   this.color = "#ffffff";
   }
   else
   {
	   var sClassName = new String(this.className.replace(pclassname, ""));
	   this.className = sClassName.Trim();
   }
}

FormHelper.prototype.AddClassName = function( pclassname ) 
{
   this.RemoveClassName( pclassname );
   
   if(this.classid && (this.classid.toUpperCase() == classIdProblemType || this.classid.toUpperCase() == classIdDatePicker || this.classid.toUpperCase() == classIdHtmlEditor))
   {
   	   this.color = "#ffffcc";
   }
   else
   {
   	   this.className = this.className + " " + pclassname;
   }
}

FormHelper.prototype.AddClassNameHandlers = function(element)
{
    element.HasClassName = this.HasClassName;
    element.RemoveClassName = this.RemoveClassName;
    element.AddClassName = this.AddClassName;
    return element;
}

FormHelper.prototype.Alpha = function(element, alpha)
{
    if( Browser.iex && element.style.filter != null)
    {
        element.style.filter = "alpha(opacity=" + alpha + ")";
    }
    else if( element.style.MozOpacity != null )
    {
        element.style.MozOpacity = parseFloat(alpha)/100;
    }
}

FormHelper.prototype.GetAlpha = function(element)
{
    if( Browser.iex && element.style.filter != null)
    {
        var f = element.style.filter;
        var s = f.indexOf("alpha(opacity="); 
        if(s==-1) return 100; //no alpha setup
        var e = f.indexOf(")", s);
        var v = f.substring(s+14, e);
        return parseFloat(v); //"alpha(opacity=" + alpha + ")";
    }
    else if( element.style.MozOpacity != null )
    {
        var a = (isNaN(parseFloat(element.style.MozOpacity))) ? 1 : element.style.MozOpacity;
        return parseFloat(a) * 100; //parseFloat(alpha)/100;
    }
}

FormHelper.prototype.AttachEvent = function( element, pEvent, pListener, pEventCapturing )
{   
   if( pEventCapturing == null ) pEventCapturing = false;
   if( Browser.iex ) element.attachEvent(pEvent, pListener);
   else if( Browser.w3c ) element.addEventListener(pEvent, pListener, pEventCapturing);
}

FormHelper.prototype.DetachEvent = function( element, pEvent, pListener, pEventCapturing )
{
   if( pEventCapturing == null ) pEventCapturing = false;
   if( Browser.iex ) element.detachEvent(pEvent, pListener);
   else if( Browser.w3c ) element.removeEventListener(pEvent, pListener, pEventCapturing);
}

FormHelper.prototype.FindAbsolutePositionX = function()
{
   var curleft = 0, obj = this;
   if (obj.offsetParent)
   {
      while (obj.offsetParent)
      {
         curleft += obj.offsetLeft;
         obj = obj.offsetParent;
      }
   }
   else if (obj.y)
      curleft += obj.y;
   return curleft;
}

FormHelper.prototype.FindAbsolutePositionY = function()
{
   var curtop = 0, obj = this;
   if (obj.offsetParent)
   {
      while (obj.offsetParent)
      {
         curtop += obj.offsetTop;
         obj = obj.offsetParent;
      }
   }
   else if (obj.y)
      curtop += obj.y;
   return curtop;
}

FormHelper.prototype.SetSelectedIndex = function( value ) 
{
   for( i=0; i<this.options.length; i++ ) 
   {
      if( this.options[i].value == value ) 
      {
         this.selectedIndex = i;
         break;
      }
   }
}

FormHelper.prototype.GetSelectedText = function() 
{
   return this.options[this.selectedIndex].text;
}

FormHelper.prototype.GetSelectedValue = function() 
{
   return this.options[this.selectedIndex].value;
}

FormHelper.prototype.SetupElement = function( pObject )
{
    if( pObject == null ) 
        return null;
    else
        return new CustomHTMLElement(pObject);
}    

FormHelper.prototype.GetStyle = function(oElm, strCssRule)
{
    try
    {
        var strValue = "";
        if(document.defaultView && document.defaultView.getComputedStyle)
        {
            strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);   
        }
        else if(oElm.currentStyle)
        {
            strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1)
            {
                return p1.toUpperCase();
            });
            strValue = oElm.currentStyle[strCssRule];      
        }
   }
   catch(ex)
   {
       debugHelper.Exception("formHelper.GetStyle " + ex.message, document.URL, document.lastModified, document.referrer);
   }
    return strValue;
}   

FormHelper.prototype.ClearAllFields = function( psAIBlock )
{
   if( psAIBlock == null ) 
      psAIBlock = "all";
   else
      psAIBlock = psAIBlock.toLowerCase();
   
   var oFields = document.getElementsByTagName("input");

   if( oFields != null )
   {
      for( i=0; i < oFields.length; i++ )
      {
         var sAIBlock = oFields[i].getAttribute('ieblock');
         
         if( sAIBlock != null ) 
            sAIBlock = sAIBlock.toLowerCase();
            
         if( psAIBlock == "all" || sAIBlock == psAIBlock )
         {
            if( oFields[i].type == "text" )
            {
               oFields[i].value = '';
            }
         }
      }
   }

   var oFields = document.getElementsByTagName("textarea");

   if( oFields != null )
   {
      for( i=0; i < oFields.length; i++ )
      {
         var sAIBlock = oFields[i].getAttribute('ieblock');
         
         if( sAIBlock != null ) 
            sAIBlock = sAIBlock.toLowerCase();
            
         if( psAIBlock == "all" || sAIBlock == psAIBlock )
         {
            if( oFields[i].type == "textarea" )
               oFields[i].value = '';
         }
      }
   }
   
   var oFields = document.getElementsByTagName("select");

   if( oFields != null )
   {
      for( i=0; i < oFields.length; i++ )
      {
         var sAIBlock = oFields[i].getAttribute('ieblock');
         
         if( sAIBlock != null ) 
            sAIBlock = sAIBlock.toLowerCase();
            
         if( psAIBlock == "all" || sAIBlock == psAIBlock )
         {
            if( oFields[i].type == "select-one" )
               oFields[i].selectedIndex = 0;
         }
      }
   }   
}

FormHelper.prototype.GetElementsByAttribute = function(aName, aValue, tName)
{
   var elms, rslt = [];
   if(document.all || document.getElementsByTagName)
   {
      if(tName)
      {
         elms = document.all ? document.all.tags(tName.toUpperCase()) : document.getElementsByTagName(tName);
      }
      else
      {
         elms = document.all ? document.all : document.getElementsByTagName("*");
      }
      
      for(var i = 0; i < elms.length; i++)
      {
         // Note: in IE5/Mac, element.getAttribute("class") returns null 
         // even when the class attribute contains a value. 
         // However, element.className will return the correct value.
         var attr = null;
         if( aName == "class")
             attr = elms[i].className;
         else
             if( elms[i].getAttribute ) //check needed for opera
                 attr = elms[i].getAttribute(aName);
             
         if(attr)
         {
            if(aValue && attr != aValue)
            {
               continue;
            }
            rslt[rslt.length] = elms[i];
         }
      }
   }
   return rslt;
}
