/**
 * 3 code blocks: CONSTANTS, Specific Code, Generic Code
 * each section is separated by "/* -------------- [SECTION_NAME] -------------- *" + "/"
 * each block begins with the variables from this section and afterwards his classes and functions.
 **/


/* -------------- CONSTANTS -------------- */

var BASE_URL = '/';
var SHOW_TECHNICAL_ERROR_DETAILS = true;

/* -------------- Generic Code -------------- */

var d = document;

var ErrorHandler = function(msg,url,l)
{
	thisObj = this;
	this.errors = new Array();
	this.onError = new Array();

	this.addError = function(msg, url, line)
	{
		this.errors.push([msg, url, line]);
		thisObj.popAlert(msg, url, line);
	}

	this.popAlert = function(msg, url, line)
	{
		if(SHOW_TECHNICAL_ERROR_DETAILS)
		{
			alert(
				'Error occur.\n\
				\n\
				Error details:\n\
				Error: '+msg+'\n\
				URL: '+url+'\n\
				Line: '+l+'\n\
				\n\
				Click OK to continue.');
		}
		else
		{
			alert('Error occur');
		}

		if(thisObj.onError.length > 0)
		{
			for(x in thisObj.onError)
			{
				if(thisObj.onError[x])
					thisObj.onError[x]();
			}
		}
	}

	this.addEvent = function(eventFunction)
	{
		return thisObj.onError.push(eventFunction) - 1;
	}

	this.removeEvent = function(eventKey)
	{
		thisObj.onError[eventKey] = false;
	}
};

//onerror = ErrorHandler.addError;



function $(id)
{
	return d.getElementById(id);
}

function go(url)
{
	d.location.href = url;
}

function getStyle(element, style)
{
	if(document.defaultView && document.defaultView.getComputedStyle)
		return eval("d.defaultView.getComputedStyle(element, '')." + style);
	else if(element.currentStyle)
		return eval("element.currentStyle." + style);
}

function addEventsAction(element, event, action, useCapture)
{
	if(!action)
		action = function(){};

	if(element.addEventListener)
		element.addEventListener(event, action, useCapture);
	else if(element.attachEvent)
		element.attachEvent('on' + event, action);
	else
		alert('Error Occur...');
}

function convertNum(inputElement, integer, positive)
{
	var val = inputElement.value;

	if(!val) return;
	if(val=='-' && !positive) return;
	if(!integer && (val.substr(val.length-1)=='.' || val.substr(val.length-1)=='0')) return;
	if(isNaN(val = integer ? parseInt(val) : parseFloat(val))) val = '';
	if(positive && val<0) val = val-val*2;

	inputElement.value = val;
}

function getXmlHttpSend(url, handler, postData)
{
	var method = postData ? 'POST' : 'GET';

	var xmlHttp;

	if(navigator.userAgent.indexOf('Gecko') > 0)
	{
		xmlHttp = new XMLHttpRequest();
		xmlHttp.onload = handler;
		xmlHttp.onerror = function() {
				//alert("error occur '.__LINE__.'");
		}
	}
	else if(navigator.userAgent.indexOf('MSIE'))
	{
		var strName = 'Msxml2.XMLHTTP';

		if(navigator.appVersion.indexOf('MSIE 5.5'))
		{
			strName = 'Microsoft.XMLHTTP';
		}
		try
		{
			xmlHttp = new ActiveXObject(strName);
			xmlHttp.onreadystatechange = handler;
		}
		catch(e)
		{
			alert('Error. Scripting for ActiveX might be disabled');
		}
	}
	else
	{
		alert("This Action doesn't work in your Browser");
		return false;
	}

	xmlHttp.open(method, url, true);

	if(method == 'POST')
		xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

	xmlHttp.send(postData);

	return xmlHttp;
}


/**
 * 
 **/

function _checkAndRewriteForm()
{
	try
	{
		var actionAddress, formFields=[], theForm=$('clients_search_fName').form;

		if	(
			!$('clients_search_fName').value
			&& !$('clients_search_lName').value
			&& !$('clients_search_street').value
			&& !$('clients_search_city').value
			&& !$('clients_search_zip').value
			&& !$('clients_search_phone').value
			&& !$('clients_search_mobile').value
			)
		{
			alert('חובה לבחור לפחות בערך אחד לחיפוש. שם פרטי, משפחה, רחוב, עיר, מיקוד, טלפון או טלפון נייד.');
			return false;
		}


		actionAddress = new String('/');

		if($('clients_search_fName').value)
			actionAddress = actionAddress.concat('fName,' + encodeHebrewText($('clients_search_fName').value) + '/');

		if($('clients_search_lName').value)
			actionAddress = actionAddress.concat('lName,' + encodeHebrewText($('clients_search_lName').value) + '/');

		if($('clients_search_street').value)
			actionAddress = actionAddress.concat('street,' + encodeHebrewText($('clients_search_street').value) + '/');

		if($('clients_search_city').value)
			actionAddress = actionAddress.concat('city,' + encodeHebrewText($('clients_search_city').value) + '/');

		if($('clients_search_zip').value)
			actionAddress = actionAddress.concat('zip,' + $('clients_search_zip').value + '/');

		if($('clients_search_phone').value)
			actionAddress = actionAddress.concat('phone,' + $('clients_search_phone').value + '/');

		if($('clients_search_mobile').value)
			actionAddress = actionAddress.concat('mobile,' + $('clients_search_mobile').value + '/');

		actionAddress = actionAddress.concat('AndOrOperator,' + ($('clients_search_operatorAnd').checked ? 'and' : 'or') + '/');

		theForm.action += actionAddress;


		// disabled all inputs elements, in order to prevent from the browser to add the "?' character and field's value's in the address string
		formFields = theForm.getElementsByTagName('input');
		if(formFields.length)
		{
			for(x in formFields)
				formFields[x].disabled = true;
		}

		formFields = theForm.getElementsByTagName('select');
		if(formFields.length)
		{
			for(x in formFields)
				formFields[x].disabled = true;
		}

		formFields = theForm.getElementsByTagName('textarea');
		if(formFields.length)
		{
			for(x in formFields)
				formFields[x].disabled = true;
		}



		return true;
	}catch(e){
		alert('אירעה שגיאה, מומלץ לרענן את הדף באמצעות ctrl+f5\n\nמידע טכני:\n' + e);
		return false;
	}
}


// chek if an object is an array or not.
// returns true if it is an array
function isArray(obj)
{
	if(!obj)
		return false;

	return (obj.constructor.toString().indexOf('Array') == -1)
		 ? false
			: true;
}



/* -------------- Specific Code -------------- */



/**
 * User interface
 **/
/*
ErrorHandler.addEvent(function(){
	GlobalMessage.writeError('אירעה שגיאה, נסה שנית מאוחר יותר.\nנא פנה לתמיכה הטכנית במידה והבעיה נמשכת');
});
*/
GlobalMessage = {
	init: false,
	globalMessage: null,
	successMessage: null,
	errorMessage: null,

	load: function(){
		GlobalMessage.globalMessage = $('GlobalMessage');
		GlobalMessage.successMessage = $('SuccessMessage');
		GlobalMessage.errorMessage = $('ErrorMessage');
		GlobalMessage.init = true;
	},



	writeGloabl: function(msg, duration, add2exists){
		if(!GlobalMessage.init) GlobalMessage.load();

		if(add2exists)
			msg = GlobalMessage.globalMessage.innerHTML + '\n<br >\n' + msg;

		GlobalMessage.globalMessage.innerHTML = msg;
		GlobalMessage.globalMessage.style.display = 'block';
	},

	cleanGloabl: function(){
		if(!GlobalMessage.init) GlobalMessage.load();

		GlobalMessage.globalMessage.innerHTML = '';
	},

	hideGloabl: function(){
		if(!GlobalMessage.init) GlobalMessage.load();

		GlobalMessage.globalMessage.style.display = 'none';
	},

	// Clean the content message and hide the element
	delGloabl: function(){
		GlobalMessage.cleanGloabl();
		GlobalMessage.hideGloabl();
	},



	writeSuccess: function(msg, duration, add2exists){
		if(!GlobalMessage.init) GlobalMessage.load();

		if(add2exists)
			msg = GlobalMessage.globalMessage.innerHTML + '\n<br >\n' + msg;

		GlobalMessage.successMessage.innerHTML = msg;
		GlobalMessage.successMessage.style.display = 'block';
	},

	cleanSuccess: function(){
		if(!GlobalMessage.init) GlobalMessage.load();

		GlobalMessage.successMessage.innerHTML = '';
	},

	hideSuccess: function(){
		if(!GlobalMessage.init) GlobalMessage.load();

		GlobalMessage.successMessage.style.display = 'none';
	},

	// Clean the content message and hide the element
	delSuccess: function(){
		GlobalMessage.cleanSuccess();
		GlobalMessage.hideSuccess();
	},



	writeError: function(msg, duration, add2exists){
		if(!GlobalMessage.init) GlobalMessage.load();

		if(add2exists)
			msg = GlobalMessage.globalMessage.innerHTML + '\n<br >\n' + msg;

		GlobalMessage.errorMessage.innerHTML = msg;
		GlobalMessage.errorMessage.style.display = 'block';
	},

	cleanError: function(){
		if(!GlobalMessage.init) GlobalMessage.load();

		GlobalMessage.errorMessage.innerHTML = '';
	},

	hideError: function(){
		if(!GlobalMessage.init) GlobalMessage.load();

		GlobalMessage.errorMessage.style.display = 'none';
	},

	// Clean the content message and hide the element
	delError: function(){
		GlobalMessage.cleanError();
		GlobalMessage.hideError();
	}
}



/**
 * 
 **/


/**
 * required:
 *	1. d = document;
 *	2. $()
 *	3. getStyle()
 **/
function setLayoutBackground()
{
	try{
		// based of wraper element
		var rightSide = $('rightSide');
		var content = $('content');
		if(d.all){var styleDisplay=$('body').style.display;$('body').style.display = 'inline-block';}// fix ie problem. we set this propertyto reach hasLayout because if element not have a layout, element.clientHeight is set to 0
		var height = $('body').clientHeight;
		if(d.all){$('body').style.display=styleDisplay;}// to reset the previous  ie fix problem.

		rightSide.style.height = ((height - parseInt(getStyle(rightSide, 'marginTop')) - parseInt(getStyle(rightSide, 'marginBottom')) - parseInt(getStyle(rightSide, 'paddingTop')) - parseInt(getStyle(rightSide, 'paddingBottom'))) + 'px');
		content.style.height = ((height - parseInt(getStyle(content, 'marginTop')) - parseInt(getStyle(content, 'marginBottom')) - parseInt(getStyle(content, 'paddingTop')) - parseInt(getStyle(content, 'paddingBottom'))) + 'px');

		return;


		// based of 2 sibling elemente
		$('rightSide').style.height = $('content').style.height = "auto";

		var rightSide = $('rightSide');
		var rightSideHeight = rightSide.clientHeight;
		var rightSideExternalHeight = parseInt(getStyle(rightSide, 'paddingTop')) + parseInt(getStyle(rightSide, 'paddingBottom')) + parseInt(getStyle(rightSide, 'marginTop')) + parseInt(getStyle(rightSide, 'marginBottom'));

		var content = $('content');
		var contentHeight = content.clientHeight;
		var contentExternalHeight = parseInt(getStyle(content, 'paddingTop')) + parseInt(getStyle(content, 'paddingBottom')) + parseInt(getStyle(content, 'marginTop')) + parseInt(getStyle(content, 'marginBottom'));

		if(rightSideHeight+rightSideExternalHeight > contentHeight+contentExternalHeight)
			content.style.height = (rightSideHeight - contentExternalHeight) + 'px';
		else if(contentHeight+contentExternalHeight > rightSideHeight+rightSideExternalHeight)
			rightSide.style.height = (contentHeight - rightSideExternalHeight) + 'px';
	}catch(e){
		alert(e)
	}
};

addEventsAction(window, 'load', setLayoutBackground);



function add2bookmark(url, title)
{
	if(window.sidebar){ // Mozilla Firefox Bookmark
		window.sidebar.addPanel(title, url, "");
	}else if(window.external){ // IE Favorite
		window.external.AddFavorite(url, title);
	}else if(window.opera && window.print){ // Opera Hotlist
		return true;
	}
}


function _search()
{
	var type;

	switch(true)
	{
		case $('search_byBookName').checked:
			type = $('search_byBookName').value;
			break;
		case $('search_byAuthor').checked:
			type = $('search_byAuthor').value;
			break;
		case $('search_general').checked:
		default:
			type = $('search_general').value;
	}

	go(BASE_URL + 'search/' + type + '/' + $('search').value);
}


onerror = function(msg,url,l)
{
	txt = "There was an error on this page.\n\n";
	txt += "Error: " + msg + "\n";
	txt += "URL: " + url + "\n";
	txt += "Line: " + l + "\n\n";
	txt += "Click OK to continue.\n\n";

	alert(txt);

	return true;
}