function FormatNumberBy3(num, decpoint, sep) {

	// check for missing parameters and use defaults if so
	if (arguments.length == 2) {
		sep = ",";
	}
	if (arguments.length == 1) {
		sep = ",";
		decpoint = ".";
	}
	// need a string for operations
	num = num.toString();
	// separate the whole number and the fraction if possible
	a = num.split(decpoint);
	x = a[0]; // decimal
	y = a[1]; // fraction
	z = "";
	
	if (typeof(x) != "undefined") {
	// reverse the digits. regexp works from left to right.
		for (i=x.length-1;i>=0;i--)
			z += x.charAt(i);
		// add seperators. but undo the trailing one, if there
		z = z.replace(/(\d{3})/g, "$1" + sep);
		if (z.slice(-sep.length) == sep)
			z = z.slice(0, -sep.length);
		x = "";
		// reverse again to get back the number
		for (i=z.length-1;i>=0;i--)
			x += z.charAt(i);
		// add the fraction back in, if it was there
		if (typeof(y) != "undefined" && y.length > 0)
			x += decpoint + y;
	}
	return x;
}

JSON = new function(){
	
	this.decode = function(){
		var	filter, result, self, tmp;
		if($$("toString")) {
			switch(arguments.length){
				case	2:
					self = arguments[0];
					filter = arguments[1];
					break;
				case	1:
					if($[typeof arguments[0]](arguments[0]) === Function) {
						self = this;
						filter = arguments[0];
					}
					else
						self = arguments[0];
					break;
				default:
					self = this;
					break;
			};
			if(rc.test(self)){
				try{
					result = e("(".concat(self, ")"));
					if(filter && result !== null && (tmp = $[typeof result](result)) && (tmp === Array || tmp === Object)){
						for(self in result)
							result[self] = v(self, result) ? filter(self, result[self]) : result[self];
					}
				}
				catch(z){}
			}
			else {
				//throw new JSONError("bad data");
				result = null ; 
			}
		};
		return result;
	};
	
	
	this.encode = function(){
		var	self = arguments.length ? arguments[0] : this,
			result, tmp;
		if(self === null)
			result = "null";
		else if(self !== undefined && (tmp = $[typeof self](self))) {
			switch(tmp){
				case	Array:
					result = [];
					for(var	i = 0, j = 0, k = self.length; j < k; j++) {
						if(self[j] !== undefined && (tmp = JSON.encode(self[j])))
							result[i++] = tmp;
					};
					result = "[".concat(result.join(","), "]");
					break;
				case	Boolean:
					result = String(self);
					break;
				case	Date:
					result = '"'.concat(self.getFullYear(), '-', d(self.getMonth() + 1), '-', d(self.getDate()), 'T', d(self.getHours()), ':', d(self.getMinutes()), ':', d(self.getSeconds()), '"');
					break;
				case	Function:
					break;
				case	Number:
					result = isFinite(self) ? String(self) : "null";
					break;
				case	String:
					result = '"'.concat(self.replace(rs, s).replace(ru, u), '"');
					break;
				default:
					var	i = 0, key;
					result = [];
					for(key in self) {
						if(self[key] !== undefined && (tmp = JSON.encode(self[key])))
							result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp);
					};
					result = "{".concat(result.join(","), "}");
					break;
			}
		};
		return result;
	};
	
	
	this.toDate = function(){
		var	self = arguments.length ? arguments[0] : this,
			result;
		if(rd.test(self)){
			result = new Date;
			result.setHours(i(self, 11, 2));
			result.setMinutes(i(self, 14, 2));
			result.setSeconds(i(self, 17, 2));
			result.setMonth(i(self, 5, 2) - 1);
			result.setDate(i(self, 8, 2));
			result.setFullYear(i(self, 0, 4));
		}
		else if(rt.test(self))
			result = new Date(self * 1000);
		return result;
	};
	
	
	var	c = {"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},
		d = function(n){return n<10?"0".concat(n):n},
		e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},
		i = function(e,p,l){return 1*e.substr(p,l)},
		p = ["","000","00","0",""],
		rc = null,
		rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
		rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
		rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
		ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
		s = function(i,d){return "\\".concat(c[d])},
		u = function(i,d){
			var	n=d.charCodeAt(0).toString(16);
			return "\\u".concat(p[n.length],n)
		},
		v = function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},
		$ = {
			"boolean":function(){return Boolean},
			"function":function(){return Function},
			"number":function(){return Number},
			"object":function(o){return o instanceof o.constructor?o.constructor:null},
			"string":function(){return String},
			"undefined":function(){return null}
		},
		$$ = function(m){
			function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};
			return $(Array)&&$(Object)
		};
	try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
	catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
};

var items = new Array();

function c_getScrollTop_print(){
	return window.pageYOffset || document.documentElement.scrollTop;
}

function get_correctPosition_factor() {
	setTimeout(function () {
		get_correctPosition_factor();
	}, 100);
	document.getElementById('factor').style.top = c_getScrollTop_print() + 10 + 'px';
	document.getElementById('factor_price').style.top = c_getScrollTop_print() + 480 + 'px';
	document.getElementById('factor_btn').style.top = c_getScrollTop_print() + 510 + 'px';
	document.getElementById('close_btn').style.top = c_getScrollTop_print() + 510 + 'px';
}

get_correctPosition_factor();

addToFactor = function(id){
	var tokens = id.split("_");
	
	var site = tokens[0];
	var table_number = tokens[1];
	var row_number = tokens[2];
	var col_number = tokens[3];
		
	var header = document.getElementById(site + '_' + table_number + '_h_' + col_number).innerHTML;
	var place = document.getElementById(site + '_' + table_number + '_' + row_number + '_1').innerHTML;
	var price = document.getElementById(id).innerHTML.replace(/\//g,',');
	var site_name = document.getElementById('site_' + site).innerHTML;

	addEngine(id, site_name, place, header, price);
}

addEngine = function(id, site_name, place, header, price)
{
	document.getElementById('myDivs').style.display = 'inline';
	
	for(i in items){
		if(items[i]['id'] == id){
			return;
		}
	}
	
	objDIV1 = document.createElement("DIV");
	objDIV1.setAttribute("style", "text-align:right;color:black");
	objDIV1.setAttribute("class", "factor_det");
	objDIV1.setAttribute("id", "div1_" + id);
	objDIV1.innerHTML = site_name;
	
	objDIV2 = document.createElement("DIV");
	objDIV2.setAttribute("style", "text-align:right;color:blue");
	objDIV2.setAttribute("class", "factor_det");	
	objDIV2.setAttribute("id", "div2_" + id);
	objDIV2.innerHTML = place + ' ' + header;
	
	objDIV3 = document.createElement("DIV");
	objDIV3.setAttribute("style", "text-align:left;color:green");
	objDIV3.setAttribute("class", "factor_det");	
	objDIV3.setAttribute("id", "div3_" + id);
	objDIV3.innerHTML = price;
	
	objDIV4 = document.createElement("DIV");
	objDIV4.setAttribute("id", "div4_" + id);
	objDIV4.setAttribute("class", "delete");
	objDIV4.setAttribute("onclick", "removeFromFactor('" + id + "')");
	objDIV4.innerHTML = 'حذف';

	objDIV5 = document.createElement("DIV");
	objDIV5.setAttribute("style", "height:10px;text-align:center");
	objDIV5.setAttribute("id", "div5_" + id);
	objDIV5.innerHTML = '--------------------------------';
	
	document.getElementById('factor').appendChild(objDIV1);
	document.getElementById('factor').appendChild(objDIV2);
	document.getElementById('factor').appendChild(objDIV3);
	document.getElementById('factor').appendChild(objDIV4);
	document.getElementById('factor').appendChild(objDIV5);
	
	var new_item = new Array();
	new_item['id'] = id;
	new_item['site'] = site_name;
	new_item['place'] = place;
	new_item['header'] = header;
	new_item['price'] = price;
	
	items.splice(0,0,new_item);
	
	calculateFactorPrice();
}

removeFromFactor = function(id){
	
	for(i = 1; i <= 5; i++){
		var node = document.getElementById('div' + i + '_' + id);
		node.parentNode.removeChild(node);
	}
	
	for(i in items){
		if(items[i]['id'] == id){
			items.splice(i,1);
		}
	}
	
	if(items.length == 0){
		document.getElementById('myDivs').style.display = 'none';
	}
	
	calculateFactorPrice();
}

calculateFactorPrice = function()
{
	var totalPrice = 0;
	for(k = 0; k < items.length; k++){
		var price = items[k]['price'].replace(/,/g,'');	
		totalPrice = parseInt(totalPrice) + parseInt(price);
	}
	document.getElementById('factor_price_pure').innerHTML = FormatNumberBy3(totalPrice);
	document.getElementById('factor').scrollTop = 100000;	
}

printpreview = function()
{
	var dataObj = new Object();
	for(i in items){
		dataObj[i] = new Object();
		for(j in items[i]){
			dataObj[i][j]=new Object();
			dataObj[i][j]=items[i][j];
		}
	}
	var data = JSON.encode(dataObj);
	var WindowObjectReference = window.open("factor#" + data, "Abstract", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,copyhistory=yes,resizable=yes");
	WindowObjectReference.focus();
}

closeBox = function()
{
	if(confirm('					آیا از بستن فاکتور اطمینان دارید؟')){
		for(i in items){
			if(items[i]['id']){
				for(j = 1; j <= 5; j++){
					var node = document.getElementById('div' + j + '_' + items[i]['id']);
					node.parentNode.removeChild(node);
				}
			}
		}
		
		items = null;
		items = new Array();
		
		calculateFactorPrice();
		document.getElementById('myDivs').style.display = 'none';
	}
}
