/**
  * @project    Open CSP-Management
  * @package    common
  * @category   javascript
  *
  * @author     Peter Krebs <p.krebs@wpus.at>
  * @license    http://opensource.org/licenses/gpl-license.php GNU Public License
  *
  * @since pk-06-08-18
  * @version pk-07-02-27
  * @version pk-07-08-30
  *
  */

/**
 * String extensions
 */

String.prototype.leftTrim = function () {
    return (this.replace(/^\s+/,''));
};
String.prototype.rightTrim = function () {
    return (this.replace(/\s+$/,''));
};
//kombiniert leftTrim und rightTrim;
String.prototype.basicTrim = function () {
    return (this.replace(/\s+$/,'').replace(/^\s+/,''));
};
//dampft leerzeichen(-sequenzen) innerhalb einer zeichenkette auf ein einzelnes space ein;
String.prototype.superTrim = function () {
    return(this.replace(/\s+/g,' ').replace(/\s+$/,'').replace(/^\s+/,''));
};

//zugabe: entfernt alle leerzeichen aus einer zeichenkette;
String.prototype.removeWhiteSpaces = function () {
    return (this.replace(/\s+/g,''));
};

  /**
    * searches aForm in the document and returns the id (index in aDocument.forms
    *
    * @param document aDocument
    * @param string frmName
    *
    * @returns element
    *
    * @since pk-07-01-10
    *
    */
    function getFormId(aDocument,frmName) {
        if (aDocument && aDocument.forms.length) {
            var i=0;
            while (i < aDocument.forms.length) {
                if (aDocument.forms[i].name == frmName) return i;
                i++;
            }
        }
    }


/**
* searches aDocument and returns the first element
* with name=aName
*
* @param document aDocument
* @param string elemName
*
* @returns element
*
* @since pk-04-09-24
*
**/
function searchElement(aDocument,elemName) {
    if (aDocument && aDocument.forms.length) {
        var i=0;
        while(i < aDocument.forms.length) {
            if (elem=findElement(aDocument.forms[i],elemName)) {
                return elem;
            }
            i++;
        }
    }
    return false;
}

function countFields(myFormular){
    return myFormular.elements.length;
}

function findElement(myFormular,elemName){
    var i = 0;
    while (i < myFormular.elements.length) {
        if (myFormular.elements[i].name == elemName)
            return myFormular.elements[i];
        i++;
    }
    return false;
}

function setElemValByName(myFormular,elemName,aValue) {
    elem=findElement(myFormular,elemName);
    if (elem) {
        elem.value=aValue;
        return true;
    }
}

function getElemValByName(myFormular,elemName) {
    elem=findElement(myFormular,elemName);
    if (elem)
        return elem.value;
    else
        return false;
}

/**
  * @param form myForm
  * @param string elemName
  * @param mixed aValue
  */
function addOptionValueByName(myForm,elemName,aValue) {
    // for Option cunstructor see:
    // http://www.devguru.com/Technologies/ecmascript/quickref/option.html
    return addOptionByName(myForm,elemName,new Option(aValue,aValue,false,true));
}

/**
  * @param form myForm
  * @param string elemName
  * @param mixed aValue
  * @param string aLabel
  */
function addOptionValueLabelByName(myForm,elemName,aValue,aLabel) {
    // for Option cunstructor see:
    // http://www.devguru.com/Technologies/ecmascript/quickref/option.html
    return addOptionByName(myForm,elemName,new Option(aLabel,aValue,false,true));
}


/**
  * @param form myForm
  * @param string elemName
  * @param mixed aValue
  * @since pk-05-08-25
  */
function selectOptionValueByName(myForm,elemName,aValue) {
    if (elem=findElement(myForm,elemName)) {
        i=0;
        while(i < elem.length) {
            if (elem[i].value == aValue) {
                elem.selectedIndex=i;
                i=elem.length+1;
            }
            i++;
        }
    }
}

function addOptionByName(myForm,elemName,option) {
    if (elem=findElement(myForm,elemName)) {
        id=elem.length;
        elem[id]=option;
        return true;
    } else return false;
}

function getSelectedOptionByName(myForm,elemName) {
    elem=findElement(myForm,elemName);
    if (elem.length > 0)
        return elem[elem.selectedIndex].value;
    else
        return '';
}


function getFormByName(aName) {
    if (document.forms) {
        var i=0;
        while (i < document.forms.length) {
            if (document.forms[i].name == aName)
                return document.forms[i];
            i++;
        }
    }
    return false;
}

function setFormElementValueByName(aFormName, aName, aValue) {
    var aForm = getFormByName(aFormName);
    if (aForm)
        return setElemValByName(aForm,aName,aValue);
    else
        return false;
}


// <pk-06-01-19>
/*
    taken from:
    <!-- The JavaScript Source!! http://javascript.internet.com -->
    <!-- Written by Steve - http://jsmadeeasy.com/ -->
*/

function countChars(aFormName,elemName) {
    var myFormular=getFormByName(aFormName);
    if (!myFormular) return false;

    elem=findElement(myFormular,elemName);
    if (!elem) return false;

    return elem.value.length;
}

function charLeft(aFormName,elemName,maxLen) {
    if (i_chars=countChars(aFormName,elemName)) {
        return maxLen - i_chars;
    } else {
        return false;
    }
}
// </pk-06-01-19>

// <pk-05-09-28>

function textAreaLinkSelection(aFormName,elemName,aUrl) {
    textAreaAddTagToSelection(aFormName,elemName,'<a href="'+aUrl+'" target="_blank">','</a>');
}

function textAreaAddTagToSelection(aFormName,elemName,aStartTag,aEndTag) {
    // adds aStartTag before the selection
    // and aEndTag after the selection
    // if nothing is selected an alert error box is raised
    // addopted form http://aktuell.de.selfhtml.org/tippstricks/javascript/bbcode/
    //

    var myFormular=document.forms[aFormName];
    if (!myFormular) return false;

    elem=findElement(myFormular,elemName);
    if (!elem) return false;

    elem.focus();

    /* Internet Explorer */
    if(typeof document.selection != 'undefined') {
        /* Einfgen des Formatierungscodes */
        var range = document.selection.createRange();
        var insText = range.text;
        range.text = aStartTag + insText + aEndTag;
        /* Anpassen der Cursorposition */
        range = document.selection.createRange();
        if (insText.length == 0) {
            range.move('character', -aEndTag.length);
        } else {
            range.moveStart('character', aStartTag.length + insText.length + aEndTag.length);
        }
        range.select();
    } else if(typeof elem.selectionStart != 'undefined') { /* für auf Gecko basierende Browser */
        /* Einfgen des Formatierungscodes */
        var start = elem.selectionStart;
        var end = elem.selectionEnd;
        var insText = elem.value.substring(start, end);
        elem.value = elem.value.substr(0, start) + aStartTag + insText + aEndTag + elem.value.substr(end);
        /* Anpassen der Cursorposition */
        var pos;
        if (insText.length == 0) {
            pos = start + aStartTag.length;
        } else {
            pos = start + aStartTag.length + insText.length + aEndTag.length;
        }
        elem.selectionStart = pos;
        elem.selectionEnd = pos;
    } else { /* für die übrigen Browser */
        /* Abfrage der Einfgeposition */
        var pos;
        var re = new RegExp('^[0-9]{0,3}$');
        while(!re.test(pos)) {
            pos = prompt("Einfgen an Position (0.." + input.value.length + "):", "0");
        }
        if(pos > elem.value.length) {
            pos = elem.value.length;
        }
        /* Einfgen des Formatierungscodes */
        var insText = prompt("Bitte geben Sie den zu formatierenden Text ein:");
        elem.value = elem.value.substr(0, pos) + aStartTag + insText + aEndTag + elem.value.substr(pos);
    }
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// radio buttons
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/**
 * @param form aForm
 * @param string radioName
 *
 * @return mixed
 *
 * @since pk-07-09-04
 *
 */
function ocsp_getRadioValue(myForm,radioName)
{
    if (objRadio = findElement(myForm,radioName))
    {
        for (var i=0; i<objRadio.length; i++)
            if (objRadio[i].checked)
                return objRadio[i].value;
    } else {
        alert('Field: radioName not in Form '+myForm.type);
        return null;
    }
    var i = 0;
    while (i < myForm.elements.length) {
        if (myForm.elements[i].name == radioName)
            if (myForm.elements[i].checked)
                return myForm.elements[i].value;
        i++;
    }
    return null;
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// popup functions
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

function reloadOpener(frmName) {
    if (window.opener && window.opener.document) {
        if (frmObj=window.opener.getFormByName(frmName)) {
            if ((frmObj.FRMRELOADURL) && (frmObj.FRMRELOADURL.value != "")) {
                frmObj.action=frmObj.FRMRELOADURL.value;
            } else {
                frmObj.action=window.opener.location.href;
            }
            frmObj.submit();
        }
    }
}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// error handling
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

var ocsp_frmList=new Array();

/**
    * js class ocsp_frmObj
    */
function ocsp_frmObj(aHTMLName,contrClass,viewClass)
{
    this.myName=aHTMLName
    this.myControllClass=contrClass;
    this.myViewClass=viewClass;

    this.hasErrors=false;
    this.errMsg=false;

    this.hasChanged=false;

    this.submitCmd=null;

    this.myFields=new Array();

    /**
      * @return documnt.form
      */
    this.getFormDHTMLObj = function()
    {
        return document.forms[this.myName];
    }

    /**
      * if the field is already registered this methods returns the registered one and do not set the new one
      *
      * @param ocsp_fldObj aFieldObj
      * @param boolean debug
      *
      * return ocsp_fldObj
      */
    this.registerField = function(aFldObj,debug)
    {
        if (debug) alert('Form: '+this.myName+' registerField('+aFldObj.jsName+' ('+aFldObj.myName+')');

        if (!aFldObj) return null;

        var i=0;l=this.myFields.length;
        while (i < l) // loop to check if we already have the field registered
        {
            if (this.myFields[i].jsName==aFldObj.jsName)
            {
                if (aFldObj.fldName != this.myFields[i].fldName) // the form has changed
                {
                    if (debug) alert('fldName has changed from '+this.myFields[i].fldName+' to '+aFldObj.fldName);
                    this.myFields[i].fldNme=aFldObj.fldName;
                    this.myFields[i].frmName=this.myName;
                    /*
                    this.myFields[i].myForm=null;
                    this.myFields[i].myFormField=null;
                    */
                }
                return this.myFields[i];
            }
            i++;
        }

        // field not found -> append it to the this.myFields

        i=this.myFields.length;
        this.myFields[i]=aFldObj;
        this.myFields[i].frmName=this.myName;
        return this.myFields[i];
    }
    
    /**
     * returns the field object with jsName == aJsName
     * 
     * @param string aJsName
     */
    this.getField = function(aJsName)
    {
        var l=this.myFields.length;
        for (i=0;i < l;i++) 
        {
            if ((this.myFields[i]) && (this.myFields[i].jsName==aJsName))
            {
            	return this.myFields[i]
            }
        }
        return null;
    }

	/**
	  * notify a field change
	  *
	  * @param string jsName
	  * @param string newValue
	  * @param string changeMethod (if set use this method instead of objField.onChangeFunc
	  * @param boolean debug
	  *
	  */    
    this.fieldChanged = function(aJsName,newValue,changeMethod,debug)
    {
    	this.hasChanged=true;
    	if (objField=this.getField(aJsName))
    	{
    		objField.myForm=this;
    		objField.changed(newValue,changeMethod,debug);
    	}
    	
    }
}

/**
  * @param ocsp_frmObj frmObj
  * @param string fldName
  * @param string jsName
  *
  */
function ocsp_fldObj(jsName,fldName,debug)
{
    this.frmName=null;

    this.jsName=jsName
    this.myName=fldName;

    this.myForm=null;           // document.forms[...] element
    this.myFormField=null;      // document.forms[...][] field element

    this.hasErrors=false;
    this.errMsg='';

    this.hasChanged=false;

    this.allowNull=true;
    this.nullErrMsg='';
    this.regexCheck='';
    this.regexErrMsg='';

    this.debug=debug;

    this.onChangeFunc=null;

    /**
      * notify a field change
      *
      * @param string newValue
      * @param string changeMethod (if set use this method instead of objField.onChangeFunc
      * @param boolean debug
      *
      */  
    this.changed=function(newValue,changeMethod,debug)
    {
        if (this.debug) alert('Form: '+this.myForm.myName+'\mField: '+jsName+'\nchanged to '+newValue);
        var objAjaxFunc=null;

        this.hasChanged=true;
        if (changeMethod && (changeMethod != ''))
        {
            try{
                eval('if (this.'+changeMethod+') objAjaxFunc=this.'+changeMethod+';');
                objAjaxFunc.requestType='post';
                if (debug) objAjaxFunc.doDebug();
                //ocspAjax_debug_mode=true;
            } catch(e) {
                alert('Field change method:'+changeMethod+'\n Error: '+e);
            }
            
        } else if (this.onChangeFunc)  {
            objAjaxFunc=objField.onChangeFunc;
        }

        if (objAjaxFunc)
        {
            try {
                if (!newValue) newValue='';
                objAjaxFunc.setFuncArg('newValue',newValue);
                objAjaxFunc.setFuncArg('frmHTMLName',objForm.myName);
                objAjaxFunc.setFuncArg('fldJSName',objField.jsName);

                if (debug) objAjaxFunc.doDebug();

                ocspAjax_submitForm_toFunction(objForm.getFormDHTMLObj(),objAjaxFunc);
            } catch(e) {
                alert('error: '+e);
            }
        } else {
        	alert('no function object');
        }
    }
}

/**
 * searches the frmList if the form is already registered
 * if so replaces the contrClass and the viewClass
 * if add the form is added
 *
 * @param ocsp_frmObj frmObj
 *
 * @return ocsp_frmObj
 */
function ocsp_form_register_form(frmObj,debug)
{
    if (!frmObj) return false;

    var i=0;
    var l=ocsp_frmList.length;
    while (i < l )
    {
        if (ocsp_frmList[i] && ocsp_frmList[i].myName && (ocsp_frmList[i].myName==frmObj.frmName))
        {
            ocsp_frmList[i].myControllClass=contrClass;
            ocsp_frmList[i].myViewClass=viewClass;
            return ocsp_frmList[i];
        }
        i++;
    }

    i=ocsp_frmList.length;
    ocsp_frmList[i]=frmObj;
    return ocsp_frmList[i];
}


/**
  * @param string $frmName
  *
  * @return ocsp_frmObj
  */
function ocsp_form_getFrmObj(frmName,debug)
{
    l=ocsp_frmList.length;
    for (i=0;i<l;i++)
    {
        if (debug) alert(i+': form '+ ocsp_frmList[i].myName +'\nsearch: '+frmName);
        if (ocsp_frmList[i] && ocsp_frmList[i].myName && (ocsp_frmList[i].myName==frmName))
        {
            return ocsp_frmList[i];
        }
    }
    if (debug) alert('Form '+frmName+' not found');
    return null;
}

/**
  * @param string frmName (name of the form)
  * @param string fldName (name of the field)
  * @param string errMsg
  */
function ocsp_form_setError(frmName,fldName,errMsg)
{
    if (frmObj=ocsp_getFrmObj(frmName))
    {
        frmObj.hasErrors=true;
    }

    alert('Field: '+fldName+Error+' '+errMsg);
}


/**
 * @param ocsp_frmObj frmObj
 * @param string jsName
 *
 * @return ocsp_fldObj
 */
function ocsp_form_getFieldObj(frmObj,jsName)
{
    if (frmObj) {return frmObj.getField(jsName);}
    return null;
}


/**
  * notify a field change
  *
  * @param string frmName
  * @param string jsName
  * @param string newValue
  * @param string changeMethod (if set use this method instead of objField.onChangeFunc
  *
  */
function ocsp_from_fieldChanged(frmName,jsName,newValue,changeMethod,debug)
{
    if (objForm=ocsp_form_getFrmObj(frmName))
    {
        objForm.fieldChanged(jsName,newValue,changeMethod,debug);
    }
}

/**
  * @param array fldErrors
  */
function ocsp_form_ShowFldErrors(fldErrors)
{
    var i=0;
    while(i < fldErrors.length)
    {
        if (fldErrors[i].DOMId)
        {
            alert(fldErrors[i].label+" MSG: "+fldErrors[i].msg);
            ocspAjax_setIdHtml('error_'+fldErrors[i].DOMId,fldErrors[i].msg,'block');
            ocsp_set_ElemCSSClass('fldName_'+fldErrors[i].DOMId,'fldNameError');
        } else {
            alert(fldErrors[i].label+" "+fldErrors[i].msg);
        }
        i++;
    }
}

/**
 * @param event e
 * @param boolean asInteger
 * @return number or NULL
 * 
 * usage: 
 * <code>
 *  &lt;input type="text" onkeypress="return ocsp_form_keyNumber(event,[true|false]);" /&gt;
 * </code>
 */
function ocsp_form_keyNumber(e,asInteger)
{
    var int_key = window.event ? e.keyCode : e.which;
    
    if (int_key < 28)
    {
    	return String.fromCharCode(int_key);
    }
            
    var cha_key = String.fromCharCode(int_key);	
	
    if (asInteger)
    {
    	reg_exp=/\d/;
    } else {
    	reg_exp=/[0-9\.,]/;
    }
    return reg_exp.test(cha_key);
}

/**
  * returns the form of a field
  * @param domObj aFld
  */
function ocsp_getFldForm(aFld)
{	
	o_parNode=aFld.parentNode;
	while (o_parNode)
	{
		s_nodeType=o_parNode.tagName.toUpperCase();
		if (s_nodeType=='BODY')
		{
			return null;
		} else if (s_nodeType=='FORM') {
			return o_parNode;
		}
        o_parNode=o_parNode.parentNode;		
		
	}
	return null;
}  
