function objectAddCSSClass( objectID, newClassName ){
  var objectRef = document.getElementById( 'element_' + objectID );
  if( objectRef.className.indexOf( newClassName )  < 0 ){
    objectRef.className += ' ' + newClassName;
  }
}
function objectRemoveCSSClass( objectID, oldClassName ){
  var objectRef = document.getElementById( 'element_' + objectID );
  if( objectRef.className.indexOf( oldClassName ) >= 0 ){
    var regExString = new RegExp( oldClassName );
    objectRef.className = objectRef.className.replace( regExString, "" );
  }
}

var selectIds     = new Array();
var formElements  = new Array();
var checkReadOnly = new Array();
function setCheckbox( imageObject,formElement, inputElement ) {
  var setReadonly   = false;
  for ( var i = 0; i < checkReadOnly.length; i++ ) {
    if ( checkReadOnly[ i ] == formElement ) {
      setReadonly = true;
      break;
    } else {
      setReadonly = false;
    }
  }
  if ( setReadonly == false ) {
    var boxImgsrc;
    var elementValues = formElements[ formElement ];
    if( elementValues[ 2 ] != elementValues[ 1 ] ) {
      elementValues[ 2 ] = elementValues[ 1 ];
      if ( document.images[ imageObject.id ].src.indexOf( '-h' ) != -1 ) {
        boxImgsrc = document.images[ imageObject.id ].src;
      } else {
        boxImgsrc = document.images[ imageObject.id ].src.split( '.gif' );
        boxImgsrc = boxImgsrc[ 0 ] + '-h.gif'
      }
      document.images[ imageObject.id ].src = boxImgsrc;
      var elem = document.forms[ 0 ][ inputElement ];
      if( elem.length) {
        var idx = elementValues[ 3 ];
        elem[ idx ].value = elementValues[ 1 ];
      } else {
        elem.value = elementValues[ 1 ];
      }
    } else {
      elementValues[ 2 ] = elementValues[ 0 ];
      if ( document.images[ imageObject.id ].src.indexOf( '-h' ) != -1 ) {
        boxImgsrc = document.images[ imageObject.id ].src.split( '-h' );
        boxImgsrc = boxImgsrc[ 0 ] + '.gif'
      } else {
        boxImgsrc = document.images[ imageObject.id ].src;
      }
      document.images[ imageObject.id ].src = boxImgsrc;
      var elem = document.forms[ 0 ][ inputElement ];
      if( elem.length) {
        var idx = elementValues[ 3 ];
        elem[ idx ].value = elementValues[ 0 ];
      } else {
        elem.value = elementValues[ 0 ];
      }
    }
    handleBehaviours( inputElement, imageObject.id );
  }
}
function selectBoxNotify ( formField, formFieldValue, currentIndex ) {
  if ( typeof dependingSelects != 'undefined' ) {
  	var depSelects = dependingSelects[ formField ];
    if (depSelects && formFieldValue != "") {
      for ( var i=0; i < depSelects.length; i++ ) {
        if (typeof optionGroups[ depSelects[i] ][ formFieldValue ] == 'undefined' ) {
      	  loadDynamicOptions(depSelects[i], formFieldValue, currentIndex);
        } else {
          writeDependantSelectBox(depSelects[i], formFieldValue, currentIndex);
        }
      }
    } else if ( depSelects ) {
      resetDependingSelects(formField);
    }
    notifyValue( formField, formFieldValue );
  }
}

function writeDependantSelectBox(formField, parentValue, currentIndex) {
  if (optionGroups[ formField ][ parentValue ].length > 0) {
  	var notify = true;
  	var selectHeight = optionGroups[ formField ][ parentValue ].length;
    if ( selectHeight > 10 ) selectHeight = 10;
    if ( selectHeight < 1 ) selectHeight = 1;
    divContent = writeSelectBox( formField, optionGroups[ formField ][ parentValue ], currentIndex - 1, 289, selectHeight, "", notify );
    //writeIntoLayer( document.getElementsByTagName( "div" )[ formField ], divContent );
    writeIntoLayer( formField, divContent );
    setVisibility( 'element_' + formField, null, 'block' );
  } else {
    setVisibility( 'element_' + formField, null, 'none' );
    document.forms[ 0 ][ formField ].value = '';
  }
  resetDependingSelects(formField);
}

function resetDependingSelects(formField) {
  if (dependingSelects && dependingSelects[formField]) {
  	var depSelects = dependingSelects[formField];
  	for ( var i=0; i < depSelects.length; i++ ) {
      setVisibility( 'element_' + depSelects[ i ], null, 'none' );
      document.forms[ 0 ][ depSelects[ i ] ].value = '';
      resetDependingSelects(depSelects[ i ]);
    }
  }
}

function loadDynamicOptions( formField, parentValue, currentIndex ) {
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = getDynamicOptionUrl( formField, parentValue );
  document.getElementsByTagName('head')[0].appendChild(script);

  setTimeout("renderDynamicOptions('"+formField+"','"+parentValue+"',"+currentIndex+")",100);
}
function renderDynamicOptions(formField, parentValue, currentIndex) {
/*
  var a = loadedOptions[formField];
  if(typeof a == 'undefined') {
    a = new Array();
    loadedOptions[formField] = a;
  }
  var c = a[parentValue];
  if(typeof c == 'undefined') {
    c = 0
  } else {
    c = c + 1;
  }
  a[parentValue] = c;
  if (c == 3) {
    alert("options not loaded: "+formField+ ", "+parentValue);
    setVisibility( 'element_' + formField, null, 'none' );
    document.forms[ 0 ][ formField ].value = '';
    return;
  }
  */
  if (typeof optionGroups[ formField ][ parentValue ] == 'undefined' ) {
    setTimeout("renderDynamicOptions('"+formField+"','"+parentValue+"',"+currentIndex+")",100);
  } else {
    writeDependantSelectBox(formField, parentValue, currentIndex);
  }
}
function getDynamicOptionUrl(formField, parentValue) {
  var dynamicOptionScript = "/silo/dynamic_list/";
  var curUrl = self.location.href;
  if(curUrl.indexOf('?')!=-1){
     curUrl=curUrl.substring(0,curUrl.indexOf('?'));
  }
  var countryStartIdx = -1;
  if(curUrl.indexOf('/bmw_edit/') != -1){
  	countryStartIdx = curUrl.indexOf('/bmw_edit/') + 10;
    dynamicOptionScript = dynamicOptionScript + 'bmw_edit/';
  } else if(curUrl.indexOf('/bmw_qa/') != -1){
  	countryStartIdx = curUrl.indexOf('/bmw_qa/') + 8;
    dynamicOptionScript = dynamicOptionScript + 'bmw_qa/';
  } else if(curUrl.indexOf('/bmw_prod/') != -1){
  	countryStartIdx = curUrl.indexOf('/bmw_prod/') + 10;
    dynamicOptionScript = dynamicOptionScript + 'bmw_prod/';
  } else {
    countryStartIdx = curUrl.indexOf("/", curUrl.indexOf("://")+3) + 1;
  }
  if(typeof confCountryTopic!='undefined' && confCountryTopic!=null && typeof confLanguageTopic!='undefined' && confLanguageTopic!=null) {
    dynamicOptionScript = dynamicOptionScript + confCountryTopic + "/" + confLanguageTopic + "/";
  } else {
	var countryEndIdx = curUrl.indexOf("/", countryStartIdx+1);
	countryEndIdx = curUrl.indexOf("/", countryEndIdx+1) + 1;
	dynamicOptionScript = dynamicOptionScript+ curUrl.substring(countryStartIdx,countryEndIdx);
  }  
  dynamicOptionScript = dynamicOptionScript +selectIds[formField]+"/"+parentValue+"/optionGroups.js";
  return dynamicOptionScript;
}

function submitForm( actionName ){
  document.forms[ 0 ].elements[ 'action_name' ].value = actionName;
  document.forms[ 0 ].submit();        
  return false;
}
function renderRadioButtonSelect( elem ) {
  document.write( writeRadioList( elem.name, elem.options, elem.getAttribute( 'zIndex' ), elem.elementValue, true, elem.hasError, elem.isReadonly, elem.getAttribute( 'class' ) ) );
}
function renderDropSelect( elem ) {
  var checkNotify = false;
  if ( ( typeof dependingSelects != 'undefined' && dependingSelects[ elem.name ] ) || ( typeof behaveDependOn != 'undefined' && behaveDependOn[ elem.name ] ) ) {
    checkNotify = true;
  }
  if ( elem.defaultText != "" ) {
		elem.options.unshift( "" );
		elem.options.unshift( elem.defaultText );
  }
  var selectHeight=elem.getOptionCount();
  if ( selectHeight > 10 ) selectHeight = 10;
  if ( selectHeight < 1 ) selectHeight = 1;
  
  var selectWidth = 289;

  var selectedValue = elem.elementValue;
  if ( elem.elementValue == "" ) {
    selectedValue = elem.defaultText;
  }
  selectIds[elem.name]=elem.id;
  document.write( writeSelectBox( elem.name, elem.options, elem.getAttribute( 'zIndex' ), selectWidth, selectHeight, selectedValue, checkNotify,elem.hasError,elem.isReadonly, null, elem.getAttribute( 'class' ) ) );
}
function renderCheckSelect( elem ) {
  var checkNotify = false;
  if ( ( typeof dependingSelects != 'undefined' && dependingSelects[ elem.name ] ) || ( typeof behaveDependOn != 'undefined' && behaveDependOn[ elem.name ] ) ) {
    checkNotify = true;
  }

  var selectWidth;
  if ( elem.getAttribute( 'class' ) != null && elem.getAttribute( 'class' ).indexOf( 'default' ) != -1 ){
    selectWidth = 289;
  } else {
    selectWidth = 289;
  }

  var idx=0;
  for( var i=1; i<elem.options.length ; i=i+2) {
  	var iterName = elem.name + "_" + idx;
  	var iterValue = "";
  	var isChecked = false;
  	for( var j=0; j<elem.elementValues.length; j++) {
  		if (elem.elementValues[j] == elem.options[i]) {
  			iterValue = elem.options[i];
  			isChecked = true;
  		}
  	}
    formElements[ iterName ]  = new Array( "", elem.options[i], iterValue , idx);
    checkboxCounter ++;
    
    document.write( getCheckboxHTML( iterName, elem.options[i-1], "", elem.options[i], isChecked, elem.name, checkboxCounter, elem.getAttribute( 'zIndex' ), selectWidth, checkNotify, elem.hasError, elem.getAttribute( 'class' ), false, elem.isReadonly ) );
    //document.write("<br />");
    idx++;
  }
}
var checkboxCounter = 0;
function renderCheckbox( elem ) {
  formElements[ elem.name ]  = new Array( elem.options[1], elem.options[3], elem.elementValue );
  checkboxCounter ++;
  var checkNotify = "false";
  if ( typeof behaviours != 'undefined' && behaveDependOn[ elem.name ] ) {
    checkNotify = "true";
  }
  var boxWidth;
  if ( elem.getAttribute( 'class' ) != null && elem.getAttribute( 'class' ).indexOf( 'default' ) != -1 ){
    boxWidth = 289;
  } else {
    boxWidth = 289;
  }
  var isChecked = false;
  if ( elem.options[ 3 ] == elem.elementValue ){
    isChecked = true;
  }
  document.write( getCheckboxHTML( elem.name, elem.elementLabel, elem.options[1], elem.options[3], isChecked, elem.name, checkboxCounter, elem.getAttribute( 'zIndex' ), boxWidth, checkNotify, elem.hasError, elem.getAttribute( 'class' ), true, elem.isReadonly ) );
}
function renderButton( elem ){
  document.write( writeButton( elem.id, elem.name, elem.getAttribute( 'class' ), elem.elementValue, elem.defaultText ) );
}
function renderLinkButton( elem ){
  document.write( writeLinkButton( elem.id, elem.name, elem.getAttribute( 'class' ), elem.elementValue, elem.defaultText ) );
}
function handleSections ( elemName ) {
  var sectionDependant, sectionHandler;
  if ( typeof behaviours != 'undefined' && sectionsBehaveDependOn[ elemName ] ) {
    for ( var i = 0; i < sectionsBehaveDependOn[ elemName ].length; i++) {
      if ( sectionBehaviours[ sectionsBehaveDependOn[ elemName ][ i ] ] ) {
        for ( var e = 0; e < sectionBehaviours[ sectionsBehaveDependOn[ elemName ][ i ] ].length; e++ ) {
          if ( sectionBehaviours[ sectionsBehaveDependOn[ elemName ][ i ] ][ e ][ 2 ] == 0 ) {
            setVisibility( "section_" + sectionsBehaveDependOn[ elemName ][ i ], null, 'none' );
          } else {
            setVisibility( "section_" + sectionsBehaveDependOn[ elemName ][ i ], null, 'block' );
          }
        } 
      }
    }
  }
}
var a = 0, u = 0;
var breakDisplay = "";
var breakVisibility = "";
var breakMandatory = "";
function handleBehaviours ( elemName, token ) {
  if ( typeof behaviours != 'undefined' ) {
    handleSections( elemName );
    if ( behaveDependOn[ elemName ] ) {
      for ( var a = 0; a < behaveDependOn[ elemName ].length; a++ ) {
        parentElement = behaveDependOn[ elemName ][ a ];
        if ( behaviours[ parentElement ][ 0 ].length > 0 ) {
          handleDisplay( parentElement, behaviours[ parentElement ][ 0 ], token );
        }
        if ( behaviours[ parentElement ][ 1 ].length > 0) {
          handleVisibility ( parentElement, behaviours[ parentElement ][ 1 ] );
        }
        if ( behaviours[parentElement][2].length > 0 ) {
          handleMandatory ( parentElement, behaviours[ parentElement ][ 2 ] )
        }
      }
    }
  }
}
function isBehaviourActive( behaviourDef ) {
  if ( behaviourDef[ 1 ] == null ) return false;
  var elem = document.forms[ 0 ].elements[ behaviourDef[ 0 ] ];
  if (! elem) return false;
  if ( behaviourDef.length > 3 && behaviourDef[ 3 ] == 'notequal' ) {
    if (elem.length) {
      if (behaviourDef[ 1 ] == "") {
        for( var i=0; i < elem.length; i++) {
      	  if (elem[i].value != behaviourDef[ 1 ]) {
      	    return true;
      	  }
        }
        return false;
      } else {
      	for( var i=0; i < elem.length; i++) {
      	  if (elem[i].value == behaviourDef[ 1 ]) {
      	    return false;
      	  }
        }
        return true;
      }
    } else {
      return elem.value != behaviourDef[ 1 ];
    }
  } else {
    if (elem.length) {
      if (behaviourDef[ 1 ] == "") {
        for( var i=0; i < elem.length; i++) {
      	  if (elem[i].value != behaviourDef[ 1 ]) {
      	    return false;
      	  }
        }
        return true;
      } else {
      	for( var i=0; i < elem.length; i++) {
      	  if (elem[i].value == behaviourDef[ 1 ]) {
      	    return true;
      	  }
        }
        return false;
      }
    } else {
      return elem.value == behaviourDef[ 1 ];
    }
  }
}
function handleDisplay ( parentElement, displayArray, token ) {
  if ( typeof document.forms[ 0 ].elements[ parentElement ] == 'object' ) {
    for ( var i = displayArray.length -1; i >= 0 ; i-- ) {
      if ( typeof document.forms[ 0 ].elements[ displayArray[ i ][ 0 ] ] != 'undefined' ) {
        if ( breakDisplay != parentElement && isBehaviourActive( displayArray[ i ] ) ) {
          displayMode = displayArray[ i ][ 2 ];
          switchDisplayMode ( displayMode, parentElement, displayArray[ i ][ 0 ], token );
          breakDisplay = parentElement;
        } else if ( breakDisplay != parentElement && displayArray[ i ][ 1 ] == null ) {
          displayMode = displayArray[ i ][ 2 ];
          switchDisplayMode ( displayMode, parentElement, displayArray[ i ][ 0 ], token );
        }
      }
    }
  }
  breakDisplay = "";
}
function switchDisplayMode ( displayMode, parentElement, displayArrayElement, token ) {
  switch ( displayMode ) {
    case 0:
      handleDisplayTextBehaviour( parentElement, displayArrayElement );
    break;
    case 1:
      handleDisplayReadonlyBehaviour ( parentElement, displayArrayElement, token );
    break;
    case 2:
      handleDisplayEditBehaviour( parentElement, displayArrayElement, token );
    break;
  }
}
function handleDisplayTextBehaviour ( parentElement, controlElement ) {
  writeIntoLayer( parentElement, document.forms[ 0 ].elements[ controlElement ].value );
}
function handleDisplayReadonlyBehaviour ( parentElement, controlElement, imageId ) {
  if ( document.forms[ 0 ].elements[ parentElement ].type == "hidden" && ( typeof document.getElementsByTagName( "div" )[ parentElement ] != 'undefined' ) ) {
    var checkElem;
    for ( checkElem in formElements ) {
      if ( parentElement == checkElem ) {
        checkReadOnly.push( parentElement );
        if ( formElements[ parentElement ][ 2 ] != formElements[ parentElement ][ 1 ] ) {
          document.images[imageId].src = checkboxDisabledGif;
        } else {
          document.images[imageId].src = checkboxDisabledGifHigh;
        }
      }
    }
  }
  if ( typeof document.forms[ 0 ].elements[ parentElement ] == 'object' ) {
    if ( document.forms[ 0 ].elements[ parentElement ].type != 'hidden' ) {
      document.forms[ 0 ].elements[ parentElement ].setAttribute( "readOnly", "readonly" );
      objectAddCSSClass( parentElement, 'disabled');
    }
  }
}
function handleDisplayEditBehaviour ( parentElement, controlElement, imageId ) {
  var checkElem;
  for ( checkElem in formElements ) {
    if ( parentElement == checkElem ) {
      if (formElements[ parentElement ][ 2 ] != formElements[ parentElement ][ 1 ]) {
        document.images[ imageId ].src = checkboxGif;
      } else{
        document.images[ imageId ].src = checkboxGifHigh;
      }
    }
  }
  document.forms[ 0 ].elements[ parentElement ].readonly = false;
  setClassName( document.forms[ 0 ].elements[ parentElement ], 'input100' );
}
function handleVisibility ( parentElement, displayArray ) {
  if ( document.getElementById( "element_" + parentElement ) ) {
    for ( var i = displayArray.length -1; i >= 0 ; i-- ) {
      if ( typeof document.forms[ 0 ].elements[ displayArray[ i ][ 0 ] ] != 'undefined' ) {
        if ( breakVisibility != parentElement && isBehaviourActive( displayArray[ i ] ) ) {
          visibilityMode = displayArray[ i ][ 2 ];
          switchVisibilityMode ( visibilityMode, parentElement, displayArray[ i ][ 0 ] );
          breakVisibility = parentElement;
        } else if ( breakVisibility != parentElement && displayArray[ i ][ 1 ] == null ) {
          visibilityMode = displayArray[ i ][ 2 ];
          switchVisibilityMode ( visibilityMode, parentElement, displayArray[ i ][ 0 ] );
        }
      }
    }
  }
  breakVisibility = "";
}
function switchVisibilityMode ( visibilityMode, parentElement ) {
  switch ( visibilityMode ) {
    case 0:
      objectAddCSSClass( parentElement, 'hidden' );
    break;
    case 1:
      objectRemoveCSSClass( parentElement, 'hidden' );
    break;
  }
}
function handleMandatory ( parentElement, displayArray ) {
  if (typeof document.forms[ 0 ].elements[ parentElement ] == 'object') {
    for ( var i = displayArray.length -1; i >= 0 ; i-- ) {
      if (typeof document.forms[ 0 ].elements[ displayArray[ i ][ 0 ] ] != 'undefined') {
        if ( breakMandatory != parentElement && isBehaviourActive( displayArray[ i ] )) {
          mandatoryMode = displayArray[ i ][ 2 ];
          switchMandatoryMode ( mandatoryMode, parentElement, displayArray[ i ][ 0 ] );
          breakMandatory = parentElement;
        } else if ( breakMandatory != parentElement && displayArray[ i ][ 1 ] == null ) {
          mandatoryMode = displayArray[ i ][ 2 ];
          switchMandatoryMode ( mandatoryMode, parentElement, displayArray[ i ][ 0 ]);
        }
      }
    }
  }
  breakMandatory = "";
}
function switchMandatoryMode ( mandatoryMode, parentElement ) {
  switch ( mandatoryMode ) {
    case 0:
      objectRemoveCSSClass( parentElement, 'mandatory' );
    break;
    case 1:
      objectAddCSSClass( parentElement, 'mandatory' );
    break;
  }
}
function notifyValue(elemName, curValue) {
  handleBehaviours(elemName);
}
function checkEmptySelects () {
  if ( typeof dependingSelects != 'undefined' ) {
    if ( typeof document.forms[ 0 ] != 'undefined' ){
      var currentDependant;
      for ( currentDependant in dependingSelects ) {
        for( var i=0; i < dependingSelects[ currentDependant ].length; i++ ){
          if( ( typeof window[ "fe_" + dependingSelects[ currentDependant ][ i ] ] != "undefined" ) && document.forms[ 0 ][ currentDependant ] && document.forms[ 0 ][ currentDependant ].value == window[ "fe_" + currentDependant ].options[ 0 ] ){
            setVisibility( 'element_' + dependingSelects[ currentDependant ][ i ], null, 'none' );
          }
          if( ( typeof window[ "fe_" + dependingSelects[ currentDependant ][ i ] ] != "undefined" ) && ( typeof window[ "fe_" + dependingSelects[ currentDependant ][ i ] ].options[ 2 ] != "string" ) ){
            setVisibility( 'element_' + dependingSelects[ currentDependant ][ i ], null, 'none' );
          }
        }
      }
    } else {
      window.setTimeout( 'dependingSelects()', 500 );
    }
  }
}

