var _forms = document.getElementsByTagName('form');
var inputs = new Array();
var selects = new Array();
var labels = new Array();
var radios = new Array();
var radioLabels = new Array();
var checkboxes = new Array();
var checkboxLabels = new Array();
var buttons = new Array();
var selects = new Array();
var all_selects = false;
var active_select = null;
var agt = navigator.userAgent.toLowerCase();
var isMac = is_mac();
var selectText = "please select";
var IN_CFORMS = true;

function is_mac() {
  if (navigator.appVersion.indexOf("Safari") != -1)
  {
    if(!window.getComputedStyle)
    {
      return true;
    }
  }
  
  return false;
}

function initCastomForms() {
  if(!document.getElementById) {return false;}
  getElements();
  separateElements();
  replaceRadios();
  replaceCheckboxes();
  replaceSelects();

  var _selects = document.getElementsByTagName('select');
  var _SelctClassName = [];
  if (_selects) {
    for (var i = 0; i < _selects.length; i++) {
      if (_selects[i].className != '' && _selects[i].className != 'outtaHere')
        _SelctClassName[i] = ' drop-'+_selects[i].className;
    }
    for (var i = 0; i < _SelctClassName.length; i++) {
      var _selectDrop = document.getElementById('optionsDiv'+i);
      if (_selectDrop) {
        if (_SelctClassName[i]) 
          _selectDrop.className += _SelctClassName[i];
      }
    }
  }
}


// getting all the required elements
function getElements() {
  for (var nf = 0; nf < document.getElementsByTagName("form").length; nf++) {
    for(var nfi = 0; nfi < document.forms[nf].getElementsByTagName("input").length; nfi++) {inputs.push(document.forms[nf].getElementsByTagName("input")[nfi]);}
    for(var nfl = 0; nfl < document.forms[nf].getElementsByTagName("label").length; nfl++) {labels.push(document.forms[nf].getElementsByTagName("label")[nfl]);}
    for(var nfs = 0; nfs < document.forms[nf].getElementsByTagName("select").length; nfs++) {selects.push(document.forms[nf].getElementsByTagName("select")[nfs]);}
  }
}

// separating all the elements in their respective arrays
function separateElements() {
  var r = 0; var c = 0; var t = 0; var rl = 0; var cl = 0; var tl = 0; var b = 0;
  for (var q = 0; q < inputs.length; q++) {
    if(inputs[q].type == "radio") {
      radios[r] = inputs[q]; ++r;
      for(var w = 0; w < labels.length; w++) {
        if((inputs[q].id) && labels[w].htmlFor == inputs[q].id)
        {
          radioLabels[rl] = labels[w];
          ++rl;
        }
      }
    }
    if(inputs[q].type == "checkbox") {
      checkboxes[c] = inputs[q]; ++c;
      for(var w = 0; w < labels.length; w++) {
        if((inputs[q].id) && (labels[w].htmlFor == inputs[q].id))
        {
          checkboxLabels[cl] = labels[w];
          ++cl;
        }
      }
    }
    if((inputs[q].type == "submit") || (inputs[q].type == "button")) {
      buttons[b] = inputs[q]; ++b;
    }
  }
}

//replacing radio buttons
function replaceRadios() {
  for (var q = 0; q < radios.length; q++) {
    radios[q].className += " outtaHere";
    var radioArea = document.createElement("div");
    if(radios[q].checked) {
      radioArea.className = "radioAreaChecked";
    }
    else
    {
      radioArea.className = "radioArea";
    }
    radioArea.id = "myRadio_" + radios[q].id;
    radios[q].parentNode.insertBefore(radioArea, radios[q]);
    radios[q]._ra = radioArea;

    radioArea.onclick = new Function('rechangeRadios('+q+')');
    if (radioLabels[q])
    {
      radioLabels[q].onclick = new Function('rechangeRadios('+q+')');
    }
  }
  return true;
}

//checking radios
function checkRadios(who) {
  var what = radios[who]._ra;
  for(var q = 0; q < radios.length; q++) {
    if((radios[q]._ra.className == "radioAreaChecked")&&(radios[q]._ra.nextSibling.name == radios[who].name))
    {
      radios[q]._ra.className = "radioArea";
    }
  }
  what.className = "radioAreaChecked";
}

//changing radios
function changeRadios(who) {
  if(radios[who].checked) {
    for(var q = 0; q < radios.length; q++) {
      if(radios[q].name == radios[who].name) {
        radios[q].checked = false;
      } 
      radios[who].checked = true; 
      checkRadios(who);
    }
  }
}

//rechanging radios
function rechangeRadios(who) {
  if(!radios[who].checked) {
    for(var q = 0; q < radios.length; q++) {
      if(radios[q].name == radios[who].name)  {
        radios[q].checked = false; 
      }
      radios[who].checked = true; 
      checkRadios(who);
    }
    $(radios[who]).trigger('change');
  }
}

//replacing checkboxes
function replaceCheckboxes() {}

//checking checkboxes
function checkCheckboxes(who, action) {
  var what = checkboxes[who]._ca;
  if(action == true) {
    what.className = "checkboxAreaChecked";
    what.checked = true;
  }
  if(action == false) {
    what.className = "checkboxArea";
    what.checked = false;
  }
}

//changing checkboxes
function changeCheckboxes(who) {
  if(checkboxes[who].checked) {
    checkCheckboxes(who, false);
  }
  else {
    checkCheckboxes(who, true);
  } 
}

//rechanging checkboxes
function rechangeCheckboxes(who) {
  var tester = false;
  if(checkboxes[who].checked == true) {
    tester = false;
  }
  else {
    tester = true;
  }
  checkboxes[who].checked = tester;
  checkCheckboxes(who, tester);
}

//check event
function checkEvent(e) {
  if (!e) var e = window.event;
  if(e.keyCode == 32) {for (var q = 0; q < checkboxes.length; q++) {if(this == checkboxes[q]) {changeCheckboxes(q);}}} //check if space is pressed
}


function replaceSelects() {
  for(var q = 0; q < selects.length; q++) {
  if (!selects[q].replaced && selects[q].offsetWidth)
  {
    selects[q]._number = q;
    //create and build div structure
    var selectArea = document.createElement("div");
    var left = document.createElement("span");
    left.className = "left";
    selectArea.appendChild(left);
    
    var disabled = document.createElement("span");
    disabled.className = "disabled";
    selectArea.appendChild(disabled);
    
    selects[q]._disabled = disabled;
    var center = document.createElement("span");
    var button = document.createElement("a");
    var text = document.createTextNode(selectText);
    center.id = "mySelectText"+q;
    
    var stWidth = selects[q].offsetWidth;
    // x1.1 is because of the bold font
    selectArea.style.width = ( stWidth * 1.2 ) + "px";
    if (selects[q].parentNode.className.indexOf("type2") != -1){
      button.href = "javascript:showOptions("+q+",true)";
    } else {
      button.href = "javascript:showOptions("+q+",false)";
    }
    button.className = "selectButton";
    selectArea.className = "selectArea";

    selectArea.className += " " + selects[q].className;
    selectArea.id = "sarea"+q;
    center.className = "center";
    center.appendChild(text);
    selectArea.appendChild(center);
    selectArea.appendChild(button);
    
    //hide the select field
    selects[q].className += " outtaHere";
    //insert select div
    selects[q].parentNode.insertBefore(selectArea, selects[q]);
    //build & place options div

    var optionsDiv = document.createElement("div");

    var optionsList = document.createElement("ul");
    
    optionsDiv.innerHTML = "<div class='select-top'><div></div></div>";
    optionsDiv.appendChild(optionsList);
    
    selects[q]._options = optionsList;
    
    optionsDiv.style.width = stWidth + "px";
    optionsDiv._parent = selectArea;
    
    optionsDiv.className = "optionsDivInvisible";
    optionsDiv.id = "optionsDiv"+q;
  
    populateSelectOptions(selects[q]);
    optionsDiv.innerHTML += "<div class='select-bottom'><div class='select-bottom-left'></div><div class='select-bottom-right'></div></div>";
    document.getElementsByTagName("body")[0].appendChild(optionsDiv);
    selects[q].replaced = true;
    }
  }
  all_selects = true;
}

//collecting select options
function populateSelectOptions(me) {
  me._options.innerHTML = "";
  
  for(var w = 0; w < me.options.length; w++) {
    
    var optionHolder = document.createElement('li');
    var optionLink = document.createElement('a');
    var optionTxt;
    if (me.options[w].title.indexOf('image') != -1) {
      optionTxt = document.createElement('img');
      optionSpan = document.createElement('span');
      optionTxt.src = me.options[w].title;
      optionSpan = document.createTextNode(me.options[w].text);
    } else {
      optionTxt = document.createTextNode(me.options[w].text);
    }
    
    optionLink.href = "javascript:showOptions("+me._number+"); selectMe('"+me.id+"',"+w+","+me._number+");";
    if (me.options[w].title.indexOf('image') != -1) {
      optionLink.appendChild(optionTxt);
      optionLink.appendChild(optionSpan);
    } else {
      optionLink.appendChild(optionTxt);
    }
    optionHolder.appendChild(optionLink);
    me._options.appendChild(optionHolder);
    //check for pre-selected items
    if(me.options[w].selected) {
      selectMe(me.id,w,me._number);
    }
  }
  if (me.disabled) {
    me._disabled.style.display = "block";
  }
  else {
    me._disabled.style.display = "none";
  }
}

//selecting me
function selectMe(selectFieldId,linkNo,selectNo) {
  var changed = false;
  selectField = selects[selectNo];
  for(var k = 0; k < selectField.options.length; k++) {
    if(k==linkNo) {
      if ( selectField.options[k].selected == false ) {
        changed = true;
      }
      selectField.options[k].selected = true;
    }
    else {
      selectField.options[k].selected = false;
    }
  }
  
  //show selected option
  textVar = document.getElementById("mySelectText"+selectNo);
  var newText;
  var optionSpan;
  if (selectField.options[linkNo].title.indexOf('image') != -1) {
    newText = document.createElement('img');
    newText.src = selectField.options[linkNo].title;
    optionSpan = document.createElement('span');
    optionSpan = document.createTextNode(selectField.options[linkNo].text);
  } else {
    newText = document.createTextNode(selectField.options[linkNo].text);
  }
  if (selectField.options[linkNo].title.indexOf('image') != -1) {
    if (textVar.childNodes.length > 1) textVar.removeChild(textVar.childNodes[0]);
    textVar.replaceChild(newText, textVar.childNodes[0]);  
    textVar.appendChild(optionSpan);  
  } else {
    if (textVar.childNodes.length > 1) textVar.removeChild(textVar.childNodes[0]);
    textVar.replaceChild(newText, textVar.childNodes[0]);  
  }
  if (all_selects && changed)
  {
    $(selectField).trigger('change');
  }

}
//showing options
function showOptions(g) {
    _elem = document.getElementById("optionsDiv"+g);
    var divArea = document.getElementById("sarea"+g);
    if (active_select && active_select != _elem) {
      active_select.className = active_select.className.replace('optionsDivVisible','');
      active_select.className += " optionsDivInvisible";
      active_select.style.height = "auto";
    }
    if(_elem.className.indexOf("optionsDivInvisible") != -1) {
      _elem.style.left = "-9999px";
      _elem.style.top = findPosY(divArea) + $(divArea).height() + 'px';
      _elem.className = _elem.className.replace('optionsDivInvisible','');
      _elem.className += " optionsDivVisible";
      _elem.style.left = findPosX(divArea) + 'px';
      
      active_select = _elem;
      if(document.documentElement)
      {
        document.documentElement.onclick = hideSelectOptions;
      }
      else
      {
        window.onclick = hideSelectOptions;
      }
    }
    else if(_elem.className.indexOf("optionsDivVisible") != -1) {
      _elem.style.height = "auto";
      _elem.className = _elem.className.replace('optionsDivVisible','');
      _elem.className += " optionsDivInvisible";
    }
    
}

function hideSelectOptions(e)
{
  if(active_select)
  {
    if(!e) e = window.event;
    var _target = (e.target || e.srcElement);
    if(isElementBefore(_target,'selectArea') == 0 && isElementBefore(_target,'optionsDiv') == 0)
    {
      active_select.className = active_select.className.replace('optionsDivVisible', '');
      active_select.className = active_select.className.replace('optionsDivInvisible', '');
      active_select.className += " optionsDivInvisible";
      active_select = false;

      if(document.documentElement)
      {
        document.documentElement.onclick = function(){};
      }
      else
      {
        window.onclick = null;
      }
    }
  }
}

function isElementBefore(_el,_class)
{
  var _parent = _el;  
  do
  {
    _parent = _parent.parentNode;
  }
  while(_parent && _parent.className != null && _parent.className.indexOf(_class) == -1)
  
  if(_parent.className && _parent.className.indexOf(_class) != -1)
  {
    return 1;
  }
  else
  {
    return 0;
  }
  
}

function findPosY(obj) {
  var posTop = 0;
  while (obj.offsetParent) {posTop += obj.offsetTop; obj = obj.offsetParent;}
  return posTop;
}

function findPosX(obj) {
  var posLeft = 0;
  while (obj.offsetParent) {posLeft += obj.offsetLeft; obj = obj.offsetParent;}
  return posLeft;
}

function checkRadioById( id, checked ) {
  $("#" + id).attr( 'checked', checked ? 'checked' : null );
  if ( checked ) {
    $("#myRadio_" + id).removeClass( 'radioArea' );
    $("#myRadio_" + id).addClass( 'radioAreaChecked' );
  } else {
    $("#myRadio_" + id).removeClass( 'radioAreaChecked' );
    $("#myRadio_" + id).addClass( 'radioArea' );
  }
}


