/****************************/
/* Javascript commonly used */
/****************************/

/**
 * Is element in array
 * @param p_val element to check
 * @return booleen is element in array ?
 */
Array.prototype.in_array = function(p_val) {
	for(var i = 0, l = this.length; i < l; i++) {
		if(this[i] == p_val) {
			return true;
		}
	}
	return false;
};

/**
 * Apply function to every item of array
 * @param fct - function to apply
 * @return Array
 */
Array.prototype.map = function (fct) {
	var narr = new Array();
	for(var i = 0; i<this.length; i++) {
		narr[i] = fct(this[i]);
	}
	return narr;
};

/**
 * Clone array
 * @return array clone
 */
Array.prototype.clone = function () {
	var clone = new Array();
	for(var i=0; i< this.length; i++) {
		clone[i] = this[i];
	}
	return clone;
};


if(check_nav() != "MOZ") {
	/**
	 * Represent the source code of an Array (Mozilla built-in)
	 * @return String
	 */
	Array.prototype.toSource = function () {
		var str = "[";
		for(var i=0; i<this.length; i++) {
			if(this[i] instanceof Array) {
				str += this[i].toSource() + ", ";
			} else {
				str += this[i] + ", ";
			}
		}
		str += "]";
		return str.replace(/, \]/, "]");
	};
}

/**
 * Empty fields of div
 * @param divName string id of div to clean
 */
function emptyDivFields(divName){
	var div = document.getElementById(divName);
	if (! div) {return false;}
	var eltTypes = new Array("input", "select", "textarea");
	for(var j=0;j<eltTypes.length;j++) {
		var elts = div.getElementsByTagName(eltTypes[j]);
		for(var i=0;i<elts.length;i++) {
			try {elts[i].value = 0;} catch (e) { /* nothing to do */ }
			try {elts[i].value = '';} catch (e) { /* nothing to do */ }
		}
	}
	return true;
}

function pushCookie(name, value)
{
	var argv    = pushCookie.arguments;
	var argc    = pushCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path    = (argc > 3) ? argv[3] : null;
	var domain  = (argc > 4) ? argv[4] : null;
	var secure  = (argc > 5) ? argv[5] : false;
	document.cookie=name+"="+escape(value)+
	((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
	((path==null) ?    "" : ("; path="+path))+
	((domain==null) ?  "" : ("; domain="+domain))+
	((secure!=true) ?  "" : "; secure");
}

function popCookie(name)
{
	var arg  = name+"=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i    = 0;
	while ( i < clen )
	{
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
		i=document.cookie.indexOf(" ", i)+1;
		if (i==0) break;
	}
	return null;
}

function getCookieVal(offset)
{
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1) endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}

function flushCookie(name)
{
	date=new Date;
	date.setFullYear(date.getFullYear()-1);
	pushCookie(name,null,date);
}

function saveVerticalScroll()
{
	var curUrl   = window.location;
	var cookie   = popCookie('verticalScroll');
	var date     = new Date;
	date.setDate(date.getDate()+1);
	var newUrl   = '';

	if( cookie ) {
		if( (cookie.length + curUrl.toString().length) < 1000  ) {
			newUrl = curUrl+':'+document.body.scrollTop;
		}
		else {
			if( curUrl.toString().length < 1000 ){
				var index = 0;
				while( ( (cookie.length + curUrl.toString().length ) > 1000  ) ) {
					index  = cookie.indexOf('|');
					cookie = cookie.substring(index, cookie - index);
				}
			}
			newUrl = curUrl+':'+document.body.scrollTop;
		}
		cookie += (cookie != '' ? '|' : '')+newUrl;
		pushCookie('verticalScroll', cookie, date, '/');
	}
	else {
		cookie = curUrl+':'+document.body.scrollTop;
		pushCookie('verticalScroll', cookie, date, '/');
	}
}

function loadVerticalScroll()
{
	var curUrl = window.location+'';
	var cookie = popCookie('verticalScroll');
	if( cookie && cookie != '') {
		var found = false;
		var posit = 0;
		var posY  = 0;
		var url   = '';
		var prevUrls = cookie.split('|');
		var prevUrl  = prevUrls.pop();
		var param    = '';
		var params   = new Array();
		while( prevUrl && found == false ) {
			posit  = parseInt(prevUrl.lastIndexOf(':',prevUrl.length));
			posY   = prevUrl.substring(posit+1, prevUrl.length );
			url    = prevUrl.substring(0,posit);
			params = url.split('&');
			if( url.indexOf('?') != -1 ) {
				posit     = url.indexOf('?',0);
				params[0] = url.substring(0, posit);
				param     = url.substring(posit+1, url.length).split('&');
				params.push(param[0]);
			}
			param  = params.pop()
			found  = (param != undefined);
			while( param != undefined && found == true) {
				if( curUrl.indexOf(param) == -1 ) {
					found = false;
				}
				param = params.pop()
			}
			if( found ) {
				document.body.scrollTop=posY;
				return true;
			}
			prevUrl = prevUrls.pop();
		}
	}
	else
		return false;
	return true;
}

/**
 * Navigator detector
 * @param showVersion booleen append version to navigator name
 * @return string navigator identifiant
 */
function check_nav (showVersion) {
	if (navigator.appName == "Netscape"){
		return "MOZ";
	} else if (navigator.appName == "Microsoft Internet Explorer") {
		if (showVersion) {
			var patt = new RegExp(/MSIE (\d+)/);
			return "IE"+patt.exec(navigator.appVersion)[1];
		} else {
			return "IE";
		}
	} else {
		return "OTHER";
	}
}

/**
 * Debug message diplay (only for development purpose)
 * @param msg string message to display
 */
function debugMsg(msg) {
	var box = debugMsg.box || null;
	if (box == null) {
		box = document.createElement("div");
		box.className = "sunsetStyleDebug";
		document.body.appendChild(box);
		debugMsg.box = box;
	}
	box.innerHTML += msg + "<br />";
}

/**
 * HighLigth a Dom Element
 * @param elt DomNode
 * @param alphaIndex float (0 <= alphaIndex <= 1)
 * @return
 */
function highlightDomElt(elt, alphaIndex) {
	if(alphaIndex == null) {alphaIndex = 0.55;}
	if(elt == null) return;
	if(elt.style.filter != null) elt.style.filter='alpha(opacity='+(alphaIndex*100)+')'; //IE
	else if(elt.style.MozOpacity != null) elt.style.MozOpacity = alphaIndex; //Ffx
	else if(elt.style.KhtmlOpacity != null) elt.style.KhtmlOpacity = alphaIndex; // Konqueror & Safary
	else if(elt.style.opacity != null) elt.style.opacity = alphaIndex; //W3C
}

/**
 * class ClonePart - to use duplicate part of document
 * @param srcid string element to duplicate
 * @param dstid string node where element are duplicated
 * @param idprefix string duplicated element id will be {idprefix}_{nbr}
 * @param cloneActions function action to do on duplicated nodes
 * @param nbr integer nb of initial nodes
 */
function ClonePart(srcid, dstid, idprefix, cloneActions, nbr) {
	this.src = document.getElementById(srcid);
	this.dst = document.getElementById(dstid);
	this.cloneActions = cloneActions;
	this.idprefix = idprefix;
	this.nbr = nbr == null ? 0 : nbr;
}
/**
 * Add one element
 */
ClonePart.prototype.add = function () {
	var clone = this.src.cloneNode(true);
	this.nbr++;
	clone.id = this.idprefix + String(this.nbr);
	if(this.cloneActions instanceof Function) {
		this.cloneActions(clone);
	}
	this.dst.appendChild(clone);
};
/**
 * Delete one element
 */
ClonePart.prototype.del = function () {
	this.dst.removeChild(document.getElementById(this.idprefix + String(this.nbr)));
	this.nbr--;
};
/**
 * Change nb element to newNbr
 * @param newNbr integer
 */
ClonePart.prototype.change = function (newNbr) {
	if(this.nbr < newNbr) {
		for(var i=this.nbr; i<newNbr; i++) {
			this.add();
		}
	} else if (this.nbr > newNbr) {
		for(var i=this.nbr; i>newNbr; i--) {
			this.del();
		}
	} else {
		/* nothing to do */
	}
};

/**
 * Is string a real positive number ?
 * @param str string
 * @return booleen
 */
Math.isRealPositiveNumber = function (str) {
	return (str.search(/^\d+(\.\d+)?((e|E)(-|\+)?\d+)?$/) == 0);
};

/**
 * Is string a real number ?
 * @param str string
 * @return booleen
 */
Math.isRealNumber = function (str) {
	return (str.search(/^-?\d+(\.\d+)?((e|E)(-|\+)?\d+)?$/) == 0);
};

/**
 * Is string an integer ?
 * @param str string
 * @return booleen
 */
Math.isInteger = function (str) {
	return (str.search(/^-?\d+$/) == 0);
};

/**
 * Sort table by click on column
 * @param form domElement
 * @param nc column
 */
function sunset_table_column_sort(form, nc) {
	try {
		cf = form['sunset_table_column_sort[column]'];
		of = form['sunset_table_column_sort[order]'];
		oc = cf.value;
		oo = of.value;
		if(nc != oc) {
			cf.value = nc;
			of.value = "ASC";
		} else {
			if(oo != "ASC") {
				cf.value = '';
				of.value = '';
			} else {
				of.value = "DESC";
			}
		}
		form.submit();
	} catch (err) {
		/* Nothing to do. */
	}
}
