// NimaSystems LTD - Plovdiv
// http://www.nimasystems.com
// +   original by: Yordan Lazarov and Martin Kovachev 
	 
function $(name) {
		return document.getElementById(name);
	}
	
if(typeof(DOMParser) == 'undefined') {
 DOMParser = function() {}
 DOMParser.prototype.parseFromString = function(str, contentType) {
  if(typeof(ActiveXObject) != 'undefined') {
	  
   var xmldata = new ActiveXObject('MSXML2.DOMDocument');
   xmldata.async = false;
   xmldata.loadXML(str);
   return xmldata;
  } else if(typeof(XMLHttpRequest) != 'undefined') {
   var xmldata = new XMLHttpRequest;
   if(!contentType) {
    contentType = 'application/xml';
   }
   xmldata.open('GET', 'data:' + contentType + ';charset=utf-8,' + encodeURIComponent(str), false);
   if(xmldata.overrideMimeType) {
    xmldata.overrideMimeType(contentType);
   }
   xmldata.send(null);
   return xmldata.responseXML;
  }
 }
}

var formValidator = {
	__form_object : new Object,
	__forms_data : new Array(),
	__loading_message : '<span class="loading">loading....</span>',
	__message_timeout : 2000,
	__message_fadeopacity : 90,
	__message_hideform : 0,
	__redirect : 1,
	htmlspecialchars : function(encodedHtml) {
		 encodedHtml = escape(encodedHtml);
		 encodedHtml = encodedHtml.replace(/\//g,"%2F");
		 encodedHtml = encodedHtml.replace(/\?/g,"%3F");
		 encodedHtml = encodedHtml.replace(/=/g,"%3D");
		 encodedHtml = encodedHtml.replace(/&/g,"%26");
		 encodedHtml = encodedHtml.replace(/@/g,"%40");
		 return encodedHtml
  	 },
	getElementsByTagNames : function(list,obj) {
        if (!obj) var obj = document;
        var tagNames = list.split(',');
        var resultArray = new Array();
        for (var i=0;i<tagNames.length;i++)
        {
                var tags = obj.getElementsByTagName(tagNames[i]);
                for (var j=0;j<tags.length;j++)
                {
                        resultArray.push(tags[j]);
                }
        }
        var testNode = resultArray[0];
        if (testNode.sourceIndex)
        {
                resultArray.sort(function (a,b) {
                                return a.sourceIndex - b.sourceIndex;
                });
        }
        else if (testNode.compareDocumentPosition)
        {
                resultArray.sort(function (a,b) {
                                return 3 - (a.compareDocumentPosition(b) & 6);
                });
        }
        return resultArray;
	},
	array_keys : function( input, search_value, strict ) {
		var tmp_arr = new Array(), strict = !!strict, include = true, cnt = 0;
	 
		for ( key in input ){
			include = true;
			if ( search_value != undefined ) {
				if( strict && input[key] !== search_value ){
					include = false;
				} else if( input[key] != search_value ){
					include = false;
				}
			}
	 
			if( include ) {
				tmp_arr[cnt] = key;
				cnt++;
			}
		}
	 
		return tmp_arr;
	}, 
	
	inArray : function(needle, haystack, strict) {

		var found = false, key, strict = !!strict;
	 
		for (key in haystack) {
			if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
				found = true;
				break;
			}
		}
	 
		return found;
	},
	eventMessageFade: function(message_id, opac, dont_remove) {
		var passed = parseInt(opac);
		var newOpac = parseInt(passed+10);
		if ( newOpac < formValidator.__message_fadeopacity) {
			$(message_id).style.opacity = '.'+newOpac;
			$(message_id).style.filter = "alpha(opacity:"+newOpac+")";
			opacityID = window.setTimeout("formValidator.eventMessageFade('"+message_id+"', '"+newOpac+"')", 20);
		}
		else { 
			if($(message_id) != undefined) {
				//$(message_id).style.opacity = '.'+(formValidator.__message_fadeopacity/100);
				//$(message_id).style.filter = "alpha(opacity:"+formValidator.__message_fadeopacity+")";
				if(!parseInt(formValidator.__message_hideform)) {
					
					removeID = window.setTimeout("formValidator.eventMessageRemove('"+message_id+"', "+formValidator.__message_fadeopacity+")",formValidator.__message_timeout); 
				} else { $(message_id).nextSibling.style.visibility = 'hidden'; }
			}
		}
	},
	eventMessageRemove: function(message_id, opac) {
		var passed = parseInt(opac);
		var newOpac = parseInt(passed-10);
		if ( newOpac > 0 ) {
			$(message_id).style.opacity = '.'+newOpac;
			$(message_id).style.filter = "alpha(opacity:"+newOpac+")";
			opacityID = window.setTimeout("formValidator.eventMessageRemove('"+message_id+"', '"+newOpac+"')",20);
		}
		else { 
			$(message_id).parentNode.removeChild($(message_id));
			formValidator.__redirect = 1;
		}
	},
	//exec javascript script
	execScript : function(script) {
		if(script) {
			//alert(script);
			var execute = function() { eval(script); }
			execute.onerror = alert;
			execute();
			
		}
	},
	redirectURL : function(url) {
		
		if(!formValidator.__redirect) { setTimeout("formValidator.redirectURL('"+url+"')", 10); return false; }
		if(url) {
		 	location.href = url;
		}
	},
	showEventMessage : function(form_obj, formMessage, dont_remove) {
		if(form_obj != undefined && formMessage.length) {
			var message_id = "eventmsg_"+form_obj.getAttribute('name');
			if($(message_id) == undefined) {
				
				var msgObject = document.createElement('div');
					msgObject.innerHTML = formMessage;
					msgObject.className = 'eventFormRequired';
					msgObject.style.position = 'absolute';
					msgObject.style.width = form_obj.offsetWidth + "px";
					msgObject.style.height = form_obj.offsetHeight + "px";
					msgObject.style.backgroundColor = '#ffffff';
					msgObject.style.opacity = '.0';
					msgObject.style.filter = "alpha(opacity:0)";
					msgObject.style.zIndex = 999;
					msgObject.setAttribute("id", message_id)
				form_obj.parentNode.insertBefore(msgObject, form_obj);
				formValidator.eventMessageFade(message_id, 10, dont_remove);
			}
		}
	},
	getElementDomObj : function(obj, element_id, field) {
		//alert(obj);
		if(obj[element_id] != undefined) { 
			return obj[element_id].getElementsByTagName(field)[0].firstChild.nodeValue;
		} 
	},
	validateFields : function(form_obj, xmlDoc) {
		formname = form_obj.getAttribute('name');
		
		var globalError = 0;
		var interator = (new DOMParser()).parseFromString(xmlDoc, "text/xml");
		//GET METADATA
		var metadata = interator.getElementsByTagName('metadata');
		if(this.getElementDomObj(metadata, 0, 'globalmessage')) var globalMessage = this.getElementDomObj(metadata, 0, 'globalmessage'); else var globalMessage = "";
		if(this.getElementDomObj(metadata, 0, 'result')) var globalResult = parseInt(this.getElementDomObj(metadata, 0, 'result')); else var globalResult = "";
		if(this.getElementDomObj(metadata, 0, 'javascriptfunc')) var globalScript =this.getElementDomObj(metadata, 0, 'javascriptfunc'); else var globalScript = "";
		if(this.getElementDomObj(metadata, 0, 'redirecturl')) var globalRedirect = this.getElementDomObj(metadata, 0, 'redirecturl'); else var globalRedirect = "";
		if(this.getElementDomObj(metadata, 0, 'exectimeout')) var globalTimeout = this.getElementDomObj(metadata, 0, 'exectimeout'); else var globalTimeout = "";
		if(this.getElementDomObj(metadata, 0, 'fadeopacity')) var globalFadeOpacity = this.getElementDomObj(metadata, 0, 'fadeopacity'); else var globalFadeOpacity = "";
		if(this.getElementDomObj(metadata, 0, 'hideform')) var globalHideForm = this.getElementDomObj(metadata, 0, 'hideform'); else var globalHideForm = "";
		
		if(globalTimeout.length) formValidator.__message_timeout = globalTimeout * 1000;
		if(globalFadeOpacity.length) formValidator.__message_fadeopacity = globalFadeOpacity
		if(globalHideForm.length) formValidator.__message_hideform = globalHideForm
		//alert(globalTimeout);
		//GET FIELDS
		var elements = new Array();
		var fields_root = interator.getElementsByTagName('field');
		if(!fields_root.length) { globalError++; }
		for(i=0; i<fields_root.length; i++) {
			//alert(root[i].getElementsByTagName("msg").length);
			var	field_name = fields_root[i].getElementsByTagName("name")[0].firstChild.nodeValue;
			if(this.getElementDomObj(fields_root, i, 'msg')) var field_msg = this.getElementDomObj(fields_root, i, 'msg'); else var field_msg = '';
			if(this.getElementDomObj(fields_root, i, 'value')) var field_value = this.getElementDomObj(fields_root, i, 'value'); else var field_value = '';
			//alert(field_valid);
			elements[field_name] = new Array();
			elements[field_name][0] = field_msg;
			elements[field_name][1] = field_value;
			
			//alert(field_name);
		}
		//SHOW ERROR LOG IF HAVE ERROR
		if(globalError) { 
			//alert(globalError);
			formValidator.__message_hideform = 1;
			formValidator.showEventMessage(form_obj, (xmlDoc));
			return false;
		}
		var elementsNames = formValidator.array_keys(elements);
		var inputs = formValidator.getElementsByTagNames('input,select,textarea', form_obj);
		//var selects = form_obj.getElementsByTagName('select');
		//	inputs += selects;
		var error = 0;
		for(i=0; i<inputs.length; i++) {
						
			var input_name = inputs[i].getAttribute('name');
			if(formValidator.inArray(input_name, elementsNames)) {
				//set field value
				inputs[i].value = elements[input_name][1];
				
				var requiredMsg_id = "req_"+input_name+"_"+formname+"_"+i 				
				if(elements[input_name][0].length) {
					//inputs[i].className = "requiredField";
					inputs[i].style.backgroundColor = "#FFECEC";
					if($(requiredMsg_id) == undefined) {
						var requiredMsg = document.createElement('div');
						requiredMsg.innerHTML = elements[input_name][0];
						requiredMsg.setAttribute("id", requiredMsg_id);
						requiredMsg.className = "requiredMsg";
						inputs[i].parentNode.insertBefore(requiredMsg, inputs[i].nextSibling); 
					} else {
						$(requiredMsg_id).innerHTML = elements[input_name][0];
					}
					error++;
					//inputs[i].appendChild(requiredMsg);
					//alert(elements[input_name][1]);
				} else {
					//inputs[i].className = "inputField";
					inputs[i].style.backgroundColor = "";
					if($(requiredMsg_id) != undefined) {
						inputs[i].parentNode.removeChild($(requiredMsg_id));
					}
				}
				
				
			}
			//enable submit buttons
			if(inputs[i].getAttribute('type') == 'submit') inputs[i].disabled = false;
		}
	
		if(globalResult) {
			if(globalMessage.length) { formValidator.showEventMessage(form_obj, globalMessage); }
			if(globalScript.length)	 { formValidator.execScript(globalScript); }
		} else {
			if(globalMessage.length)  { formValidator.__redirect = 0; formValidator.showEventMessage(form_obj, globalMessage); }
			if(globalScript.length)	  { formValidator.execScript(globalScript); }
			if(globalRedirect.length) { formValidator.redirectURL(globalRedirect); globalResult = 1; }
		}
		

		
		if(globalResult || error) {
			return false;	
		} else {
			formValidator.showEventMessage(form_obj, new Array(formValidator.__loading_message));
			form_obj.submit();
		}
		
	},
	createAjaxObject : function() { 
		var http_request = false;
						 
			 try {
				  http_request = new XMLHttpRequest;
				}
				catch(e) {
					  var msxml = [
						'MSXML2.XMLHTTP.3.0',
						'MSXML2.XMLHTTP',
						'Microsoft.XMLHTTP'
					  ];
					  for (var i=0, len = msxml.length; i <len; ++i) {
						try {
						  http_request = new ActiveXObject(msxml[i]);
						 
						  break;
						}
						catch(e) {}
					  }
					}

			
		  if (!http_request) {
			 return false;
		  }
		return http_request;
	},
	validateForms : function () {
		formValidator.__form_object = new Object();
		var html_forms = document.getElementsByTagName('form');
		
		for(f=0; f<html_forms.length; f++) {
			var class_name = html_forms[f].className;
			if(class_name != undefined) {
				if(class_name.indexOf("req") != -1) {
					
					html_forms[f].onsubmit = function() {
						var parameters = formValidator.getFormParams(this);
						
						var http_request = formValidator.createAjaxObject();
						 
						 formValidator.__form_object = this;
						 
						 http_request.onreadystatechange = function() {
							// alert(formobject);
							if (http_request.readyState == 4) {
								 if (http_request.status == 200) {
									//alert(http_request.responseText);
									result = http_request.responseText;
									//	alert(result);
									$('debug').innerHTML = http_request.responseText;
									
									formValidator.validateFields(formValidator.__form_object, result);
								 } else {
									alert('There was a problem with the request.');
								 }
							}
						 }
						  
						
						  
						  http_request.open('POST', "/formvalidator.php", true);
						  http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
						  http_request.setRequestHeader("Content-length", parameters.length);
						  http_request.setRequestHeader("Connection", "close");
						  http_request.send(parameters);
						  return false;
					}
				}
			}
		}
	},
	setFormFieldName : function(form_name, field, value) {

		if(formValidator.__forms_data[form_name] == undefined) { formValidator.__forms_data[form_name] = new Array(); }
		formValidator.__forms_data[form_name][field] = value;
	},
	getFormParams : function(obj) {
		var formname = obj.getAttribute('name');
		var inputs = formValidator.getElementsByTagNames('input,select,textarea', obj);
		
			var params = new Array();
			var params_strings = new Array();
			for(i=0; i<inputs.length; i++) {
				if(inputs[i].getAttribute('type') == 'checkbox') {
					if(!inputs[i].checked) // inputs[i].value = 0; else inputs[i].value=1;
					{
						continue;	
					}
				}
				if(inputs[i].getAttribute('type') == 'radio') {
					if(!inputs[i].checked) continue;
				}

				param_key = inputs[i].getAttribute('name')
				if(inputs[i].nodeName.toLowerCase() == 'select') {
					field_value = inputs[i].options[inputs[i].selectedIndex].value; 
					param_val = field_value;												 
				} else {
					param_val = inputs[i].value;
				}
				
				params[param_key] = param_val;
				params_strings[i] = param_key+"="+param_val;
				//set form field info
				
				//disable submit buttons
				if(inputs[i].getAttribute('type') == 'submit') inputs[i].disabled = true;
				
			}	
			
			return params_strings.join("&")+"&__formname__="+formname+"&__url__="+escape(location.href);
	}
	
}
