var shirm = null;
var newLine = 100;
var lastNew = null;
var lastNewLink = null;
var lastDel = null;
var lastAction = null;

function onCompleteFunc(){}
function postUpdatePageEdit(){}
function postUpdatePageNew(){}
function postUpdatePageDel(){}

function openPopUp(url) {
    window.open(url,'searchWindow',"status=0, toolbar=0, menubar=0, resizable=1, scrollbars=1, width=960, height=500");
}

function showQuestion(element, divId, key){
	var pos = Position.cumulativeOffset(element);
	var div = $(divId);
	if(key && div && pos){
		div.style.left = pos[0] + 17 + "px";
		div.style.top = pos[1] + "px";
//		div.style.visibility = "visible";
                div.style.display = "inline";
	}else if(div){
		//div.style.visibility = "hidden";
                div.style.display = "none";
	}
}

function openCloseGroup(obj, onElement, itemArr){
	var form = obj.form;
	var vis = false;
	if(form){
		var field = form[obj.name];
		if(field){
			if(field[onElement] && field[onElement].checked){
				vis = true;
			}
			for(var i = 0; i < itemArr.length; i++){
				if($(itemArr[i])) $(itemArr[i]).style.display = vis?(Prototype.Browser.IE?"block":"table-row"):"none";
			}
		}
	}
}

function openCloseItem(itemId, key){
	if($(itemId)) $(itemId).style.display = key?(Prototype.Browser.IE?"block":"table-row"):"none";
}

function getEditLine(linkObj, idLine, url, action, extHash, extOnCompleteFunc){
	var parameters = "";
	if(extHash){
		for(var i in extHash) parameters += "&" + i + "=" + extHash[i];
		if(parameters.indexOf("&") == 0) parameters = parameters.substring(1);
	}else{
		parameters = Form.serialize(idLine);
	}
	parameters += "&edit_line=" + idLine + "&action=" + action;
	if(action != "back" && !validateserializeString(idLine, parameters)) return;
	addProgress(linkObj, true);
	lastNew = idLine;
	new Ajax.Updater({success: idLine}, url, {method: 'post', evalScripts: true, parameters:parameters, onComplete:action == "back"?onCompleteFunc:extOnCompleteFunc?extOnCompleteFunc:postUpdatePageEdit});
}

function startRequest(){
	if(!shirm){
		shirm = document.createElement("div");
		shirm.id = "shirm";
		shirm.align = "center";
		document.body.insertBefore(shirm, document.body.childNodes[0]);
		shirm.table = document.getElementsByTagName("table")[0];
	}
	if(shirm){
		shirm.style.height = shirm.table.offsetHeight + "px";
		shirm.style.display = "block";
	}
}

function stopRequest(originalRequest){
	if(shirm){
		shirm.style.display = "none";
	}
	if(lastNewLink) addProgress(lastNewLink, false);
	lastNew = null;
	lastNewLink = null;
	lastDel = null;
	lastAction = null;
}

function updatedClasses(trCont){
	var trs = $(trCont).getElementsByTagName("tr");
	var bg = true;
	if(trs.length > 0){
		var start = false;
		for(var i = 0; i < trs.length; i++){
			if(trs[i].id) start = true;
			if(start){
				if(bg) Element.addClassName(trs[i], "bg");
				else Element.removeClassName(trs[i], "bg");
				bg = !bg;
			}
		}
	}
}

function addNewLine(linkObj, idLineNew, url, targ, extOnCompleteFunc){
	newLine++;
	var parameters = Form.serialize(idLineNew);
	parameters += "&edit_line=new_" + newLine + "&action=new";
	if(!validateserializeString(idLineNew, parameters)) return;
	addProgress(linkObj, true);
	lastNew = targ;
	lastNewLink = linkObj;
	new Ajax.Request(url, {method: 'post', evalScripts: true, parameters:parameters, onComplete:(extOnCompleteFunc?extOnCompleteFunc:addnewLineToContainer)});
}

function delLine(linkObj, idLineRemove, url, extHash){
	if(!confirm("Are you sure?")) return;
	addProgress(linkObj, true);
	lastAction = "del";
	lastDel = idLineRemove;
	var parameters = "";
	if(extHash){
		//alert(extHash.toString());
		for(var i in extHash) parameters += "&" + i + "=" + extHash[i];
		if(parameters.indexOf("&") == 0) parameters = parameters.substring(1);
	}
	new Ajax.Request(url, {method: 'post', evalScripts: true, parameters:parameters, onComplete:delLineFromContainer});
}

var progressPic = new Image();
progressPic.src = "/images/indicator.gif";

function addProgress(linkObj, add){
	var img = $(linkObj).getElementsByTagName("img")[0];
	if(img){
		img.style.backgroundImage = "url(" + (add?progressPic.src:"/images/0.gif") + ")";
	}
}

function showProgress(imgId, isShow) {
	var img = $(imgId);
	if(img){
		img.style.backgroundImage = "url(" + (isShow?progressPic.src:"/images/0.gif") + ")";
	}	
}

function addnewLineToContainer(originalRequest){
	var html = originalRequest.responseText;
	html = html.replace("temp_new_line_id", "new_" + newLine);
	if(lastNew && $(lastNew)){
		if($(lastNew).tagName == "TABLE"){
			var trs = $(lastNew).getElementsByTagName("tr");
			lastNew = (trs.length > 0)?trs[trs.length-1]:null;
		}
		if(!lastNew || !Element.hasClassName(lastNew, "bg")) html = html.replace("temp_new_line_class", "bg");
		else if(Element.hasClassName(lastNew, "bg")) html = html.replace("temp_new_line_class", ""); 
		if(lastNew) new Insertion.After(lastNew, html);
		else new Insertion.Top(lastNew, html);
	}
	postUpdatePageNew();
}

function delLineFromContainer(originalRequest){
	if(lastAction == "del" && lastDel && $(lastDel)){
		var parent_ = $(lastDel).parentNode;
		$(lastDel).parentNode.removeChild($(lastDel));
		updatedClasses(parent_);
	}
	postUpdatePageDel();
}

function addContentFromAction(obj, onElement, idContainer, url){
	var form = obj.form;
	if(form){
		var field = form[obj.name];
		if(field){
			if(field[onElement] && field[onElement].checked){
				new Ajax.Updater({success: idContainer}, url, {method: 'post', evalScripts: true});
			}
		}
	}
}

function parseStringToInt(value){
	var reg = new RegExp(",", "g");
	value = value.replace(reg, "");
	return value;
}

function parseIntToString(value, container){
	value = "" + value;
	var newValue = "";
	var count = 0;
	for(var i = value.length; i > 0; i--){
		newValue = value.substring(i-1, i) + newValue;
		if(count%3 == 2) newValue = "," + newValue;
		count++;
	}
	if(newValue.indexOf(",") == 0) newValue = newValue.substring(1);
	if(container && $(container)) $(container).innerHTML = newValue;
	else return newValue;
}

var myGlobalHandlers = {
	onCreate: function(){
		startRequest();
	},

	onComplete: function() {
		if(Ajax.activeRequestCount == 0){
			stopRequest();
		}
	}
};

Ajax.Responders.register(myGlobalHandlers);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                  Validation                                                 //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function validateserializeString(container, paramStr){
	var returnValue = true;
	var maxFieldNameSize = 0; 
	var returnExp = new Array();
	var form = Form.getElements(container);
	if(form){
		for(var i = 0; i < form.length; i++){
		    var oldValue = null;
		    if (form[i].getAttribute("name") == 'val') {
		        oldValue = form[i+1].value;
//		        alert(oldValue);
		    }
		    
			var validFunc = form[i].getAttribute("validFunc");
			var res = null;
			if(validFunc){
				var validFuncExpr = validFunc.split(";");
				if(validFuncExpr.length == 2){
					var typeJoin = typeJoin = "&";
					var funcNames = null;
					if(validFuncExpr[0].indexOf("|") != -1) typeJoin = "|";
					if(typeJoin == "&") funcNames = validFuncExpr[0].split("&");
					if(typeJoin == "|") funcNames = validFuncExpr[0].split("|");
					try{
						for(var j = 0; j < funcNames.length; j++){
							if((funcNames[j].lastIndexOf("(") != -1) && (funcNames[j].lastIndexOf(")") != -1)){
								var extFunc = funcNames[j].substring(0, funcNames[j].lastIndexOf(")"));
								res = eval(extFunc + ", '" + formName + "', '" + form[i].value + "')");
							}else res = eval(funcNames[j] + "('" + form[i].value + "', '"+ oldValue +"')");
							if(res){
								if(validFuncExpr[1].length > maxFieldNameSize) maxFieldNameSize = validFuncExpr[1].length;
								returnExp[returnExp.length] = [validFuncExpr[1], res, form[i]];
								if(typeJoin == "|") break;
							}
						}
					}catch(ex){}
				}
			}
		}
		if(returnExp.length > 0){
			returnValue = false;
			getAlertBox(returnExp, maxFieldNameSize);
		}
	}else alert("Block " + container + " is undefined.");
	return returnValue;
}

function resetFields(container, nameStr){
	var form = Form.getElements(container);
	if(form){
		for(var i = 0; i < form.length; i++){
			if(form[i].name && (nameStr.indexOf("|" + form[i].name + "|") != -1)){
				if(form[i].type.indexOf("select") != -1){
					form[i].selectedIndex = 0;
				}else{
					form[i].value = "";
				}
			}
		}
	}
}

function clearForms(){
	for(var i = 0; i < document.forms.length; i++) document.forms[i].reset();
}

function clearForm(formName){
	var form = document.forms[formName];
	if(form){
		form.reset();
	}else alert("Form " + formName + " is undefined.");
}

function getValidationAndSubmit(formName){
	var maxFieldNameSize = 0; 
	var returnExp = new Array();
	var form = document.forms[formName];
	if(form){
		for(var i = 0; i < form.length; i++){
			var validFunc = form[i].getAttribute("validFunc");
			var res = null;
			if(validFunc){
				var validFuncExpr = validFunc.split(";");
				if(validFuncExpr.length == 2){
					var typeJoin = typeJoin = "&";
					var funcNames = null;
					if(validFuncExpr[0].indexOf("|") != -1) typeJoin = "|";
					if(typeJoin == "&") funcNames = validFuncExpr[0].split("&");
					if(typeJoin == "|") funcNames = validFuncExpr[0].split("|");
					try{
						for(var j = 0; j < funcNames.length; j++){
							if((funcNames[j].lastIndexOf("(") != -1) && (funcNames[j].lastIndexOf(")") != -1)){
								var extFunc = funcNames[j].substring(0, funcNames[j].lastIndexOf(")"));
								res = eval(extFunc + ", '" + formName + "', '" + form[i].value + "')");
							}else res = eval(funcNames[j] + "('" + form[i].value + "')");
							if(res){
								if(validFuncExpr[1].length > maxFieldNameSize) maxFieldNameSize = validFuncExpr[1].length;
								returnExp[returnExp.length] = [validFuncExpr[1], res, form[i]];
								if(typeJoin == "|") break;
							}
						}
					}catch(ex){}
				}
			}
		}
		if(returnExp.length > 0){
			getAlertBox(returnExp, maxFieldNameSize);
		}else form.submit();
	}else alert("Form " + formName + " is undefined.");
}

function trim(s){
  return s.replace(/^\s*/,'').replace(/\s*$/,'');
}

function addSpace(st, end){
	var str = "";
	for(var i = st; i < end; i++) str += "  ";
	return str;
}

var errorDivArray = new Array();

function removeAlertMessages(){
	for(var i = 0; i < errorDivArray.length; i++) {
		errorDivArray[i].parentNode.removeChild(errorDivArray[i]);
	}
	errorDivArray.length = 0;
}

function addAlertMessages(notValid){
	var parentNode = notValid[2].parentNode;
	var errorDiv = document.createElement("div");
	errorDiv.className = "errorMessage";
	parentNode.appendChild(errorDiv); 
	errorDiv.innerHTML = notValid[1];
	errorDivArray[errorDivArray.length] = errorDiv;
}

function getAlertBox(arr, maxSize){
	removeAlertMessages();
	var str = ''//"Not valid field value:\n\n";
	var arrMessages = new Array();
	for(var i = 0; i < arr.length; i++){
//		str += "\"" + arr[i][0] + "\"" + addSpace(arr[i][0].length, maxSize) + "\t" + arr[i][1] + "\n";
		arrMessages[i] = "\"" + arr[i][0] + "\"" + addSpace(arr[i][0].length, maxSize) + "\t" + arr[i][1] + "\n";
		//str += arr[i][1] + "\n";
		//addAlertMessages(arr[i]);
		try{
			if(i == 0) arr[i][2].focus();
		}catch(ex){}
	}
	//AA
	//alert(str);
	showErrors(arrMessages);
	///AA
}

function showErrors(arrMessages) {
    $('error_01').show()
	while (child = $('errors_list').firstChild) {
	   $('errors_list').removeChild(child);
	}
	for (var i=0; i<arrMessages.length; i++) {
        var errorItem = document.createElement("li");
	   //errorItem.innerHtml = str
	   errTextNode = document.createTextNode(arrMessages[i]);
	   errorItem.appendChild(errTextNode);
	
	   $('errors_list').appendChild(errorItem);
	}
}

////////////////////////////////// custom validation functions

function notEmpty(value){
	var res = null;
	if(trim(value) == "") res = "field is empty.";
	return res;
}

function isRealInt(value){
	var res = null;
	if(isNaN(parseInt(value)) || value <= 0) res = "value is not Number.";
	return res;
}

function isInLimit(value){
	return null;
}

function isInLimitTotal(value){
	return null;
}

function validEmail(s){
	s = trim(s);
	if(s == "") return null;
	var strEmail = s;
	if (s.match(/^[,|;][_a-z0-9-]/i) == null){
		strEmail = "," + s;
	}
	regExp = /^(\s*[,|;]\s*[_a-z0-9-]+(\.[_a-z0-9-]+)*@[_a-z0-9-]+(\.[_a-z0-9-]+)*(\.([a-z]){2,4}))*(\s*[,|;]?\s*)?$/i;
	if (strEmail.match(regExp) == null){
		return " - e-mail not valid.";
	} else{
		return null;
	}
}

function equalWithFields(extFieldLabel, extFieldName, formName, value){
	var form = document.forms[formName];
	if(form){
		var extField = form[extFieldName];
		if(extField){
			if(extField.value == value) return null;
			else return " - not equal " + extFieldLabel + " value.";
		}else alert("Field " + extFieldName + " is undefined.");
	}else{
		alert("Form " + formName + " is undefined.");
		return null;
	}
	
}

function checkOnFocusField(obj, str){
	if(obj.value == str) obj.value = "";
}

function checkOnBlurField(obj, str){
	if(trim(obj.value) == "") obj.value = str;
}

function getRemainChar(formName, fieldName, maxLength, targetFieldName){
	var form = document.forms[formName];
	if(form){
		var field = form[fieldName];
		if(field){
			var targetField = form[targetFieldName];
			if(targetField){
				var value = maxLength - field.value.length;
				if(value < 0){
					field.value = field.value.substring(0, maxLength);
				}
				targetField.value = maxLength - field.value.length;
			}else alert("Field " + targetFieldName + " is undefined.");
		}else alert("Field " + fieldName + " is undefined.");
	}else alert("Form " + formName + " is undefined.");
}

function updateGroupValue(obj, targetFieldName){
	var groupName = obj.name;
	var form = obj.form;
	var group = form[groupName];
	var str = new Array();
	if(group){
		for(var i = 0; i < group.length; i++) if(group[i].checked) str[str.length] = group[i].value;
	}else alert("Group " + groupName + " is undefined.");
	var targetField = form[targetFieldName];
	if(targetField){
		targetField.value = str.toString();
	}else alert("Target field " + targetFieldName + "is undefined.")
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                                  Validation  End                                            //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

var Waitings = {
	in_waiting : {},
	waiting_layer : 'waiting_layer',
	waiting_table : 'waiting_table',
	waiting_timer: '',
	
	init: function () {
		Event.observe(document,'scroll',function(e){
			Waitings.layer_set_position();
			//if(wait_bar) wait_bar.togglePause();
		});
	},
	
	button_wait: function(button_id) {
		if (button_id && $(button_id) && $('waiting_button')) {
			this.in_waiting[button_id] = $(button_id).innerHTML;
			$(button_id).update($('waiting_button').innerHTML);
		}
	},
	
	success_wait: function (button_id) {
		if (button_id && this.in_waiting[button_id]) {
			$(button_id).update(this.in_waiting[button_id]);
		}
	},
	
	failure_wait: function (button_id) {
		alert('An error occuped. Please try again.');
		if (button_id && this.in_waiting[button_id]) {
			$(button_id).update(this.in_waiting[button_id]);
		}
	},
	
	wait: function (wlayer,wtable) {
		if (wlayer) this.waiting_layer = wlayer;
		if (wtable) this.waiting_table = wtable;
		if ($(this.waiting_layer)) $(this.waiting_layer).show();
		if ($(this.waiting_table)) $(this.waiting_table).show();
		this.layer_set_position();
		//if(wait_bar) wait_bar.togglePause();
	},
	
	stop_wait: function (wlayer,wtable,error) {
		if (wlayer) this.waiting_layer = wlayer;
		if (wtable) this.waiting_table = wtable;
		if (error) alert('An error occuped. Please try again.');
		if ($(this.waiting_layer)) $(this.waiting_layer).hide();
		if ($(this.waiting_table))$(this.waiting_table).hide();
		//if(wait_bar) wait_bar.togglePause();
	},
	
	layer_set_position: function() {
	    window.scrollTo(0,0);
		if (!this.waiting_layer) this.waiting_layer = 'waiting_layer';
		if (!this.waiting_table) this.waiting_table = 'waiting_table';
		var y = window.scrollY?window.scrollY:document.body.scrollTop;
		if ($(this.waiting_layer)) $(this.waiting_layer).style.top = y+'px';
		if ($(this.waiting_table)) $(this.waiting_table).style.top = y+'px';
	},
	
	start_waiting: function(error_delay) {
		this.wait();
		if (error_delay) this.waiting_timer = window.setTimeout('waiting_timeout()',error_delay*1000);
		
	},
	
	stop_waiting: function() {
		clearTimeout(this.waiting_timer);
		this.stop_wait();
	}
	
}

