/**
  * Common Unseen JS objects
  */
  
/**
  * Extend the String object with Java's trim() function
  */ 
String.prototype.trim = function() {
	a = this.replace(/^\s+/, '');
	return a.replace(/\s+$/, '');
};

/**
  * Reload current page with a login required parameter set to on.
  */
var requireLogin = function() {
	// if location has a fragment, we need to add the request parameter before it.
	var indexOfHash = location.href.indexOf('#');
	if (indexOfHash > 0) {
		var newLocation = location.href.substring(0, location.href.indexOf('#')) + "&rlg=on" + location.hash;
	}
	else {
		var newLocation = location.href + "&rlg=on";
	}	
	location = newLocation;
}

/**
  * Browser detection
  */
var getIEVersion  = function() {
	var ua = navigator.userAgent;
	var offset = ua.indexOf("MSIE ");
	return offset < 0 ? null : parseFloat(ua.substring(offset + 5, ua.indexOf(";", offset)));		
}

var getMozillaVersion = function() {
	var re = /(rv:)(\d+\.\d+\.?\d*\.?\d*)/;
	var a = re.exec(navigator.userAgent);
	return a ? a[2] : null;
}

/**
  * Email validation.
  */
var validateEmail = function(email) {

	var result = false;
	
	$.ajax({
		url: "/ax/validateEmail",
		data: {email: email},
		dataType: "json",
		async: false,
		success: function(data){
			if(data.code == 0){
				result = Boolean(data.response.valid);
			}
			else {
				ajaxError(data.code, "publishAnchor");
			}
		}
	});
	
	return result;
}

/**
  * Tags functions
  */
var tagsSyntax = new RegExp("^[\\w\\.\\-]+$");
var tagsSeparator = new RegExp("[\\s\\,]+");
var parseTags = function(tagString) {  

	var tags = tagString.split(tagsSeparator);
	var goodTags = new Array();
	var badTags = new Array();
	for (var i = 0; i < tags.length; i++) {
		var t = tags[i].trim();
		if (t) {
			if (t.match(tagsSyntax)) {
				goodTags.push(t);
			}
			else {
				badTags.push(t);
			}
		}
	}
	
	var result = new Object();
	result.ok = true;
	if (badTags.length > 0) {
		//alert("bad tags: " + badTags.length);
		var message = "Tags ";
		for (var i = 0; i < badTags.length; i++) {
			message += "'" + badTags[i] + "', ";
		}
		// delete last two chars
		message = message.substring(0, message.length - 2);
		message += " are invalid";
		result.errorMessage = message;
		result.ok = false;
	}
	else {
		result.tags = goodTags;
	}
	return result;
}		
  
/**
 * Disable an anchor link, i.e. replace it with grey text.
 */
var disableLink = function(elemId) {
	var elem = $("#" + elemId);
	var text = elem.html();
	elem.before($("<span>" + text + "</span>").css({"color" : "silver"})).remove();
}

/**
  * Does the string contain a parseable integer?
  * Only digits are allowed
  */
var isInteger = function(str) { 
	return str.match(new RegExp("^(\\d)+$"));
}

/**
  * Does the string contain a parseable decimal?
  * Only digits and a single dot are allowed.
  */
var isDecimal = function(str) {  
	return str.match(new RegExp("^(\\d)+\\.?(\\d)*$"));
}

/**
  * Parse a string representation of a number of commas, and a decimal period like '1,000.00'
  */
var parseFormattedFloat = function(str) {
	var num = '';
	for (var i = 0; i < str.length; i++) {
		var c = str.charAt(i);
		if (c != ',') num += c;
	}
	return parseFloat(num);
}

var formatFloat = function (str) {
	var tokens = str.split(/\./);
	result = '';
	for (var i = 0; i < tokens[0].length; i++) {
		if (i > 0 && i % 3 == 0) result = ',' + result;
		result = tokens[0].charAt(tokens[0].length - i - 1) + result;
	}
	if (tokens[1]) result += '.' + tokens[1];
	return result;
}

 /**
  * Shared Client side error processor.
  * Reload the standalone error page.
  */
var ajaxError = function(rc, method) {
	// If 201 (unauthorized) then most likely the session has expired.
	// Redirect to Home.
	if (rc == 201) {
		location.reload();
	}
	// Otherwise, redirect to standalone error page.
	else {
		location.replace("/ex/error?do=client&rc=" + rc + "&mthd=" + method);
	}
}

/**
 * Get Server Message by key
 */
var getServerMessage = function(key, params) {
	var result;
	var data = data = {key: key};
	for (var i = 1; i < arguments.length; i++) {
		eval ('data.a' + (i-1) + ' = ' + arguments[i]);
	}

	$.ajax({
		url: "/ax/serverMessage",
		data: data,
		dataType: "json",
		async: false, // <- This is important.
		success: function(data) {
			if(data.code == 0){
				result = data.response.msg;
				if (!result) result = "No server message for key " + key;
			}
			else {
				ajaxError(data.code, "getServerMessage");
			}
		}
	});
	return result;
}

/**
  * Convert decimal inches to decimal centimeters, with 2 decimal points.
  */
var inchToCm = function(val) {
	var result = val * 2.54;
	return result.toFixed(2);
}


/**
 * Shared constants
 */
var badHtmlMarkup = new RegExp("[<>!\\(\\)\\[\\]]");
var badHtmlMarkupMessage = "Characters '<', '>', '!','[',']','(',')' are not allowed";

var ARTWORK_STATUS_NFS = 0;
var ARTWORK_STATUS_FOR_SALE = 1;
var ARTWORK_STATUS_SOLD_OUT = 2;
var ARTWORK_STATUS_SUSPENDED = 3;

var ARTWORK_TYPE_ORIGINAL = 0;
var ARTWORK_TYPE_LIMITED = 1;
var ARTWORK_TYPE_UNLIMITED = 2;

var PRINTS_STATUS_NFS = 0;
var PRINTS_STATUS_FOR_SALE = 1;
var PRINTS_STATUS_SUSPENDED = 2;

var USER_MERCHANT_STATUS_NONE = 0;
var USER_MERCHANT_STATUS_POSTCARD_REQUESTED = 1;
var USER_MERCHANT_STATUS_VERIFIED = 2;

 