/**
 * @version	$Id: easydns.util.js 951 2008-03-06 16:09:28Z awyld $
 * @author Andrew Wyld <awyld@easydns.com>
 * @category javascript
 * @copyright Copyright (c) 2007, EasyDNS Technologies Inc.
 */

/**
 * GLOBAL VARIABLES
 */
var WIN;
var pageTracker;

/**
 * BROWSER CONSTANTS
 */
var BROWSER_FIREFOX		= 'mozilla';
var BROWSER_NETSCAPE	= 'netscape';
var BROWSER_IE			= 'msie';
var BROWSER_SAFARI		= 'safari';

/**
 * Attempt to remove any XSS input
 * @return bool String is sanitary
 */
function sanitize(str) {
	str = unescape(str.toLowerCase());
	str = str.replace("\r", '');
	str = str.replace("\n", '');

	for(i = 0; i < str.length; i++) {
		if(!str.charAt(i).match('[a-z0-9-\.\n,]')) {
			return false;
		}
	}
		
	return true;
};

/**
 * Check if the current browser is Internet Explorer
 * @return bool
 */
function isIE() {
	return jQuery.browser.msie;
};

/**
 * Check if the current browser is Safari
 * @return bool
 */
function isSafari() {
	return jQuery.browser.safari;
};

/**
 * Check if the current browser is Opera
 * @return bool
 */
function isOpera() {
	return jQuery.browser.opera;
};

/**
 * Check if the current browser is Firefox
 * @return bool
 */
function isFirefox() {
	return jQuery.browser.mozilla;
};

/**
 * Function to test if a variable is a real number.
 * @param Number num The variable to test.
 * @return bool Is actually a number.
 */
function isNumber(num) {

	try {
		if(num == null || isNaN(num) || !(typeof num == "number")) {
			return false;
		}
	} catch(e) {
		return fail(e);
	}

	return true;
};


/**
 * Determine if an element id/class/any form
 * of id matches atleast one DOM element.
 * 
 * @param {Object} element The element identifier.
 * @return bool Valid.
 */
function isEl(element) {
	var ref = null;
	
	try {
		if(element == null) {
			return err('No element provided');
		}
		
		var eltype = typeof element;
		if(eltype == 'object') {
			return true;
		}
		
		ref = jQuery(element);
		if(ref == null || !ref) {
			return err('Element '+element+' does not exist');
		}
		
		return true;
	} catch(e) {
		return false;
	}
	return false;
};


// {{{ getClassArray()

/**
 * Get an elements classes in easy to use array.
 * 
 * @param object el The element to get class data from.
 * @return array Class list or null on error.
 */
function getClassArray(el) {
	var cstr, classes;

	if(el == null || !isEl(el)) {
		return null;
	}
	
	try {
		cstr = el.className;
		if(cstr == null || !cstr) {
			return null;
		}
		
		classes = cstr.split(' ');
	} catch(e) {
		fail(e);
		return null;
	}

	return classes;
};

// }}}


// {{{ hasClass()

/**
 * Checks if an element has the class specified
 * 
 * @param object el The element
 * @param string cname The class to test for.
 * @return bool Class is assigned to this element.
 */
function hasClass(el, cname) {
	if(el == null || !isEl(el)) {
			return false;
	}
	if(el.className.match(cname) != null) {
		return true;
	}
	return false;
};

// }}}

// {{{ formatPhone()

/**
 * Formats a phone number in e164 format.
 * 
 * @return bool Success
 */
function formatPhone(el) {
	if(el == null || !isEl(el)) {
		return false;
	}

	try {
		var opts = {
			p: jQuery(el).val(),
			i: jQuery(el).attr('id'),
			c: jQuery('#country').val()
		};
		var url = JDATA_URL+'phone.php';
		jQuery.getJSON(url, opts, function (result) {
			if(result == null || !result.ok) {
				return false;
			}
			if(result.el) {
				jQuery('#'+result.el).val(result.num);
			}
			return true;
		});
		
	} catch(e) {
		return false;
	}

	return true;
};

// }}}


// {{{ formatProv()

/**
 * Formats a province using the std 2-letter format.
 * 
 * @return string Provincial code (2CHAR) or false
 */
function formatProv(prov) {
	var rtn;
	
	var PROV_CODE = {
		'AB': 'AB',
		'BC': 'BC',
		'MB': 'MB',
		'NB': 'NB',
		'NL': 'NL',
		'NS': 'NS',
		'NT': 'NT',
		'NU': 'NU',
		'ON': 'ON',
		'PE': 'PE',
		'QC': 'QC',
		'QU': 'QC',
		'QB': 'QC',
		'SK': 'SK',
		'YT': 'YT',
		'YK': 'YT',
		'PQ': 'QC',
		'LB': 'NL',
		'NF': 'NL'
	};
	
	var PROV_FULL = {
		'ALBERTA': 'AB',
		'MANITOBA': 'MB',
		'NEW BRUNSWICK': 'NB',
		'ONTARIO': 'ON',
		'SASKATCHEWAN': 'SK',
		'QUEBEC': 'QC'
	};
	
	var PROV_SHORT = {
		'ONT': 'ON',
		'ALTA': 'AB',
		'ALB': 'AB',
		'MAN': 'MB',
		'MBA': 'MB',
		'NFLD': 'NL',
		'PEI': 'PE',
		'B.C.': 'BC',
		'N.B.': 'NB',
		'N.S.': 'NS',
		'P.Q.': 'QC',
		'NWT': 'NT',
		'TNO': 'NT',
		'QUE': 'QC',
		'SASK': 'SK',
		'YUK': 'YT'
	};
	
	if(prov == null || prov.length <= 1) {
		return false;
	}
	prov = prov.toUpperCase();
	
	if(prov.length == 2) {
		rtn = PROV_CODE[prov];
		if(!rtn) {
			return prov;
		}
		return rtn;
	}
	
	if(prov.length == 3 || prov.length == 4) {
		rtn = PROV_SHORT[prov];
		if(!rtn) {
			return prov;
		}
		return rtn;
	}
	
	rtn = PROV_FULL[prov];
	if(!rtn) {
		return prov;
	}
	return rtn;
};

// }}}


function parseTLD(domain) {
	if(domain == null || !domain) {
		return false;
	}
	var parts = domain.split('.');
	if(parts == null || parts.length < 2) {
		return false;
	}
	// var d = domain.replace(parts[0] + '.');
	return parts[ (parts.length - 1) ];
};

// Convert a dot notation IP to long format
function ip2long(ip) {
	var iplong = 0;
    var ips = ip.split('.');
	if(ips.length > 4) {
		return false;
	}
    with (Math) {
        iplong = ips[0]*pow(256,3)+ips[1]*pow(256,2)+ips[2]*pow(256,1)+ips[3]*pow(256,0);
    }
    return iplong;
};

// Convert a long IP address to dot notation
function long2ip(l) {
    with (Math) {
        var ip1 = floor(l/pow(256,3));
        var ip2 = floor((l%pow(256,3))/pow(256,2));
        var ip3 = floor(((l%pow(256,3))%pow(256,2))/pow(256,1));
        var ip4 = floor((((l%pow(256,3))%pow(256,2))%pow(256,1))/pow(256,0));
    }
    return ip1 + '.' + ip2 + '.' + ip3 + '.' + ip4;
};

// Test an IP address in CIDR notation to make sure it is valid.
function isValidCIDR(cidr) {
	var parts = cidr.split('/');
	if(parts.length != 2) {
		return false;
	}
	
	// Nothing bigger than a class 'C' network.
	if(parts[1] > 32 || parts[1] < 24) {
		addError("Block can not be larger than a class C (i.e. /24)");
		return false;
	}
	if(!isValidIP(parts[0])) {
		return false;
	}
	return true;
};

// Return the last IP in a netblock
function lastIP(ip, mask) {
	ip = ip2long(ip);
    ip = ip + (Math.pow(2, (32 - mask))-1);
	return long2ip(ip);
};

// Test an IP address to make sure it is valid.
function isValidIP(ip) {
	try {
		var result = ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
		if(result.length > 0) {
			return true;
		}
	} catch(e) {
		return false;
	}
	return false;
};

// Reverse the octets in an ARPA IP.
function reverseIP(ip) {
	if(!isValidIP(ip)) {
		return false;
	}
	var result = ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);
	if(result.length < 5) {
		return false;
	}
	var rip = result[4] + "." + result[3] + "." + result[2] + "." + result[1];
	return rip;
};

// Get the number of segments in an IP address
function numSegs(ip) {
	if(ip == null || ip.length <= 0) {
		return 0;
	}
	if((typeof ip) != 'string') {
		return 0;
	}
	var parts = ip.split('.');
	return parts.length;
};

// {{{ getEl()

function getEl(eid) {
	try {
		if(eid.match('#')) {
			var el = jQuery(eid).get(0);
			return el;
		} else {
			return document.getElementById(eid);
		}
	} catch(e) {
		return false;
	}
	
	return false;
};

// }}}

// {{{ sendJSON()

function sendJSON(res, data, callback) {
	var url = new String();
	if(res == null) {
		return false;
	}
	url = JDATA_URL+res+'.php';
	jQuery.getJSON(url, data, callback);
	return true;
};

// }}}

// {{{

function clearSearchField() {
	try {
		jQuery(this).val('');
		jQuery(this).removeClass('clearable');
		jQuery(this).unbind('click');
	} catch(e) {
		return fail(e);
	}
};

//}}}


/// {{{ serialize()
/**
 * Serialize an array for storage
 */
function serialize(data) {
	var ts = data.toString();
  var namevalue = "";
  for (var el in data) {
    namevalue += "&" + escape(el) +
                 "=" + escape(data[el]);
  }
  return namevalue.substring(1);
};

// }}}


function unserialize(data) {
	var o = new Array();
	if(data == null || data.length <= 0) {
		return false;
	}
	var pairs = data.split(/&/g);
	for (var i=0; i<pairs.length; i++) {
		var part = pairs[i].split('=');
		var key = unescape(part[0]);
		var val = unescape(part[1]);
		MSET.addByIndex(key, val);
		// o["#"+key] = val;
	}
	return MSET;
};

// {{{ redirectBrowser()
/**
 * Simple function to redirect the user using javascript.
 */
function redirectBrowser(txtid) {
	var url = jQuery(txtid).val();
	if(url == null) {
		return false;
	}
	
	document.location = url;
};

// }}}

/**
 * Remove duplicates from an array.
 */
function RemoveDuplicates(arr, nosort) {
	// get array as input and returns the same array without duplicates.
	var result=new Array();
	var lastValue="";
	
	if(!nosort) {
		arr.sort();
	}
	
	for (var i=0; i<arr.length; i++) {
		var curValue=arr[i];
		// Skip blank indexes.
		if(curValue == null || curValue == "") {
			continue;
		}
		if (curValue != lastValue) {
			result[result.length] = curValue;
		}
		lastValue=curValue;
	}
	return result;
};

/**
 * Called once the document has finished loading.
 **/
$(document).ready(function() {
	jQuery('.clearable').click(clearSearchField);
});

