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 isSafari    = BrowserDetect.browser=="Safari"?true:false;
var isFF		= !isIE && !isSafari;
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);
}



/**
 * Display $limit of stocks allocated to a product in an overlib box
 * @param id - id of the product
 * @param limit - number of stocks to be displayed
 */
function loadStock(id, limit) {
	overlib('<div id="viewstock" align="center" class="content edit"><img src=\'/theme/default/image/icon_loading.gif\'>&nbsp;System is loading. Please wait...</div>',
				STICKY, CAPTION,'View Stock',MIDX,0,RELY,50,CLOSETEXT,'',
				CLOSECLICK,WIDTH,300,FGCOLOR,'#FFFFFF', MODAL,
				CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
	var url = '/stock/load/'+id+'/'+limit;
	OLgetAJAX(url,function(){
		var res = jQuery.parseJSON(OLresponseAJAX);
		out = '<table width="100%" border="0" cellspacing="0">';
		out += '<tr><th width="50%">Serial</th><th width="50%">Code</th></tr>';
		for(var i = 0; i < res.length; i++) {
			out += '<tr><td>'+res[i].seri+'</td><td>'+res[i].code+'</td></tr>';
		}
		out += '</table><div style="text-align:center">'+
			'<input type="button" class="button_cancel" value="Close" onclick="cClick();" /></div>';
		jQuery('#viewstock').html(out);
	});
}

/**
 * 
 */
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="qCreate" 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(){
		var res = jQuery.parseJSON(OLresponseAJAX);
		jQuery('#qCreate').html(res + 
		'<div style="text-align:center"><input type="button" class="button_save" value="Save" onclick="this.value=\'Saving..\';this.disabled=true;if(!ekimx'+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="qEdit" 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(){
		var res = jQuery.parseJSON(OLresponseAJAX);
		jQuery('#qEdit').html(res + 
		'<div style="text-align:center"><input type="button" class="button_save" value="Save" onclick="this.disabled=true;this.value=\'Saving...\';if(!ekimx'+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');
}

function overlibajaxload(url){
	wd.getElementById('viewcontent').innerHTML = '<div id="loadingbox"><img src="/img/loading.gif" align="center" alt="loading"></div>';
	var ajax = new Ajax.Updater('viewcontent', url, {method:'get',asynchronous:true,evalScripts:true});
}

/**
 * If tohide is unknown, it should contains an array of element ids
 */
function swapDivs(tohide, toshow){
	if(jQuery.isArray(tohide)){
		for(var i=0;i<tohide.length;i++){
			if(jQuery('#'+tohide[i]).is(':visible')){
				tohide = tohide[i];
				break;
			}
		}
	}
	
	if(!jQuery('#'+tohide)||tohide==toshow) {return false;}
	var d = arguments.length>2?arguments[2]:500;

	jQuery('#'+toshow).fadeIn(d);
	jQuery('#'+tohide).fadeOut(d);
}


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);
}

function pause(millisecondi){
	var now = new Date();
	var exitTime = now.getTime() + millisecondi;
	
	while(true){
		var later = new Date();
		if(later.getTime() > exitTime) return;
	}
}

/**
 * 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 );}

function getDomain() {
	return window.location.hostname;
}

function getProtocol(){
	return window.location.protocol;
}

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;
}

// describe ekimx object fields
			
var ekimx91={
	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,800,FGCOLOR,'#FFFFFF', MODAL,
			CGBACKGROUND,'/theme/default/image/mi_bg.jpg',BGCOLOR,'#999999');
			var url		= '/json/get/'+id+'/emailtext,text';
			OLgetAJAX(url,function(){
				var res = jQuery.parseJSON(OLresponseAJAX);
				jQuery('#viewEmail').html('<style>'+res['text']+'</style>' + res['emailtext'] + 
				'<div style="text-align:center;clear:both;margin-top:5px"><input type="button" class="button_cancel" value="Close" onclick="cClick();" /></div>');
			});
		
	}
};

var ekimx1={
	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'?'ekmqedit_1_':'ekmqcreate_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:''};
		jQuery.ajax({url:'/json/is_unique/'+uid, type:'POST',data:'{"table":"user","field":"useremail","value":"'+email+'"}',
			complete:function(request){
				var resp = eval(request.responseText);
				if(resp) ekimx1.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';
		}
		
		jQuery.ajax({url:url,type:'POST',data:params,
			complete:function(request) {
				var res = request.responseText;
				if(res=="false"){
					errorDialog('Unable to save address','Error! System could not save address');
				}else{
					if(addNew) {ekimx1.update(data);}else refresh();cClick();
				}
			}
		});
	},
	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);
	}
};

ekimx6 = {
	save:function(id, pf){
		var grptype=arguments.length>2?arguments[2]:1;
		var grpsubtype=arguments.length>3?arguments[3]:0;
		var formname = id!='0'?'ekmqedit_6_':'ekmqcreate_6_';
		var addrname = wd.getElementById(formname+'addrname').value;
		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 = '{"addrname":"'+addrname+'","addrstreet":"'+addrstreet+'","addrcity":"'+addrcity+'","addrstate":"'+addrstate+'","addrpc":"'+addrpc+'","addrcountry":"'+addrcountry+'"}';
		
		if(!/^[a-zA-z\d\-\x20]{3,7}$/.exec(addrpc)) {errorDialog('Post code must be a 3 or 4-digit number','Invalid post code entered');return false;}
		if(isNaN(objId)) objId='';

		jQuery.ajax({url:'/json/qsave/6/'+objId+'/'+id+'/parent//'+grptype+'/'+grpsubtype, type:'POST',
			data:params,complete:function(request){
				var res = request.responseText;
				if(res=="false"){
					errorDialog('Unable to save address','Error! System could not save address');
				}else{jQuery('#'+pf+'name').html(addrname);
					jQuery('#'+pf+'street').html(addrstreet);jQuery('#'+pf+'city').html(addrcity);
					jQuery('#'+pf+'state').html(addrstate);jQuery('#'+pf+'pc').html(addrpc);
					jQuery('#'+pf+'country').html(addrcountry);cClick();
					if(formname=='ekmqcreate_6_'&&(pf=='ekmaskCoreEdit_baddr'||pf=='ekmaskCoreEdit_saddr')) refresh();
					if(typeof recalShip == 'function') recalShip();
				}
			}
		});
		return false;
	}
};

