var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

var protocol 	= getProtocol();
var objId		= getObjId();
var domain		= getDomain();
var wd			= window.document;
var isIE		= BrowserDetect.browser=="Explorer"?true:false;
var isFF		= !isIE;
function addLoadEvent(func)
{	
	var oldonload = window.onload;
	if (typeof window.onload != 'function'){
    	window.onload = func;
	} else {
		window.onload = function(){
		oldonload();
		func();
		}
	}

}

function formatNumber(pnumber,decimals){
	if (isNaN(pnumber)) { return 0};
	if (pnumber=='') { return 0};
	
	var snum = new String(pnumber);
	var sec = snum.split('.');
	var whole = parseFloat(sec[0]);
	var result = '';
	
	if(sec.length > 1){
		var dec = String(Math.round(pnumber*Math.pow(10,decimals))/Math.pow(10,decimals));
		var dot = dec.indexOf('.');
		if(dot == -1){
			dec += '.'; 
			dot = dec.indexOf('.');
		}
		while(dec.length <= dot + decimals) { dec += '0'; }
		result = dec;
	} else{
		var dot;
		var dec = new String(whole);
		dec += '.';
		dot = dec.indexOf('.');		
		while(dec.length <= dot + decimals) { dec += '0'; }
		result = dec;
	}	
	return result;
}

function roundNumber(pnumber, decimals){
	if (isNaN(pnumber)) { return 0};
	return Math.round(parseFloat(pnumber)*Math.pow(10,decimals))/Math.pow(10,decimals);
}

function openList(type, fields, title, pagesize, callback){
	var limit = '0,'+pagesize;
	overlib('<div id="listdiv" class="content edit" style="height:500px;overflow:auto;text-align:left;padding:5px">'+
			'<div id="loading" style="position:relative;top:40%;left:35%;width:30%;text-align:center"><img src=\'/theme/default/image/icon_loading.gif\'>&nbsp;System is loading. Please wait...</div>'+
			'</div>'+
			'<div class="footer" style="clear:both" id="pages">Page: </div>',
			STICKY, CAPTION,title,MIDX,0,RELY,20,
			CLOSECLICK,WIDTH,800,FGCOLOR,'#FFFFFF',MODAL,
			CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
	_loadList(type, fields, callback, limit);
}

/**
 * @param type: Int - typeid of object to be listed
 * @param callback: String - callback function to invoke when Add button is clicked
 * @param limit: String - start, size
 * @param filter(optional) - filter to apply to the list
 * populate tbody element in popup window with list results
 */
function _loadList(type, fields, callback, limit)
{
	var limits = limit.split(',');
	var lb = parseFloat(limits[0]); var pagesize = parseFloat(limits[1]);	
	if(arguments.length==4){
		var url = "/json/list/"+type+"/"+fields+"/"+limit+'/0/title';
	}else{
		var keywords = arguments[4];
		filter = eval('Immix'+type+'.generateFilter(\''+keywords+'\')');
		var url = "/json/search/"+type+"/"+fields+"/"+filter+"/"+limit+"/title";
	}
	
	OLgetAJAX(url,function(){
		eval('var res ='+OLresponseAJAX);
		wd.getElementById('loading').style.display='none';
		if(wd.getElementById('listtable')) wd.getElementById('listdiv').removeChild(wd.getElementById('listtable'));
		var listTable=wd.createElement('table');listTable.setAttribute('width','100%');listTable.className='adminmlist';
			listTable.setAttribute('border','0');listTable.cellPadding='0';listTable.cellSpacing='0';listTable.setAttribute('id','listtable');
		var listHead=wd.createElement('thead');listBody=wd.createElement('tbody');
		
		eval('var descObj = Immix'+type+';');
		
		//Populate header row
		var tRow=wd.createElement('tr');
		var numcols=0;
		for(var i in res['cols']){
			var cell=wd.createElement('td');cell.setAttribute('width',descObj[i].width);cell.className='key';
			cell.appendChild(wd.createTextNode(descObj[i].title));tRow.appendChild(cell);
			numcols++;
		}
		var hRow=wd.createElement('tr');var hCell=wd.createElement('td');hCell.colSpan=numcols;hCell.className="head";
			hCell.innerHTML='<div style="float:left;width:120px">Select to Add</div>'+
			'<div style="float:right;vertical-align:middle;">&nbsp;<input class="searchbut" onclick="search('+type+',\''+fields+'\',\''+callback+'\',\''+limit+'\');" value=" Go " type="button"></div>'+
			'<div style="float:right;vertical-align:middle;"><input type="text" size="15" id="f2qsearch" value="'+(keywords?keywords:'')+'" style="vertical-align:middle;border:0px;font-size:8pt;font-weight:normal"></div>'+
			'<div style="float:right;vertical-align:middle;">Search: </div>';
		hRow.appendChild(hCell);
		listHead.appendChild(hRow);listHead.appendChild(tRow);
		
		var count=0;
		// Insert rows into body section of the list
		for(var k in res) {
			if(!isNaN(k)){
				var newR = wd.createElement('tr');newR.setAttribute('id','row_'+k);if(count%2==1) newR.className='hl';
				var stdLink=wd.createElement('a');stdLink.className='facade2add';
				for(var j in res['cols']){
					var cell = wd.createElement('td');
					var link = stdLink.cloneNode(false);
					for(var n in res[k]){
						eval('link.'+n+'='+'res[k].'+n);
					}
					link.onclick=eval(callback);
					link.appendChild(wd.createTextNode(eval('res[k].'+j)));
					cell.appendChild(link);newR.appendChild(cell);
				}
				listBody.appendChild(newR);count++;
			}
		}
		
		listTable.appendChild(listHead);listTable.appendChild(listBody);
		wd.getElementById('listdiv').appendChild(listTable);
		// generate pages
		var total = parseFloat(res['count']);
		var numpage = Math.ceil(total/pagesize);
		var curpage = Math.floor(lb/pagesize) + 1;
		wd.getElementById('pages').innerHTML='';
		if(numpage > 1) {
			var fst = curpage>1?'<a href="javascript:void(0)" onclick="_loadList(\''+type+',\''+fields+'\',\''+callback+'\',\'0,'+pagesize+'\''+(keywords?',\''+keywords+'\'':'')+')">First</a>&nbsp;':'First&nbsp;';
			var prev = curpage>1?'<a href="javascript:void(0)" onclick="_loadList(\''+type+'\',\''+fields+'\',\''+callback+'\',\''+(curpage-2)*pagesize+','+pagesize+'\''+(keywords?',\''+keywords+'\'':'')+')">Prev</a>&nbsp;':'Prev&nbsp;';
			new Insertion.Bottom('pages',fst);
			new Insertion.Bottom('pages',prev);
			for(var i = 1; i <= numpage; i++){
				var page = i!=curpage?'<a href="javascript:void(0)" onclick="_loadList(\''+type+'\',\''+fields+'\',\''+callback+'\',\''+(i-1)*pagesize+','+pagesize+'\''+(keywords?',\''+keywords+'\'':'')+')">'+i+'</a>&nbsp;':i+'&nbsp;';
				new Insertion.Bottom('pages',page);
			}
			var nxt=curpage<numpage?'<a href="javascript:void(0)" onclick="_loadList(\''+type+'\',\''+fields+'\',\''+callback+'\',\''+curpage*pagesize+','+pagesize+'\''+(keywords?',\''+keywords+'\'':'')+')">Next</a>&nbsp;':'Next&nbsp;';
			var last=curpage<numpage?'<a href="javascript:void(0)" onclick="_loadList(\''+type+'\',\''+fields+'\',\''+callback+'\',\''+(numpage-1)*pagesize+','+pagesize+'\''+(keywords?',\''+keywords+'\'':'')+')">Last</a>':'Last';
			new Insertion.Bottom('pages',nxt);
			new Insertion.Bottom('pages',last);
		}
	});
}

function jsonSet(id, field, value, callback){
	var url = '/json/set/'+id+'/1';
	var params = '{"'+field+'":"'+value+'"}';
	var aj = new Ajax.Request(url,
		{
			method:'post',
			parameters:params,
			onComplete:function(request) {
				var res = request.responseText;
				if(res=="false"){
					errorDialog('Unable to change "'+field+'" to "'+value+'"','Error!');
					refresh();
				}else{
					eval(callback);
				}
			}//..function
		}//..property list
	);//.. ajax request
}

function jsonView(id){
	overlib('<div id="jsonview" align="center" class="content edit"><img src=\'/theme/default/image/icon_loading.gif\'>&nbsp;System is loading. Please wait...</div>',
				STICKY, CAPTION,'Fraud Analysis Result',MIDX,0,RELY,30,CLOSETEXT,'',
				CLOSECLICK,WIDTH,600,HEIGHT,400,FGCOLOR,'#FFFFFF', MODAL,
				CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
	var url		= '/json/view/'+id;
	OLgetAJAX(url,function(){
		eval('var res ='+OLresponseAJAX);
		wd.getElementById('jsonview').innerHTML = res + 
		'<div style="text-align:center;padding-top:10px"><input type="button" class="button_cancel" value="Close" onclick="cClick();" /></div>';
	});
}

function jsonNonImmixSet(id, idfld, table, field, value, callback){
	var url = '/json/nonimmix_set/'+id+'/'+idfld+'/'+table;
	var params = '{"'+field+'":"'+value+'"}';
	var aj = new Ajax.Request(url,
		{
			method:'post',
			parameters:params,
			onComplete:function(request){
				var res = request.responseText;
				if(res=="false"){
					errorDialog('Unable to change "'+field+'" to "'+value+'"', 'Error!');
					refresh();
				}else{
						eval(callback);
				}
			}
		}
	);
}

function jsonQsave(type, id2, id1, rel, reltype, grp, subgrp, field, value, callback){
	var url = '/json/qsave/'+type+'/'+id2+'/'+id1+'/'+rel+'/'+reltype+'/'+grp+'/'+subgrp;
	var params = '{"'+field+'":"'+value+'"}';
	var aj = new Ajax.Request(url,
		{
			method:'post',
			parameters:params,
			onComplete:function(request) {
				var res = request.responseText;
				if(res=="false"){
					errorDialog('Unable to save "'+field+'" as "'+value+'"','Error!');
					refresh();
				}else{
					eval(callback);
				}
			}//..function
		}//..property list
	);//.. ajax request
}

/**
 * 
 */
function search(type, fields, callback, limit){
	var keywords = wd.getElementById('f2qsearch').value.trim();
	/*var regex = /^([a-zA-Z_\.\-\'\&\d\"]+\x20?)+$/;
	if(!regex.exec(keywords)){
		errorDialog('Search keywords must not be empty and can contain alphanumeric characters only', 'Invalid search keywords');
		return;
	}*/
	_loadList(type, fields, callback, limit, keywords);
}

function qCreate(type, typen){
	width=arguments.length>2?arguments[2]:400;
	rely=arguments.length>3?arguments[3]:50;
	overlib('<div id="editaddr" align="center" class="content edit"><img src=\'/theme/default/image/icon_loading.gif\'>&nbsp;System is loading. Please wait...</div>',
				STICKY, CAPTION,'Create New '+typen,MIDX,0,RELY,rely,CLOSETEXT,'',
				CLOSECLICK,WIDTH,width,FGCOLOR,'#FFFFFF', MODAL,
				CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
	var url		= '/json/qcreate/'+type+'/'+objId;
	var argList = '0';
	if(arguments.length>4) {
		for(var i=4; i < arguments.length; i++){
			argList += ",'"+arguments[i]+"'";
		}
	}
	OLgetAJAX(url,function(){
		eval('var res ='+OLresponseAJAX);
		wd.getElementById('editaddr').innerHTML = res + 
		'<div style="text-align:center"><input type="button" class="button_save" value="Save" onclick="this.value=\'Saving..\';this.disabled=true;if(!Immix'+type+'.save('+argList+')){this.value=\'Save\';this.disabled=false;} " />&nbsp;&nbsp;'+
		'<input type="button" class="button_cancel" value="Cancel" onclick="if(confirm(\'Are you sure to cancel new '+typen+'?\')) cClick();else return false;" /></div>';
	});
}

function qEdit(id, type, typen){
	width=arguments.length>3?arguments[3]:400;
	rely=arguments.length>4?arguments[4]:50;
	overlib('<div id="editaddr" align="center" class="content edit"><img src=\'/theme/default/image/icon_loading.gif\'>&nbsp;System is loading. Please wait...</div>',
				STICKY, CAPTION,'Edit '+typen,MIDX,0,RELY,rely,CLOSETEXT,'',
				CLOSECLICK,WIDTH,width,FGCOLOR,'#FFFFFF', MODAL,
				CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
	var url		= '/json/qedit/'+id+'/'+objId;
	var argList = id;
	if(arguments.length>5) {
		for(var i = 5; i < arguments.length; i++){
			argList += ",'"+arguments[i]+"'";
		}
	}
	OLgetAJAX(url,function(){
		eval('var res ='+OLresponseAJAX);
		wd.getElementById('editaddr').innerHTML = res + 
		'<div style="text-align:center"><input type="button" class="button_save" value="Save" onclick="this.disabled=true;this.value=\'Saving...\';if(!Immix'+type+'.save('+argList+')){this.value=\'Save\';this.disabled=false;}" />&nbsp;&nbsp;'+
		'<input type="button" class="button_cancel" value="Cancel" onclick="if(confirm(\'Are you sure to cancel editing '+typen+'?\')) cClick();else return false;" /></div>';
	});
}

function qDelete(id, type, typen){
	overlibConfirm('Are you sure to delete '+typen+' no: '+id,'delete_'+type+'('+id+')', 'cClick();','Delete Confirmation');
}

/**
 * @return array containing ids of the checked rows
 */
function getcheckedbox(cfm_msg){
	var dml 	= document.forms[0];
	var len 	= dml.elements.length;
	var patt 	= /^check_([\d]+)$/i;
	var id_cnt	= 0;
	var id_arr	= new Array();
	for(var i=0; i<len;i++){
		var e=dml.elements[i];
		if(e.type=="checkbox") {
			if(patt.exec(e.name) && e.checked){
				var arr				= patt.exec(e.name);
				var id				= parseInt(arr[1]);
				id_arr[id_cnt] 		= id;
				id_cnt++;
			}
		}
	}
	
	if(id_arr.length > 0){
		if(cfm_msg.length>0&&!confirm(cfm_msg)) return false;
	}else{
		var warning_msg = arguments.length > 1 ? arguments[1] : 'You did not select any item';
		alert(warning_msg);
		return false;
	}
	return id_arr;
}

function getallinput(type){
	var dml 	= document.forms[0];
	var len 	= dml.elements.length;
	var elm		= new Array();
	for(var i=0;i<len;i++){
		var e=dml.elements[i];
		if(e.type.toLowerCase()==type)
			elm[i] = e.getAttribute('id');
	}
	return elm;
}

function check_all() {
	var dml 		= document.forms[0];
	var len 		= dml.elements.length;
	var check_all 	= dml.check_all;
	var regex		= /^check_([\d]+)$/i;
	for (var i = 0;i<len;i++) {
		var e = dml.elements[i];
		if(regex.exec(e.name))
			e.checked = dml.all.checked;
	}
}

function in_array(the_needle, the_haystack){
    var the_hay = the_haystack.toString();
    if(the_hay == ''){
        return false;
    }
    var the_pattern = new RegExp(the_needle, 'g');
    var matched = the_pattern.test(the_haystack);
    return matched;
}

Array.prototype.push = function(){
	var A_p = 0
	for (A_p = 0; A_p < arguments.length; A_p++) {
		this[this.length] = arguments[A_p]
	}
	return this.length
}

function overlibConfirm(msg,yes,no,caption){
	 var msg=(msg||'');var caption=(caption||'');
	 var overCfm=
	 (OLns4?'<form action="javascript:void(0);">':'')+msg
	 +'<div style="font-size:4px;line-height:4px;"><\/div>'
	 +'<div style="width:100%;text-align:center;margin-top:10px"><input type="button" '
	 +'class="htmlIAddPopupButton" onclick="cClick();'+yes
	 +';return false;" value=" Yes ">  '
	 +'<input type="button" class="htmlIAddPopupButton"'
	 +'onclick="cClick();'+no
	 +';return false;" value=" No "></div>'
	 +(OLns4?'<\/form>':'');
	 
	overlib(overCfm, caption?CAPTION:DONOTHING,caption?caption:DONOTHING, MODAL,
	MIDX,0,RELY,200,STICKY,WIDTH,400,FGCOLOR,'#FFFFFF', CLOSETEXT,'',
	CGBACKGROUND,'/theme/default/image/button_bg.gif',BGCOLOR,'#999999');
}

function errorDialog(msg,caption,width,height){
	if(!overlib2){
		overlib2('<div style="width:100%;padding-top:5px;" id="errdlg"><div style="width:60px;float:left"><img src="/theme/default/image/note_error.jpg" border="0" /></div><div style="float:right;width:335px">'+msg+'</div></div>',
		caption?CAPTION:DONOTHING,caption?caption:DONOTHING,MODAL,
		STICKY, MIDX,0,RELY,200,WIDTH,width?width:400,HEIGHT,height?height:100,FGCOLOR,'#FFFFFF', CLOSECLICK,CLOSETEXT,'Close',
		CGBACKGROUND,'/theme/default/image/button_bg_red.gif',BGCOLOR,'#999999');
	}else{
		overlib('<div style="width:100%;padding-top:5px;" id="errdlg"><div style="width:60px;float:left"><img src="/theme/default/image/note_error.jpg" border="0" /></div><div style="float:right;width:335px">'+msg+'</div></div>',
		caption?CAPTION:DONOTHING,caption?caption:DONOTHING,MODAL,
		STICKY, MIDX,0,RELY,200,WIDTH,width?width:400,HEIGHT,height?height:100,FGCOLOR,'#FFFFFF', CLOSECLICK,CLOSETEXT,'Close',
		CGBACKGROUND,'/theme/default/image/button_bg_red.gif',BGCOLOR,'#999999');
	}
}

function warningDialog(msg,caption,width,height){
	if(overlib){
	overlib2('<div style="width:100%;padding-top:5px;" id="wrndlg"><div style="width:60px;float:left"><img src="/theme/default/image/note_warning.jpg" border="0" /></div><div style="float:right;width:335px">'+msg+'</div></div>',
		caption?CAPTION:DONOTHING,caption?caption:DONOTHING,MODAL,
		STICKY, MIDX,0,RELY,200,WIDTH,width?width:400,HEIGHT,height?height:100,FGCOLOR,'#FFFFFF', CLOSECLICK,CLOSETEXT,'Close',
		CGBACKGROUND,'/theme/default/image/button_bg_orange.gif',BGCOLOR,'#999999');
	}else{
	overlib('<div style="width:100%;padding-top:5px;" id="wrndlg"><div style="width:60px;float:left"><img src="/theme/default/image/note_warning.jpg" border="0" /></div><div style="float:right;width:335px">'+msg+'</div></div>',
		caption?CAPTION:DONOTHING,caption?caption:DONOTHING,MODAL,
		STICKY, MIDX,0,RELY,200,WIDTH,width?width:400,HEIGHT,height?height:100,FGCOLOR,'#FFFFFF', CLOSECLICK,CLOSETEXT,'Close',
		CGBACKGROUND,'/theme/default/image/button_bg_orange.gif',BGCOLOR,'#999999');
	}
}

function infoDialog(msg,caption,width,height){
	if(!overlib2){
		overlib2('<div style="width:100%;padding-top:5px;" id="wrndlg"><div style="width:60px;float:left"><img src="/theme/default/image/note_warning.jpg" border="0" /></div><div style="float:right;width:335px">'+msg+'</div></div>',
			caption?CAPTION:DONOTHING,caption?caption:DONOTHING,MODAL,
			STICKY, MIDX,0,RELY,200,WIDTH,width?width:400,HEIGHT,height?height:100,FGCOLOR,'#FFFFFF', CLOSECLICK,CLOSETEXT,'Close',
			CGBACKGROUND,'/theme/default/image/button_bg_green.gif',BGCOLOR,'#999999');
	}else{
		overlib('<div style="width:100%;padding-top:5px;" id="wrndlg"><div style="width:60px;float:left"><img src="/theme/default/image/note_warning.jpg" border="0" /></div><div style="float:right;width:335px">'+msg+'</div></div>',
			caption?CAPTION:DONOTHING,caption?caption:DONOTHING,MODAL,
			STICKY, MIDX,0,RELY,200,WIDTH,width?width:400,HEIGHT,height?height:100,FGCOLOR,'#FFFFFF', CLOSECLICK,CLOSETEXT,'Close',
			CGBACKGROUND,'/theme/default/image/button_bg_green.gif',BGCOLOR,'#999999');
	}
}

/**
 * If tohide is unknown, it should contains an array of element ids
 */
function swapDivs(tohide, toshow){
	if(typeof tohide == "object"){
		for(var i=0;i<tohide.length;i++){
			if(wd.getElementById(tohide[i]).style.display!="none"){
				tohide = tohide[i];
				break;
			}
		}
	}
	
	if(!wd.getElementById(tohide)||tohide==toshow) {return false;}
	var d = arguments.length>3?arguments[3]:0.5
	if(typeof Effect == "object"){
		if(arguments.length>2){
			switch(arguments[2]){
				case 'slide':
					Effect.SlideDown(toshow, {duration:d});
					Effect.SlideUp(tohide, {duration:d});
					break;
				case 'blind':
					Effect.BlindDown(toshow, {duration:d});
					Effect.BlindUp(tohide, {duration:d});
					break;
				default:
					Effect.Appear(toshow, {duration:d});
					Effect.Fade(tohide, {duration:d});
			}
		}else{
			Effect.Appear(toshow, {duration:d});
			Effect.Fade(tohide, {duration:d});
		}
	}else{
		wd.getElementById(tohide).style.display="none";
		wd.getElementById(toshow).style.display="";
	}
}

function preloadImages() {
	var d=document;
	if(d.images){
		if(!d.MM_p) d.MM_p=new Array();
		var i,j=d.MM_p.length,a=preloadImages.arguments;
		for(i=0; i<a.length; i++)
		if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}
	}
}

function quick_sort(vec, loBound, hiBound, obj_type){
	var pivot, loSwap, hiSwap, temp;
	switch(obj_type) {
		case 'order':
			var cmp_func = function(a, b) {
					if(a[2] == b[2]){
						if(a[1] == b[1]){
							return a[0] > b[0] ? 1 : -1;
						}else{
							return a[1] > b[1] ? 1 : -1;
						}
					}else{
						return a[2] > b[2] ? 1 : -1;
					}
				};
			break;
		default:
	}
	
	// Two items to sort
	if (hiBound - loBound == 1){
		if (cmp_func(vec[loBound], vec[hiBound]) > 0){
			temp = vec[loBound];
			vec[loBound] = vec[hiBound];
			vec[hiBound] = temp;
		}
		return;
	}
	// Three or more items to sort
	pivot = vec[parseInt((loBound + hiBound) / 2)];
	vec[parseInt((loBound + hiBound) / 2)] = vec[loBound];
	vec[loBound] = pivot;
	loSwap = loBound + 1;
	hiSwap = hiBound;
	do {
		// Find the right loSwap
		while (loSwap <= hiSwap && cmp_func(vec[loSwap],pivot) <= 0)
			loSwap++;

		// Find the right hiSwap
		while (cmp_func(vec[hiSwap], pivot) > 0)
			hiSwap--;

		// Swap values if loSwap is less than hiSwap
		if (loSwap < hiSwap)
		{
			temp = vec[loSwap];
			vec[loSwap] = vec[hiSwap];
			vec[hiSwap] = temp;
		}
	} while (loSwap < hiSwap);

	vec[loBound] = vec[hiSwap];
	vec[hiSwap] = pivot;

	// 2 or more items in first section
	if (loBound < hiSwap - 1)
		quick_sort(vec, loBound, hiSwap - 1, obj_type);

	// 2 or more items in second section
	if (hiSwap + 1 < hiBound)
		quick_sort(vec, hiSwap + 1, hiBound, obj_type);
}

/**
 * Get attribute of a node
 * @param att - the attribute to get
 * @param node - of Node type
 */
function getNodeAttribute(node, att){
	if (node.getAttribute) {
		try {
		    return node.getAttribute(att);
		} catch(err) {
		    // IE has a stupid bug where getAttribute throws an error ... on
		    // TABLE elements and perhaps other elememnt types!
		    // Resort to looking in the attributes.
		    var value = node.attributes[att];
		    if(value != null) {
		        return value.nodeValue;
		    }
		}
	}
	return null;
}

/**
 * @param required : boolean
 * @param regex : regular expression
 * @param field_name : String
 * @param field_id: String - id of the field
 * @param label_id: String - id of the field's label
 * @param error_msg: String - message displayed when error detected
 */
function validate(required, regex, field_name, field_id, label_id, err_box, error_msg) {
	var the_field = wd.getElementById(field_id);
	if(required) {
		if(wd.getElementById(field_id).type == "select-multiple"){
			if(wd.getElementById(field_id).length == 0) {
				wd.getElementById(label_id).className = 'validatorInputHighlighted';
				wd.getElementById(err_box).innerHTML += '<b>Error:</b> ' + error_msg + ' <br />';
				return false;
			}else{
				if(wd.getElementById(label_id).className == 'validatorInputHighlighted')
					wd.getElementById(label_id).className = 'validatorInputNormal';
				return true;
			}
		}else{
			if(the_field.value.length == 0) {
				wd.getElementById(label_id).className = 'validatorInputHighlighted';
				wd.getElementById(err_box).innerHTML += '<b>Error:</b> ' + field_name + ' is a required field <br />';
				return false;
			}
		}
	}
	if(wd.getElementById(field_id).type != "select-multiple") {
		if(!regex.test(the_field.value)) {
			wd.getElementById(label_id).className = 'validatorInputHighlighted';
			wd.getElementById(err_box).innerHTML += '<b>Error:</b> ' + error_msg + '<br />';
			return false;
		}else{
			if(wd.getElementById(label_id).className == 'validatorInputHighlighted')
				wd.getElementById(label_id).className = 'validatorInputNormal';
			return true;
		}
	}
}

function redirect(url) {
	window.location.href	= url;
}

function refresh() {
	window.location.reload( false );
	//window.location.href = unescape(window.location.pathname);
}

function getDomain() {
	return window.location.hostname;
}

function getProtocol(){
	return window.location.protocol;
}
function loadScript(url){
   var e = document.createElement("script");
   e.setAttribute('src',url);
   e.setAttribute('type',"text/javascript");
   e.setAttribute('language', "Javascript");
   document.getElementsByTagName("head")[0].appendChild(e);
}

function loadCss(url){
	var c = document.createElement('link');
	c.setAttribute('type','text/css');
	c.setAttribute('rel', 'stylesheet');
	c.setAttribute('href',url);
	document.getElementsByTagName("head")[0].appendChild(c);
}
function getW(){
	return (typeof window.innerWidth == 'undefined')?document.body.clientWidth:window.innerWidth;
}

function pause(millis)
{
	var date = new Date();
	var curDate = null;

	do { curDate = new Date(); }
	while(curDate-date < millis);
}

function captureEventSource(e)
{
	if(!e) src=window.event.srcElement;
	else src=e.target;
	return src;
}

function getObjId(){
	var paths=window.location.pathname.split('/');var id=paths[paths.length-1];return id;
}

function loadScripts(){
	loadScript('/thirdparty/overlib/overlibmws.js');
	loadScript('/thirdparty/overlib/overlibmws_modal.js');
	loadScript('/thirdparty/overlib/ajaxcontentmws.js');
	loadScript('/thirdparty/overlib/overlibmws_overtwo.js');
	loadScript('/thirdparty/scriptaculous/src/scriptaculous.js');
	loadScript('/thirdparty/scriptaculous/src/effects.js')
}

// describe immix object fields
			
var Immix91={
	view:function(id){
		overlib('<div id="viewEmail" style="padding: 5px;height:500px;overflow:auto" align="center" class="content edit"><img src=\'/theme/default/image/icon_loading.gif\'>&nbsp;System is loading. Please wait...</div>',
			STICKY, CAPTION,'View Email',MIDX,0,RELY,20,CLOSETEXT,'Close',
			CLOSECLICK,WIDTH,600,FGCOLOR,'#FFFFFF', MODAL,
			CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
			var url		= '/json/get/'+id+'/emailtext';
			OLgetAJAX(url,function(){
				eval('var res ='+OLresponseAJAX);
				wd.getElementById('viewEmail').innerHTML = res['emailtext'] + 
				'<div style="text-align:center"><input type="button" class="button_cancel" value="Close" onclick="cClick();" /></div>';
			});
		
	}
}

var Immix1={
	id: {title:'ID', width:'5%'},
	userfirst: {title:'First Name', width:'15%'},
	userlast: {title:'Last Name', width:'15%'},
	useremail: {title:'Email', width:'25%'},
	userphone: {title:'Phone', width:'15%'},
	usermobile: {title:'Mobile', width:'15%'},
	save:function(uid){
		var formname = uid!='0'?'f2qedit_1_':'f2qcreate_1_';
		var title = wd.getElementById(formname+'usertitle').value;
		var first = wd.getElementById(formname+'userfirst').value;
		var last = wd.getElementById(formname+'userlast').value;
		var email = wd.getElementById(formname+'useremail').value;
		var phone = wd.getElementById(formname+'userphone').value;
		var mobile = wd.getElementById(formname+'usermobile').value;
		var data = {id:uid,
					usertitle:title,
					userfirst:first,
					userlast:last,
					useremail:email,
					userphone:phone,
					usermobile:mobile,
					username:''};
		var checkEmail = new Ajax.Request('/json/is_unique/'+uid, {method:'post',
				parameters:'{"table":"user","field":"useremail","value":"'+email+'"}',
				onComplete:function(request){
					var resp = eval(request.responseText);
					if(resp){
						Immix1.add(data);
					}else{
						errorDialog('The email address "'+email+'" has already been chosen. Please choose another email address','Duplicate email found');
					}
				}
			}
		);
		
		return false;
	},
	add:function(evt){
		if((isIE&&!evt)||(isFF&&!evt.userfirst)){var addNew=false; data=captureEventSource(evt); }
		else {data=evt; var addNew=true;}
		if(addNew){
			var params = '{"usertitle":"'+data.usertitle+'","userfirst":"'+data.userfirst+'","userlast":"'+data.userlast+
				 		'","useremail":"'+data.useremail+'","userphone":"'+data.userphone+'","usermobile":"'+data.usermobile+'"}';
			var url = '/json/qsave/1/'+objId+'/'+data.id+'/child/110/41/0';
		}else{
			var params='';
			var url='/json/attach/add/'+objId+'/parent/'+data.id+'/41/0/1/1';
		}
		
		var aj = new Ajax.Request(url,
			{
				method:'post',
				parameters:params,
				onComplete:function(request) {
					var res = request.responseText;
					if(res=="false"){
						errorDialog('Unable to save address','Error! System could not save address');
					}else{
						if(addNew) {Immix1.update(data);}
						else refresh();
						cClick();
					}
				}//..function
			}//..property list
		);//.. ajax request
	},
	update:function(data){
		var usertbody=wd.getElementById('usertbody');
		if(usertbody.rows.length<=1){
			usertbody.removeChild(usertbody.rows[0]);
			var row1=usertbody.insertRow(0);var row2=usertbody.insertRow(1);
			var row3=usertbody.insertRow(2);var row4=usertbody.insertRow(3);var row5=usertbody.insertRow(4);
			var cell11=row1.insertCell(0);cell11.width="40%";cell11.appendChild(wd.createTextNode('Name'));
			var cell12=row1.insertCell(1);cell12.id="userfullname";cell12.width="60%";cell12.appendChild(wd.createTextNode(data.userfirst+' '+data.userlast));
			var cell21=row2.insertCell(0);cell21.appendChild(wd.createTextNode('Username'));
			var cell22=row2.insertCell(1);cell22.id="username";cell22.appendChild(wd.createTextNode(data.username));
			var cell31=row3.insertCell(0);cell31.appendChild(wd.createTextNode('Email'));
			var cell32=row3.insertCell(1);cell32.id="useremail";cell32.appendChild(wd.createTextNode(data.useremail));
			var cell41=row4.insertCell(0);cell41.appendChild(wd.createTextNode('Phone'));
			var cell42=row4.insertCell(1);cell42.id="userphone";cell42.appendChild(wd.createTextNode(data.userphone));
			var cell51=row5.insertCell(0);cell51.appendChild(wd.createTextNode('Mobile'));
			var cell52=row5.insertCell(1);cell52.id="usermobile";cell52.appendChild(wd.createTextNode(data.usermobile));
		}else{
			wd.getElementById('userfullname').innerHTML=data.userfirst+' '+data.userlast;
			wd.getElementById('useremail').innerHTML=data.useremail;
			wd.getElementById('userphone').innerHTML=data.userphone;
			wd.getElementById('usermobile').innerHTML=data.usermobile;
		}
	},
	generateFilter:function(keywords){
		var filter = '';
		var wordCount=0;
		var words = keywords.split(' ');
		for(var i=0;i< words.length;i++){
			if(words[i]!='') {
				filter += (wordCount>0?" OR ":"")+
					'('+
					'INSTR(`core`.`title`, \''+words[i]+'\') '+
					//'OR INSTR(`user`.`userfirst`, \''+words[i]+'\') '+
					//'OR INSTR(`user`.`userlast`, \''+words[i]+'\') '+
					//'OR INSTR(`user`.`useremail`, \''+words[i]+'\') '+
					')';
				wordCount++;
			}
		}
		return escape(filter);
	}
}

Immix6 = {
	save:function(id, pf){
		var grptype=arguments.length>2?arguments[2]:1;
		var grpsubtype=arguments.length>3?arguments[3]:0;
		var formname = id!='0'?'f2qedit_6_':'f2qcreate_6_';
		var addrstreet = wd.getElementById(formname+'addrstreet').value;
		var addrcity = wd.getElementById(formname+'addrcity').value;
		var addrstate = wd.getElementById(formname+'addrstate').value;
		var addrpc = wd.getElementById(formname+'addrpc').value;
		var addrcountry = wd.getElementById(formname+'addrcountry').value;
		var params = '{"addrstreet":"'+addrstreet+'","addrcity":"'+addrcity+'","addrstate":"'+addrstate+'","addrpc":"'+addrpc+'","addrcountry":"'+addrcountry+'"}';
		
		if(!/^\d{3,4}$/.exec(addrpc)) {errorDialog('Post code must be a 3 or 4-digit number','Invalid post code entered');return false;}
		if(isNaN(objId)) objId='';
		var url = '/json/qsave/6/'+objId+'/'+id+'/parent//'+grptype+'/'+grpsubtype;
		var getTitle = new Ajax.Request(url,
			{
				method:'post',
				parameters:params,
				onComplete:function(request) {
					var res = request.responseText;
					if(res=="false"){
						errorDialog('Unable to save address','Error! System could not save address');
					}else{
						wd.getElementById(pf+'street').innerHTML = addrstreet;
						wd.getElementById(pf+'city').innerHTML = addrcity;
						wd.getElementById(pf+'state').innerHTML = addrstate;
						wd.getElementById(pf+'pc').innerHTML = addrpc;
						wd.getElementById(pf+'country').innerHTML = addrcountry;
						cClick();
						if(formname=='f2qcreate_6_'&&(pf=='facade2CoreEdit_baddr'||pf=='facade2CoreEdit_saddr')) refresh();
						if(typeof recalShip == 'function') recalShip();
					}
				}//..function
			}//..property list
		);//.. ajax request
		return false;
	}
}
