/**
 * ------------------------------------------
 * Copyright (c) 2006 Livesite Networks, LLC.
 * ------------------------------------------
 * All rights reserved.
 * ------------------------------------------
 */

/**
 * getElement - x-browser function for referring to an object:
 */

function getElement( id ) {

    return  document.getElementById ?   document.getElementById( id )     :
            document.all            ?   document.all[id]                  :
            document.layers         ?   document.layers[id]               :
                                        false;

}

/**
 * ieCompatable - true if user agent is msie or opera
 */

function ieCompatable() {

    return document.all ? true : false;

}//ieCompatable

/**
 * getOffset - Return the offset (top or left) for the given element.
 * getOffset ELEMENT, top|left
 */

function getOffset( element, attr ) {

  if( !element ) return;

  var offset = 0;

  var pos = getCSSAttribute( element, "position" );

  if( pos == "absolute" ) {

      offset = getCSSAttribute( element, attr );

  } else {

      offset = element.offsetTop;

      if( element.offsetParent ) {

          var ppos = getCSSAttribute( element.offsetParent, "position" );

          if( ppos != "absolute" ) offset += getOffset( element.offsetParent, attr );

      }

  }

  return offset;

}

/**
 * toggleDisplay - Hide or show an element (using css 'display' property).
 *
 * @param   id  <code>String</code> HTML Element ID
 */

function toggleDisplay( id ) {

    var elem = document.getElementById( id );

    var display = getCSSAttribute( elem, "display" );

    elem.style.display = display == "none" ? "block" : "none";

}//toggleDisplay

/**
 * getCSSAttribute ELEMENT, CSSKEY
 *
 * Get the CSS attribute value.
 * First check the style, and then look at the element's classes, then the id
 * selector.
 */

function getCSSAttribute( elem, key ) {

    var attr = false;

    if( elem ) {

        if( elem.style ) attr = eval( "elem.style." + key );

        if( !attr ) {

            if( elem.className ) {

                var classes = elem.className.split( / / );

                for( var i = 0; !attr && (i < classes.length); i++ ) {

                    var rule = getCSSRule( "." + classes[i] );

                    if( rule ) {

                        attr = rule.style[key];

                        rule = false;

                    }

                }

            }

            if( !attr ) {

                if( elem.id ) {

                    var rule = getCSSRule( "#" + elem.id );

                    if( rule ) {

                        attr = rule.style[key];

                        rule = false;

                    }

                }

            }

        }

    }

    return attr;

}//getCSSAttribute

/**
 * getCSSRule NAME
 *
 * Return the CSSStyleDeclaration matching NAME.
 * Only returns the first found rule.
 */

function getCSSRule( target ) {

    var stylesheets = document.styleSheets;
    var rulekey     = "cssRules";
    var rule        = false;

    if( ieCompatable() ) rulekey = "rules";

    if( stylesheets ) {

        for( var i = 0; !rule && (i < stylesheets.length); i++ ) {

            for( var j = 0; !rule && (j < stylesheets[i][rulekey].length); j++ ) {

                var cssrule     = stylesheets[i][rulekey][j];
                var rulename    = cssrule.selectorText;

                if( rulename == target ) {

                    rule = cssrule;
                
                }

            }

        }

    }

    return rule;

}//getCSSRule

/*------------------------------------------------------------------------------
 * getContentWindow IFRAME_ID, [ELEM_ID]
 *
 * Returns the inner contentWindow of an IFRAME element.  If ELEM_ID is set,
 * only return the contentWindow if it has an element by that ID.
 *----------------------------------------------------------------------------*/

function getContentWindow( id, verify ) {

    var content = document.getElementById( id );

    if( ! content ) {
    
        content = window.frames[id];

    }//if

    if( content ) {

        var cwin = content.contentWindow;

        if( verify ) {

            if( cwin.document.getElementById( verify ) ) {

                return content.contentWindow;

            }//if

        } else {

            return content.contentWindow;

        }//if

    }//if

    return false;

}//getContentWindow

/*------------------------------------------------------------------------------
 * getContentDocument FRAMEID
 *
 * Return the content document for the specified iframe.
 *----------------------------------------------------------------------------*/

function getContentDocument( frameid ) {

    var doc;

    if (document.all) {

        doc = frames[frameid].document;

    } else {

        try {

            var iframe = document.getElementById( frameid );

            var doc = iframe.contentDocument;

        } catch( err ) {

            // Quiet

        }

    }

    return doc;

}//getContentDocument

/*------------------------------------------------------------------------------
 * applyFilters OBJECT
 *
 * Apply microsoft filters.
 *
 * OBJECT   Target object.
 *----------------------------------------------------------------------------*/
function applyFilters( obj, filter_name ) {

    if( ! ieCompatable() ) { return false; }

    if( obj ) {

        obj.style.filter = "progid:DXImageTransform.Microsoft." + filter_name;

        if( obj.filters ) {

            for( var i=0; i < obj.filters.length; i++ ) {

                var filter = obj.filters[i];

                filter.Apply();

                return true;

            }//for

        }//if

    }//if

}//applyFilters

/*------------------------------------------------------------------------------
 * playFilters OBJECT
 *
 * Play microsoft filters.
 *
 * OBJECT   Target object.
 *----------------------------------------------------------------------------*/

function playFilters( obj ) {

    if( ! ieCompatable() ) { return false; }

    if( obj ) {

        if( obj.filters ) {

            for( var i=0; i < obj.filters.length; i++ ) {

                var filter = obj.filters[i];

                filter.Play();

                return true;

            }//for

        }//if

    }//if

}//playFilters

/*------------------------------------------------------------------------------
 * sendXmlHttpRequest URL, [PARAMETERS], [METHOD]
 *
 *  URL         Request URL.
 *  PARAMETERS  Request parameters.
 *  METHOD      "GET"|"POST"
 *----------------------------------------------------------------------------*/

function sendXmlHttpRequest( url, params, method ) {

    var req;

    if( !params ) params = null;
    if( !method ) method = "GET";

    if( window.XMLHttpRequest ) {

        req = new XMLHttpRequest();

    } else if( window.ActiveXObject ) {

        req = new ActiveXObject( "Microsoft.XMLHTTP" );

    }//if
       
    if( req ) {

        req.open( method, url, false ); // false meaning not async

        req.setRequestHeader( "Content-Type",
            "application/x-www-form-urlencoded; charset=UTF-8" );

        req.send( escape(params) );

        return req;

    } else {

        return false;

    }//if
    
}//sendXmlHttpRequest

/*------------------------------------------------------------------------------
 *----------------------------------------------------------------------------*/

function sprintf()
{
    if (!arguments || arguments.length < 1 || !RegExp)
    {
        return;
    }
    var str = arguments[0];
    var re = /([^%]*)%('.|0|\x20)?(-)?(\d+)?(\.\d+)?(%|b|c|d|u|f|o|s|x|X)(.*)/;
    var a = b = [], numSubstitutions = 0, numMatches = 0;
    while (a = re.exec(str))
    {
        var leftpart = a[1], pPad = a[2], pJustify = a[3], pMinLength = a[4];
        var pPrecision = a[5], pType = a[6], rightPart = a[7];
        
        //alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision);

        numMatches++;
        if (pType == '%')
        {
            subst = '%';
        }
        else
        {
            numSubstitutions++;
            if (numSubstitutions >= arguments.length)
            {
                alert("Error! Not enough function arguments (" + (arguments.length - 1) + ", excluding the string)\nfor the number of substitution parameters in string (" + numSubstitutions + " so far).");
            }
            var param = arguments[numSubstitutions];
            var pad = '';
                   if (pPad && pPad.substr(0,1) == "'") pad = leftpart.substr(1,1);
              else if (pPad) pad = pPad;
            var justifyRight = true;
                   if (pJustify && pJustify === "-") justifyRight = false;
            var minLength = -1;
                   if (pMinLength) minLength = parseInt(pMinLength);
            var precision = -1;
                   if (pPrecision && pType == 'f') precision = parseInt(pPrecision.substring(1));
            var subst = param;
                   if (pType == 'b') subst = parseInt(param).toString(2);
              else if (pType == 'c') subst = String.fromCharCode(parseInt(param));
              else if (pType == 'd') subst = parseInt(param) ? parseInt(param) : 0;
              else if (pType == 'u') subst = Math.abs(param);
              else if (pType == 'f') subst = (precision > -1) ? Math.round(parseFloat(param) * Math.pow(10, precision)) / Math.pow(10, precision): parseFloat(param);
              else if (pType == 'o') subst = parseInt(param).toString(8);
              else if (pType == 's') subst = param;
              else if (pType == 'x') subst = ('' + parseInt(param).toString(16)).toLowerCase();
              else if (pType == 'X') subst = ('' + parseInt(param).toString(16)).toUpperCase();
        }
        str = leftpart + subst + rightPart;
    }
    return str;
}

/**
 * addFormParameter - Adds a hidden input (key/value) to a form.
 *
 * @param form <code>HTMLForm Element</code>
 * @param key <code>String</code>
 * @param val <code>String</code>
 */

function addFormParameter( form, key, val ) {

  var input = document.createElement("input");

  input.type  = "hidden";
  input.name  = key;
  input.value = val;
  input.style.display = "none";

  form.appendChild( input );

}
