no_redirect = false;
form_already_submitted = false;
changed_fields = new Array();
error = false;

document._getElementById = document.getElementById;
document.getElementById = function(id) {
   element = document._getElementById(id);
   if(element && element.id != id && document.all) {
      element = document.all[id];
      if(element.length) {
         for(i = 0; i < element.length; ++i) {
            if(element[i].id == id) {
               element = element[i];
               break;
            }
         }
      }
   }
   return element;
}

document._getElementsByClassName = document.getElementsByClassName;
document.getElementsByClassName = function(className, tag, elm) {
   testClass = new RegExp('(^|\\s)' + className + '(\\s|$)');
   tag = tag || '*';
   elm = elm || document;
   elements = (tag == '*' && elm.all) ? elm.all : elm.getElementsByTagName(tag);
   returnElements = [];
   for(j = 0; j < elements.length; j++) {
      if(testClass.test(elements[j].className))
         returnElements.push(elements[j]);
   }
   return returnElements;
}

Function.prototype.defaults = function() {
  var _f = this;
  var _a = Array(_f.length-arguments.length).concat(Array.prototype.slice.apply(arguments));
  return function() {
    return _f.apply(_f, Array.prototype.slice.apply(arguments).concat(_a.slice(arguments.length, _a.length)));
  }
}

document.getElementsByNamePart = function(field, search, form) {
   result = new Array();

   for(element_id = 0; element_id < document.getElementById(form).elements.length; ++element_id) {
      if(document.getElementById(form).elements[element_id].name)
         if(document.getElementById(form).elements[element_id].name.replace(search, '') == field && document.getElementById(form).elements[element_id].name != field)
            result.push(document.getElementById(form).elements[element_id]);
   }

   return result;
}.defaults('form');

Array.prototype.size = function() {
   size = 0;
   for(element in this)
      ++size;
   return size;
}

function isset(variable) {
   return (typeof variable != 'undefined' && variable !== null);
}

function is_variable(variable) {
   return (typeof window[variable] != 'undefined');
}

function is_int(mixed_var) {
   var y = parseInt(mixed_var * 1);

   if(isNaN(y)) {
      return false;
   }

   return mixed_var == y && mixed_var.toString() == y.toString();
}

function is_array(variable) {
   return (typeof(variable) == 'object');
}

function in_array(needle, haystack) {
   return(typeof(haystack[needle]) != 'undefined');
}

function trim(string) {
	return string.replace(/^\s+|\s+$/g, '');
}

function strpos(haystack, needle, offset) {
   var i = haystack.indexOf(needle, offset);
   return i >= 0 ? i : false;
}

function strrpos(haystack, needle, offset) {
   var i = haystack.lastIndexOf(needle, offset);
   return i >= 0 ? i : false;
}

var array_search = function(needle, haystack, strict) {
   var strict = !!strict;

   for(var key in haystack){
      if((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)){
         return key;
      }
   }

   return false;
}.defaults(false);

function getCaretPosition(input) {
   if(input.selectionStart || input.selectionStart == '0') // Opera, Firefox
      return input.selectionStart;
   else if(document.selection) { // Internet Explorer
      position = document.selection.createRange().duplicate().moveStart('character', -input.value.length) * -1;

      return position;
   } else
      return false
}

function setCaretPosition(input, position) {
   if(input.selectionStart || input.selectionStart == '0') {
      input.setSelectionRange(position, position);
   } else if(document.selection) {
		range = input.createTextRange();
		range.collapse(true);
		range.moveEnd('character', position);
		range.moveStart('character', position);
		range.select();
   }
}

var display_error = function(field, error_display, error_message, error_field) {
   if(error_display.length > 0)
      for(i in error_display) {
         if(i != 'size') {
            if(error_display[i] != '')
               error_display[i] = '_' + error_display[i];
            if(is_variable(field + error_display[i]))
               common_field = field;
            else
               common_field = field.replace(/_\d+$/, '');
            if(is_variable(common_field + error_display[i]) && !document.getElementById('error_' + field + error_display[i])) {
               text = window[common_field + error_display[i]];
               for(message in error_message)
                  while(text.search('{' + message + '}') != -1)
                     text = text.replace('{' + message + '}', error_message[message]);
               document.getElementById(error_field).innerHTML = document.getElementById(error_field).innerHTML + '<span id="error_' + field + error_display[i] + '">' + text + '</span>';
            }
            if(document.getElementById(field + '_header'))
               document.getElementById(field + '_header').className = 'error';

            error = true;
         }
      }
}.defaults('error');

function remove_error(field, error) {
   for(error_type in error) {
      if(error[error_type] != '')
         error[error_type] = '_' + error[error_type];
      if(document.getElementById('error_' + field + error[error_type]))
         document.getElementById('error_' + field + error[error_type]).parentNode.removeChild(document.getElementById('error_' + field + error[error_type]));
   }
   if(document.getElementById(field + '_header'))
      document.getElementById(field + '_header').className = 'no_error';
}

var text_handle = function(field, max_length, min_length, required, error_field) {
   error_display = new Array();
   error_fields = new Array('empty', 'short', 'length', 'unique');
   text = trim(document.getElementById(field).value);
   text_length = text.length;

   error_message = new Array();
   error_message[field + '_length'] = text_length;
   error_message[field + '_max_length'] = max_length;
   error_message[field + '_min_length'] = min_length;
   error_message[field.replace(/_\d+$/, '') + '_length'] = text_length;
   error_message[field.replace(/_\d+$/, '') + '_max_length'] = max_length;
   error_message[field.replace(/_\d+$/, '') + '_min_length'] = min_length;

   if(required && text == '')
      error_display.push('empty');
   else if(min_length != 0 && text_length < min_length && (required || text != ''))
      error_display.push('short');
   else if(max_length != 0 && text_length > max_length)
      error_display.push('length');

   remove_error(field, error_fields);
   display_error(field, error_display, error_message, error_field);

}.defaults(0, 0, true, 'error');

var integer_handle = function(field, sign, required, ignore, error_field) {
   error_display = new Array();
   error_fields = new Array('empty', 'positive', 'negative', 'whole');
   integer = trim(document.getElementById(field).value);

   error_message = new Array();

   if(!ignore) {
      if(required) {
         if(integer.length == 0)
            error_display.push('empty');
         else if(sign == 'positive' && Number(integer) && integer < 0)
            error_display.push('positive');
         else if(sign == 'negative' && Number(integer) && integer > 0)
            error_display.push('negative');
         else if(isNaN(integer) || parseFloat(integer) != parseInt(integer, 10))
            error_display.push('whole');

      } else if(integer.length != 0) {
         if(sign == 'positive' && Number(integer) && integer < 0)
            error_display.push('positive');
         else if(sign == 'negative' && Number(integer) && integer > 0)
            error_display.push('negative');
         else if(isNaN(integer) || parseFloat(integer) != parseInt(integer, 10))
            error_display.push('whole');
      }
   }

   remove_error(field, error_fields);
   display_error(field, error_display, error_message, error_field);
}.defaults('', false, 'error');

var float_handle = function(field, sign, required, ignore, error_field) {
   error_display = new Array();
   error_fields = new Array('empty', 'positive', 'negative', 'number');
   number = trim(document.getElementById(field).value);

   error_message = new Array();

   if(!ignore) {
      if(required) {
         if(number.length == 0)
            error_display.push('empty');
         else if(sign == 'positive' && Number(number) && number < 0)
            error_display.push('positive');
         else if(sign == 'negative' && Number(number) && number > 0)
            error_display.push('negative');
         else if(isNaN(number))
            error_display.push('number');

      } else if(number.length != 0) {
         if(sign == 'positive' && Number(number) && number < 0)
            error_display.push('positive');
         else if(sign == 'negative' && Number(number) && number > 0)
            error_display.push('negative');
         else if(isNaN(number))
            error_display.push('number');
      }
   }

   remove_error(field, error_fields);
   display_error(field, error_display, error_message, error_field);
}.defaults('', false, 'error');

var select_handle = function(field, illegal, error_field) {
   error_display = new Array();
   error_fields = new Array('illegal_option');
   value = document.getElementById(field).value;

   error_message = new Array();
   error_message[field + '_illegal_option'] = document.getElementById(field)[document.getElementById(field).selectedIndex].text;

   if(is_array(illegal)) {
      if(in_array(value, illegal))
         error_display.push('illegal_option');
   } else {
      if(value == illegal)
         error_display.push('illegal_option');
   }

   remove_error(field, error_fields);
   display_error(field, error_display, error_message, error_field);
}.defaults('error');

var date_handle = function(field, time_allowed, required, ignore, error_field) {
   error_display = new Array();
   error_fields = new Array('format', 'year', 'month', 'date', 'time_format', 'hour', 'minute');
   date = trim(document.getElementById(field).value).split('.');
   var time = '';

   error_message = new Array();

   if(!ignore) {
      if(date.length != 3 && (required || date.length != 1 || (date[0] != '' && date[0] != 'Never')))
         error_display.push('format');
      else if(required || date.length != 1 || (date[0] != '' && date[0] != 'Never')) {
         if(isNaN(date[0]) || parseFloat(date[0]) != parseInt(date[0], 10) || date[0] < 1970 || date[0] > 2038) {
            error_display.push('format');
            error_display.push('year');
         }
         if(isNaN(date[1]) || parseFloat(date[1]) != parseInt(date[1], 10) || date[1] < 1 || date[1] > 12) {
            error_display.push('format');
            error_display.push('month');
         }
         if(time_allowed) {
            time = date[2].split(' ');
            if(time.length > 2)
               error_display.push('time_format');
            else if(time.length == 2) {
               date[2] = time[0];
               time = time[1].split(':');
               if(time.length != 2)
                  error_display.push('time_format');
               else {
                  if(isNaN(time[0]) || parseFloat(time[0]) != parseInt(time[0], 10) || time[0] < 0 || time[0] > 23) {
                     error_display.push('time_format');
                     error_display.push('hour');
                  }
                  if(isNaN(time[1]) || parseFloat(time[1]) != parseInt(time[1], 10) || time[1] < 0 || time[1] > 59) {
                     error_display.push('time_format');
                     error_display.push('minute');
                  }
               }

            }
         }
         if(isNaN(date[2]) || parseFloat(date[2]) != parseInt(date[2], 10) || date[2] < 1 || date[2] > 31 || (in_array(date[1], new Array(4, 6, 9, 11)) && date[2] > 30) || (date[1] == 2 && date[2] > 29)) {
            error_display.push('format');
            error_display.push('date');
         }
      }
   }

   remove_error(field, error_fields);
   display_error(field, error_display, error_message, error_field);
}.defaults(true, true, false, 'error');

var compare_handle = function(main_field, field1, field2, condition, max_length, min_length, required, error_field) {
   compare_error = error;
   error = false;
   changed_fields[field1] = true;

   secondary_field = main_field == field1 ? field2 : field1;

   error_display = new Array();
   error_fields = new Array('match');
   if(document.getElementById(main_field).type == 'select-one') {
      main_text = document.getElementById(main_field).selectedIndex;
      secondary_text = document.getElementById(secondary_field).selectedIndex;
   } else {
      main_text = document.getElementById(main_field).value;
      secondary_text = document.getElementById(secondary_field).value;
   }

   error_message = new Array();

   switch(condition) {
      case '>' :
         statement = main_text <= secondary_text;
         break;
      case '>=' :
         statement = main_text < secondary_text;
         break;
      case '=' :
         statement = main_text != secondary_text;
         break;
      case '<=' :
         statement = main_text > secondary_text;
         break;
      case '<' :
         statement = main_text >= secondary_text;
         break;
   }

   remove_error(main_field, error_fields);
   if(changed_fields[field2] && statement) {
      error_display.push('match');
      display_error(main_field, error_display, error_message, error_field);
      if(document.getElementById(main_field).type != 'select-one')
         text_handle(main_field, max_length, min_length, required, error_field);
   } else if(changed_fields[main_field] && document.getElementById(main_field).type != 'select_one')
      text_handle(main_field, max_length, min_length, required, error_field);

   if(error)
      document.getElementById(secondary_field + '_header').className = 'error';
   else {
      document.getElementById(secondary_field + '_header').className = 'no_error';
      error = compare_error;
   }
}.defaults('=', 0, 0, true, 'error');

var combination_handle = function(main_field, field1, field2, max_length, min_length, required, error_field) {
   error2 = false;

   secondary_field = main_field == field1 ? field2 : field1;

   error_display = new Array();
   error_fields = new Array('empty', 'combination');
   error2_fields = new Array('empty', 'short', 'length');
   text1 = document.getElementById(field1).value;
   text2 = document.getElementById(field2).value;

   error_message = new Array();

   remove_error(main_field + '_' + secondary_field, error_fields);
   if(!required && text1 == '' && text2 == '') {
      error_display.push('empty');
      display_error(main_field + '_' + secondary_field, error_display, error_message, error_field);
      text_handle(field1, max_length, min_length, required, error_field);
      document.getElementById(field1 + '_header').className = 'error';
      document.getElementById(field2 + '_header').className = 'error';
   } else {
      text_handle(field1, max_length, min_length, required, error_field);
      for(error_type in error2_fields) {
         if(error2_fields[error_type] != '')
            error2_fields[error_type] = '_' + error2_fields[error_type];
         if(document.getElementById('error_' + field2 + error2_fields[error_type]))
            error2 = true;
      }
      if(!error2)
         document.getElementById(field2 + '_header').className = 'no_error';
   }

}.defaults(0, 0, true, 'error');

var check_handle = function(field, field_search, form, error_field) {
   error_display = new Array();
   error_fields = new Array('select');

   error_message = new Array();

   error_display.push('select');
   if(field_search == '')
      field_array = document.getElementsByName(field)
   else
      field_array = document.getElementsByNamePart(field, field_search, form);

   if(field_search != '')
      if(document.getElementById(field))
         document.getElementById(field).checked = true;

   for(i in field_array) {
      if(field_array[i].checked) {
         remove_error(field, error_fields);
         error_id = array_search('select', error_display);
         if(error_id !== false) {
            delete error_display[error_id];
         }
      } else if(i != 'size' && i != 'length') {
         if(field_search != '')
            if(document.getElementById(field))
               document.getElementById(field).checked = false;
      }
   }

   display_error(field, error_display, error_message, error_field);

}.defaults('', 'form', 'error');

var validate = function(form, error_field) {
   if(typeof(tinyMCE) != 'undefined')
      for(i = 0; i < tinyMCE.editors.length; ++i)
         document.getElementById(tinyMCE.editors[i].editorId).value = tinyMCE.editors[i].getContent();

   error = false;

   if(form_already_submitted) {
      if(!document.getElementById('error_form_submitted'))
         document.getElementById(error_field).innerHTML = document.getElementById(error_field).innerHTML + '<span id="error_form_submitted">' + window['form_submitted'] + '</span>'
      return false;
   }

   form_already_submitted = true;

   for(element_id = 0; element_id < document.getElementById(form).elements.length; ++element_id) {
      if(document.getElementById(form).elements[element_id].onchange && !document.getElementById(form).elements[element_id].id.match(/^mce/)) {
         document.getElementById(form).elements[element_id].onchange();
      }
   }

   if(error) {
      form_already_submitted = false;
      return false;
   }

   return;

}.defaults('form', 'error');

var check_all = function(field, field_search, form) {
   checked = document.getElementById(field).checked;

   field_array = document.getElementsByNamePart(field, field_search);
   for(element_id = 0; element_id < field_array.length; ++element_id) {
      field_array[element_id].checked = checked;
   }
}.defaults('form');

function redirect(page) {
   if(!no_redirect)
      window.location = page;
}

function cancel_form_submission() {
   form_already_submitted = false;
   if(document.getElementById('error_form_submitted'))
      document.getElementById('error_form_submitted').parentNode.removeChild(document.getElementById('error_form_submitted'));
}

function btn_add_new_file() {
   i = 1;
   while(document.getElementById('file_' + i))
      ++i;

   document.getElementById('files').innerHTML += document.getElementById('add_file').value.replace(/{new_file_id}/g, i);
}

function btn_add_new_invoice() {
   i = 1;
   while(document.getElementById('invoice_' + i))
      ++i;

   document.getElementById('invoices').innerHTML += document.getElementById('add_invoice').value.replace(/{new_invoice_id}/g, i);
}

function GetXmlHttpObject() {
   var xmlHttp;
   try {
      xmlHttp = new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
   } catch(e) {
      try {
         xmlHttp = new ActiveXObject('Msxml2.XMLHTTP'); // Internet Explorer 6.0+
      } catch(e) {
         xmlHttp = new ActiveXObject('Microsoft.XMLHTTP'); // Internet Explorer 5.5+
      }
   }
   return xmlHttp;
}

markedSuggestion = -1;
selectedSuggestion = -1;
typedSearch = '';
hiddenSuggestions = true;

var selectSuggestion = function(suggestion, separator) {

   selectedSuggestion = suggestion;
   for(i in document.getElementById('suggestions').childNodes)
      if(document.getElementById('suggestions').childNodes[i] && document.getElementById('suggestions').childNodes[i].className)
         document.getElementById('suggestions').childNodes[i].className = '';
   if(selectedSuggestion == -2) {
      for(i = 0; document.getElementById('suggestion_' + i); ++i) {
      }
      selectedSuggestion = i - 1;
   }
   if(document.getElementById('suggestion_' + selectedSuggestion)) {
      document.getElementById('suggestion_' + selectedSuggestion).className = 'selected';
      searchString = document.getElementById('suggestion_' + selectedSuggestion).firstChild.innerHTML;
   } else {
      searchString = typedSearch;
      selectedSuggestion = -1;
   }

   if(separator != '') {
      if(strrpos(document.getElementById('suggestion_search').value, separator) !== false) {

         position = getCaretPosition(document.getElementById('suggestion_search'));

         if(position !== false) {
            searchStartPos = strrpos(document.getElementById('suggestion_search').value, separator, position - 1);
            searchEndPos = strpos(document.getElementById('suggestion_search').value, separator, position);

            if(searchStartPos !== false)
               ++searchStartPos;

            if(searchEndPos !== false) {

               document.getElementById('suggestion_search').value = document.getElementById('suggestion_search').value.substr(0, searchStartPos) + searchString + document.getElementById('suggestion_search').value.substr(searchEndPos);

               setCaretPosition(document.getElementById('suggestion_search'), searchStartPos + searchString.length);

            } else
               document.getElementById('suggestion_search').value = document.getElementById('suggestion_search').value.substr(0, searchStartPos) + searchString;
         } else
            document.getElementById('suggestion_search').value = document.getElementById('suggestion_search').value.substr(0, strrpos(document.getElementById('suggestion_search').value, separator) + 1) + searchString;

      } else {
         document.getElementById('suggestion_search').value = searchString;
      }
   }

   markedSuggestion = selectedSuggestion;
}.defaults('');

function markSuggestion(suggestion) {
   markedSuggestion = suggestion;
   for(i in document.getElementById('suggestions').childNodes)
      if(document.getElementById('suggestions').childNodes[i] && document.getElementById('suggestions').childNodes[i].className)
         document.getElementById('suggestions').childNodes[i].className = '';

   if(document.getElementById('suggestion_' + markedSuggestion))
      document.getElementById('suggestion_' + markedSuggestion).className = 'selected';
}

function hideSuggestions() {
   markSuggestion(selectedSuggestion);
   document.getElementById('suggestions').style.display = 'none';
   hiddenSuggestions = true;
}

function showSuggestions() {
   if(trim(document.getElementById('suggestions').innerHTML) != '') {
      document.getElementById('suggestions').style.display = 'block';
      hiddenSuggestions = false;
   } else {
      hideSuggestions();
   }
}

function blockKeys(event) {
   var keyCode = event.which ? event.which : event.keyCode;
	switch(keyCode) {
      case 13 : // Enter
      case 38 : // Arrow up
      case 40 : // Arrow down
         if(event.preventDefault)
            event.preventDefault(); // Opera, Firefox
         else
            event.returnValue = false; // Internet Explorer
         break;
	}
}

function loadComponents() {
   components = new Array('imageHandle', 'errorHandle', 'sqlHandle');
   activeComponents = new Array();

   for(i = 0; in_array(i, components); ++i) {
      if(document.getElementsByClassName('com_' + components[i] + '\\([^\\)]*\\)').length > 0)
         activeComponents.push(components[i]);
   }

   for(i = 0; in_array(i, activeComponents); ++i) {
      elm = document.createElement('script');
      elm.src = 'includes/components/' + activeComponents[i] + '/' + activeComponents[i] + '.js';
      elm.type = 'text/javascript';
      document.getElementsByTagName('head')[0].appendChild(elm);
   }
}

document.getElementsByIdPart = function(search) {
   result = new Array();

   for(element_id = 0; element_id < window.elements.length; ++element_id) {
      if(window.elements[element_id].id)
         if(window.elements[element_id].id.substring(0, search.length) == search)
            result.push(window.elements[element_id]);
   }

   return result;
}

function removeFromString(string, remove, separator, separator2) {
   string = string.split(separator);
   if(is_array(remove)) {
      for(i = 0; i < string.length; ++i)
         if(in_array(string[i].substr(0, string[i].indexOf(separator2)), remove))
            string.splice(i, 1);
   } else {
      for(i = 0; i < string.length; ++i)
         if(string[i].substr(0, string[i].indexOf(separator2)) == remove)
            string.splice(i, 1);
   }
   return string.join(separator);
}

function showdyn(pre, elms) {
   elmsHide = document.getElementsByIdPart(pre + '_');
   for(i = 0; i < elmsHide.length; ++i)
      elmsHide[i].style.display = 'none';

   window.location.hash = (window.location.hash.length == 0 ? '' : (removeFromString(window.location.hash.substr(1), pre, ';', ',') == '' ? '' : removeFromString(window.location.hash.substr(1), pre, ';', ',') + ';')) + pre + ','+ elms;

   elms = elms.split(',');
   for(i = 0; i < elms.length; ++i)
      if(isset(document.getElementById(pre + '_' + elms[i])))
         document.getElementById(pre + '_' + elms[i]).style.display = '';
}

function checkHash() {
   if(window.location.hash.length > 1) {
      string = window.location.hash.substr(1).split(';');
      for(j = 0; j < string.length; ++j) {
         if(string[j].indexOf(',') != -1)
            showdyn(string[j].substr(0, string[j].indexOf(',')), string[j].substr(string[j].indexOf(',') + 1));
         else
            showdyn(string[j], '');
      }
   }
}

function checkHashPoll() {
   if(window.elements != undefined) {
      checkHash();
      clearInterval(DOMPoll);
   }
}

function DOMLoadedPoll() {
   DOMPoll = setInterval(checkHashPoll, 50);
}


var soundEmbed = null;
function playSound(element, fileName) {
   if(soundEmbed)
      element.removeChild(soundEmbed);

   if(document.all)
	   soundEmbed = document.createElement("bgsound");
   else {
      soundEmbed = document.createElement("embed");
      soundEmbed.setAttribute("hidden", true);
      soundEmbed.setAttribute("width", 0);
      soundEmbed.setAttribute("height", 0);
   }
   soundEmbed.setAttribute("src", fileName);
   
   element.appendChild(soundEmbed);
}
