 // JavaScript Document

// Include libs
var gLibArray = [];
function require(inLibPath) {
	if(gLibArray[inLibPath]) return;
	document.write('<script type="text/javascript" src="javascripts/'+ inLibPath +'"></script>');
	gLibArray[inLibPath] = true;
}

// Global variables
var hostname;

/*******************************************
	Global variables
*******************************************/
var edconfd_path="/cgi-bin/public/edconfd.cgi";
var edconfd_old_path="/cgi-bin/public/edconfd-old.cgi";
var xmlFeed=false;
var lang = new Array("en","fr","de","it","es","nl","sw","da","jp");//,"zhT","zhS");
var litlang = new Array("english","fran&ccedil;ais","deutsch","italiano","espa&ntilde;ol","dutch","svenska","dansk","japanese");//,"chinese-tr","chinese-si");
var gecko= (document.implementation && document.implementation.createDocument) ? true:false;
var ie = (window.ActiveXObject && document.all)?true:false;
var ie7 = (window.XMLHttpRequest)?true:false; //not complete safari equal
var w3c = (document.getElementById)?true:false;
//array of group to know which are already set or not
var groupTab = new Array();
var arrLinkId = new Array('_0','_1','_2');
var connectedUser;
var groupMember = new Array();
var shareMember = new Array();
var userMember = new Array();
var first=0;
var hostname = null;
var user = "";
var LastSuccessCmd="";

var httpObj; 
_factories = [
	function() { return new XMLHttpRequest(); },
	function() { return new ActiveXObject("Msxml2.XMLHTTP"); },
	function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
];

_factory = null;

/*******************************************
	Browser Detection
*******************************************/
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";
		if ((this.browser=="Explorer")&&(this.version=="6"))
			this.version = "7";
		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();

/*****************************************
	getHttpObject
*****************************************/
function getHttpObject() {
	if (_factory != null) return _factory();

	for (var i=0; i< _factories.length; i++) {
		try {
			var factory = _factories[i];
			var request = factory();
			if (request != null) {
				_factory = factory;
				return request;
			}
		}
	
		catch (e) {
			continue;
		}	
	}

	_factory = function() {
		throw new Error("XMLHTTPRequest not supported");
	}
	_factory();
}
/*****************************************
	makeHttpCall
*****************************************/
function makeHttpCall(method, url, callback, postdata)
{	
	httpObj = new getHttpObject();	
	if (httpObj) {
		if ((BrowserDetect.browser=="Explorer")&&(BrowserDetect.version=="7"))
			httpObj.open(method, url+"&date="+escape(new Date()), true);
		else
			httpObj.open(method, url, true);
		httpObj.setRequestHeader("Cache-Control","no-cache"); // does not work under IE 7
		httpObj.onreadystatechange = callback;		
		if (method == "GET")
			httpObj.send(null); // This can be null if no arguments are required.
		else
			httpObj.send(postdata); // This can be null if no arguments are required.	
	}
}
/*****************************************
	fixXMLMimeType
*****************************************/
function fixXmlMimeType(filename)
{
	oxmlhttp = null;
	try {
		oxmlhttp = new XMLHttpRequest();
		oxmlhttp.overrideMimeType("text/xml");
	}
	catch(e) {
		try {
			oxmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e) {
			return null;
		}
	}
	
	if (!oxmlhttp) return null;				

	try {
		oxmlhttp.open("GET", filename, false);
		oxmlhttp.send(null);	
	}
	catch(e) {
		return null;
	}

	return oxmlhttp.responseXML;
}
/*****************************************
	createXMLDocument
*****************************************/
function createXMLDocument()
{
	var doc;
	
	if (document.implementation && document.implementation.createDocument)
        	var doc = document.implementation.createDocument('', '', null);
		else if (window.ActiveXObject) {
            try {
            	var doc = new ActiveXObject('Msxml2.XMLDOM');
            } catch (e) {
              	var doc = new ActiveXObject('Microsoft.XMLDOM');
            }
		}
		
	return doc;
}
/*****************************************
	importXML
*****************************************/
function importXML(FeedParserFile)
{	
	// For Gecko Browsers
	if (gecko) {	
		xmlFeed = document.implementation.createDocument("", "", null);
		xmlFeed.async=false;
		//For Konqueror
		if (navigator.userAgent.indexOf('Konqueror')!=-1)
			xmlFeed.load(FeedParserFile);
		else
			xmlFeed = fixXmlMimeType(FeedParserFile);											
	} else if (ie) {	
		xmlFeed = new ActiveXObject("Microsoft.XMLDOM");
		xmlFeed.async=false;
		xmlFeed.load(FeedParserFile);
	} else return false;
	
	if (typeof xmlFeed != "undefined") 
		return xmlFeed;
	else 
		return false;
}

/*****************************************
  setCookie
  
   name - name of the cookie
   value - value of the cookie
   [expires] - expiration date of the cookie (defaults to end of current session)
   [path] - path for which the cookie is valid (defaults to path of calling document)
   [domain] - domain for which the cookie is valid (defaults to domain of calling document)
   [secure] - Boolean value indicating if the cookie transmission requires
     a secure transmission
   * an argument defaults when it is assigned null as a placeholder
   * a null placeholder is not required for trailing omitted arguments
*****************************************/
function setCookie(name, value, expires, path, domain, secure)
{
  var curCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  document.cookie = curCookie;
}
/*****************************************
  getCookie
  
  name - name of the desired cookie
  return string containing value of specified cookie or null
  if cookie does not exist
*****************************************/
function getCookie(name)
{
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}
/*****************************************
  deleteCookie
  
   name - name of the cookie
   [path] - path of the cookie (must be same as path used to create cookie)
   [domain] - domain of the cookie (must be same as domain used to create cookie)
   path and domain default if assigned null or omitted if no explicit
     argument proceeds
*****************************************/
function deleteCookie(name, path, domain)
{
  if (getCookie(name)) {
    document.cookie = name + "=" +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
}
/*****************************************
getText
*****************************************/
function getText(oNode)
{
	var sText = "";
	
	//if the node is null then return an empty string
	if (!oNode)
		return sText;
	
	for (var i = 0; i < oNode.childNodes.length; i++) {
		if (oNode.childNodes[i].hasChildNodes()) {
			sText += getText(oNode.childNodes[i]);
		} else {
			sText += oNode.childNodes[i].nodeValue;
		}
	}
	return sText;
}
/*****************************************
	getLanguage
*****************************************/
function getLanguage()
{
	if (navigator.appName == 'Netscape') //netscape
		var language = navigator.language;
	else
		var language = navigator.userLanguage; //other

	return language;
	//var code = language.substring(0,2);
}
/*****************************************
getTranslation
*****************************************/
var language;
var xmlDoc;
var xmlDocEN=importXML("translations/en.xml");
function getTranslation(id)
{
	//Detect language settings
	//document.cookie = "cookieName=cookieValue";
	language = getCookie("language");
	if (!language)
		language = getLanguage().substring(0,2);
	
	if (language=="en")
		if (xmlDocEN.getElementsByTagName(id).length!=0)
			return xmlDocEN.getElementsByTagName(id)[0].firstChild.nodeValue;
		else
			return id;
	
	if (!xmlDoc)
	{
		xmlDoc=importXML("translations/" + language + ".xml");
		if (xmlDoc.getElementsByTagName(id).length!=0)
			return xmlDoc.getElementsByTagName(id)[0].firstChild.nodeValue;
		else
			if (xmlDocEN.getElementsByTagName(id).length!=0)
				return xmlDocEN.getElementsByTagName(id)[0].firstChild.nodeValue;
			else
				return id;
	}else{
		if (xmlDoc.getElementsByTagName(id).length!=0)
			return xmlDoc.getElementsByTagName(id)[0].firstChild.nodeValue;
		else
			if (xmlDocEN.getElementsByTagName(id).length!=0)
				return xmlDocEN.getElementsByTagName(id)[0].firstChild.nodeValue;
			else
				return id;			
	}					
}
/*****************************************
	getCopyright
*****************************************/
function getCopyright() {
	$('copyright').update('<a href="http://www.lacie.com">&copy; LaCie 2008</a>');
}

/*****************************************
	getMenu
*****************************************/
function getMenu(inTarget) {
	var myBuffer = '';
	var mySelectString = '';
	var i = 0, j = 0;
	
	var myMenuTree = [
		{
			name: 'users',
			title: getTranslation("id100"),
			target: 'users.html'
		},
		{
			name: 'groups',
			title: getTranslation("id200"),
			target: 'groups.html'
		},
		{
			name: 'shares',
			title: getTranslation("id300"),
			target: 'share.html'
		},
		{
			name: 'system',
			title: getTranslation("id400"),
			target: 'system.html',
			children: [
				{
					name: 'network',
					title: getTranslation("id500"),
					jstarget: 'getNetwork'
				},
				{
					name: 'raid',
					title: getTranslation("id609"),
					jstarget: 'getRaid',
					dontshow: !gDeviceInfo.getSupportRaid()
				},
				{
					name: 'disks',
					title: (gDeviceInfo.getSupportRaid() ?
						getTranslation("idexternalDisks") : getTranslation("iddisks")
					),
					jstarget: 'getDisks'
				},
				{
					name: 'status',
					title: getTranslation("id415"),
					jstarget: 'getStatus'
				},
				{
					name: 'maintenance',
					title: getTranslation("id445"),
					jstarget: 'getMaintenance'
				}
			]
		},
		{
			name: 'multimedia',
			title: getTranslation('idmultimedia'),
			target: 'multimedia.html',
			action: 'goto.mmedia'
		},
		{
			name: 'download',
			title: getTranslation("id804"), // Download
			target: 'download.html',
			action: 'goto.dllist',
			children: [
				{
					name: 'dladdtr',
					title: getTranslation('iddlAddTorrent'),
					action: 'goto.dladdtr'
				},
				{
					name: 'dlconfig',
					title: getTranslation('id411'), // Configuration
					action: 'goto.dlconfig'
				}
			]
		},
		{
			name: 'backup',
			title: getTranslation('idbackup'),
			target: 'backup.html',
			action: 'goto.bklist',
			children: [
				{
					name: 'bkaddjob',
					title: getTranslation('idbkAddJob'),
					action: 'goto.bkaddjob'
				}
			]
		},
		{
			name: 'user',
			title: getTranslation("id800"),
			target: 'user.html'
		}
	];
	
	for(i=0; i<myMenuTree.length; i++) {
		var myTreeItem = myMenuTree[i];
		var myEvent = '';
		var myTarget = myTreeItem.target;
		
		if(myTreeItem.dontshow) continue;
		
		if(inTarget == myTreeItem.name) {
			myBuffer += '<div id="menu_select">';
			
			if(myTreeItem.jstarget) {
				myEvent = ' onclick="'+ myTreeItem.jstarget +'();"';
				myTarget = '#';
			} else if(myTreeItem.action) {
				myEvent = ' onclick="action(\''+ myTreeItem.action +'\');"';
				myTarget = '#'+ myTreeItem.action;
			}
		}
		else myBuffer += '<div id="menu_unselect">';
		myBuffer += '<p><a href="'+ myTarget +'"'+ myEvent +'>'+ myTreeItem.title +'</a></p>';
		
		if(myTreeItem.children) {
			var myShowSubMenu = (inTarget == myTreeItem.name);
			
			if(!myShowSubMenu) {
				for(j=0; j<myTreeItem.children.length; j++) {
					if(inTarget == myTreeItem.children[j].name) myShowSubMenu = true;
				}
			}
			
			if(myShowSubMenu) {
				for(j=0; j<myTreeItem.children.length; j++) {
					var myTreeSubItem = myTreeItem.children[j];
					var myEvent = '';
					var myTarget = myTreeSubItem.target || '#';
					
					if(myTreeSubItem.dontshow) continue;
					
					if(inTarget == myTreeSubItem.name) myBuffer += '<div id="menu_unmore">';
					else myBuffer += '<div id="menu_more">';
					
					if(myTreeSubItem.jstarget) {
						myEvent = ' onclick="'+ myTreeSubItem.jstarget +'();"';
					} else if(myTreeSubItem.action) {
						myEvent = ' onclick="action(\''+ myTreeSubItem.action +'\');"';
						myTarget = '#'+ myTreeSubItem.action;
					}
					
					myBuffer +=
						'<p><a href="'+ myTarget +'"'+ myEvent +'>'
						+ ((inTarget == myTreeSubItem.name) ? ' &gt; ':'')
						+ myTreeSubItem.title +'</a></p>';
					myBuffer += '</div>';
				}
			}
		}
		
		myBuffer += '</div>';
	}
	
	$('menu').update(myBuffer);
	
	return;
}

function setLangCookie(inLang) {
	var date = new Date();
	date.setTime(date.getTime()+(365*24*60*60*1000));
	setCookie("language", inLang, date);
	window.location.reload();
}

/*****************************************
	setInfo	
*****************************************/
function setInfo(txt)
{	
	document.getElementById('status').innerHTML = txt;
}
/*****************************************
	getInfo
*****************************************/
function getInfo()
{
	user = UTF8.decode(getCookie("login") || getTranslation('idguest').toLowerCase());
	
	language = getCookie("language");
	if (!language) {	
		language = getLanguage().substring(0,2);
	}
	
	var sel='<select id="sellang" onChange="setLangCookie(this.value);">';
	for (var i=0; i<lang.length; i++)
		if (lang[i]==language)
			sel+="<option value='"+lang[i]+"' selected>"+litlang[i]+"</option>";
		else
			sel+="<option value='"+lang[i]+"' >"+litlang[i]+"</option>";
	sel+="</select>";
	
	var myBuffer =
		gDeviceInfo.getTimeString() +', '
		+ gDeviceInfo.getDateString()
		+ ' | '+ sel
		+ ' | '+ user +'@'+ gDeviceInfo.getHostname()
		+ ' | <a href="javascript:logout();">'+ getTranslation('idlogOut') +'</a>';
	
	$('info').update(myBuffer);
}

/*****************************************
	logout
*****************************************/
function logout() {
	
	new EdconfRequest({
		methodName: 'logout',
		callback: function(inXmlData) {
			deleteCookie("session");
			deleteCookie("login");
			window.location.href="/login.html";
		}
	});
}

/*****************************************
	getsharelist
*****************************************/
//set the shares list with permissions
function getsharelist(obj)
{
			var fido = obj.getXml();
			var content=new Array("<table class='tableList4'>",
				"<thead><tr>",				
				"<th onClick=\"sortTable('tableList4',0)\">",getTranslation("id300"),"</th>",
				"<th><img src='/images/file_edit.png' title=\"",getTranslation("id318"),"\"/></th>",
                                "<th><img src='/images/file_lock.png' title=\"",getTranslation("id317"),"\"/></th>",
                                "<th><img src='/images/file_remove.png' title=\"",getTranslation("id29"),"\"/></th>",
				"</tr></thead><tbody><tr><td colspan='4'><div class='innerb' style='height:200px;'><table class='tableList4' id='tableList4' cellspacing='0' cellpadding='0' border='0'>");
			var len=fido.getElementsByTagName('share').length;
			for (var i=0; i<len; i++) {			
				var name=fido.getElementsByTagName('share')[i].getAttribute('name');
				var access=fido.getElementsByTagName('share')[i].getAttribute('access');
				shareMember[i]=fido.getElementsByTagName('share')[i].getAttribute('name');
				var radro=false;
				var radna=false;
			 	var radrw=false;
				if (access=='full') 
					radrw='checked';				
				else
					 if (access=='read-only') 
						radro='checked';
					else
						 radna='checked';													
				var buffer = new Array("<tr onMouseOver=\"this.bgColor='99CCFF';\" onMouseOut=\"this.bgColor='white';\">",
									   "<td>",cutText(escapeHTML(name), 20),"</td><td><div align='center'><input type='radio' id='",encodeForDomId(name),
									   "_rad_rw' name='",encodeForDomId(name),"_rad_rw' onClick=\"javascript:{enableApply(); checkRadio('",encodeForDomId(name),"','rw');}\" ",radrw,
									   " ></div><td><div align='center'><input type='radio' id='",
									   encodeForDomId(name),"_rad_ro' name='",encodeForDomId(name),"_rad_ro' onClick=\"javascript:{enableApply(); checkRadio('",encodeForDomId(name),"','ro');}\" ",
									   radro," ></div></td><td><div align='center'><input type='radio' id='",encodeForDomId(name),"_rad_na' name='",encodeForDomId(name),
									   "_rad_na' onClick=\"javascript:{enableApply(); checkRadio('",encodeForDomId(name),"','na');}\" ",radna," ></div></td></tr>");
				content[content.length]=buffer.join("");
			}
			content[content.length]="</table></div></td></tr></tbody></table>";
			document.getElementById('displaylist').innerHTML=content.join("");			
			firstSortTable('tableList4',0);
}
/*****************************************
	checkReturn
*****************************************/
function checkReturn(h_obj)
{	
	var sPath = window.location.pathname;	
	var sPage = sPath.substring(sPath.lastIndexOf('/') + 1);

	if (h_obj.readyState == 4) {
		switch (h_obj.status) {
			case 200 :
				var feed = h_obj.responseXML.documentElement;			
				var type = feed.getElementsByTagName('returnValue')[0].getAttribute('type');

				if ( type=="ok")	
					switch (sPage)
					{
						case "users.html" :
							getUsersList();
							break;
						case "groups.html" :
							getGroupsList();
							break;
						case "share.html" :
							getSharesList();
							break;
						case "media.html" :
							getMediaList()
							break;
						case "system.html" :
							getSystemInfo();
							break;
						default :
							window.location.href="login.html";
					}
				else{
					if (feed.getElementsByTagName('returnValue')[0].getAttribute('method')=="addShare") {
						setStatus('error', getTranslation('id324'));
						document.getElementById('hidbut').style.visibility="visible";
					}else{
						setStatus('error',
							  feed.getElementsByTagName('returnValue')[0].getAttribute('type')
							+ " : "
							+ feed.getElementsByTagName('returnValue')[0].getAttribute('method')
						);
					}
					LastSuccessCmd="";
				}
				break;
			case 403 :
				window.location.href=h_obj.getResponseHeader("location");
				break;
			case 0 :
				window.location.href="login.html";
				break;
			default :
				setInfo("<font color=\"red\"><img src='images/button_cancel.png'>&nbsp;"+h_obj.status+" : "+getTranslation("id24")+"</font>");
		}							       			
	}
}
/*****************************************
	checkRadio
*****************************************/
//exclusive button mode to set permissions on the shares
function checkRadio(share,type)
{	
	var ro=share+"_rad_ro";
	var rw=share+"_rad_rw";
	var na=share+"_rad_na";

	if (type=='rw')
	{		
		document.getElementById(ro).checked=false;
		document.getElementById(na).checked=false;	
	}else{
		if (type=='ro')
		{
			document.getElementById(rw).checked=false;
			document.getElementById(na).checked=false;
		}else{
			document.getElementById(rw).checked=false;
			document.getElementById(ro).checked=false;
		}
	}
}
/*****************************************
	multiClass
*****************************************/
//navigate with tab
function multiClass(eltId) 
{
	var intNbLinkElt = new Number(arrLinkId.length);	
	var arrClassLink = new Array('current','ghost');
	var strContent = new String();
	for (i=0; i<intNbLinkElt; i++) {
		strContent = "menu"+arrLinkId[i];
		if ( arrLinkId[i] == eltId ) {
			document.getElementById(arrLinkId[i]).className = arrClassLink[0];
			document.getElementById(strContent).className = 'on content';
		} else {
			document.getElementById(arrLinkId[i]).className = arrClassLink[1];
			document.getElementById(strContent).className = 'off content';
		}
	}	
}
/*****************************************
	sortTable
*****************************************/
//alphanumerical sort display list table 
function sortTable(tableId, columnIndex)
{
	var table = document.getElementById(tableId);
	var rowsNb = table.rows.length;	
	if (rowsNb>0)
	{	
		var colsNb = table.rows[0].cells.length;
	
		var column2copy = new Array();
		var newcolumn = new Array(); 
		var sortedCol = new Array(); 
		var local;
			
		for (var i=0; i < rowsNb; i++){
			local=table.rows[i].cells[columnIndex].firstChild;
			if(!local.attributes) local = local.nodeValue;
			else local=table.rows[i].cells[columnIndex].firstChild.getAttribute('value');
			if (!local) {
				local=table.rows[i].cells[columnIndex].firstChild;
				if(local.nextSibling) local = local.nextSibling;
				if(local.firstChild) local = local.firstChild.nodeValue;
				else local = local.nodeValue;
			}
			newcolumn[i]=local.toLowerCase();
		}
		
		newcolumn.sort();
		if (first)
			newcolumn.reverse();
		for (var i=0; i< rowsNb; i++)
		{
				var index=i;
				for (var j=i; j<rowsNb; j++)
				{
					local=table.rows[j].cells[columnIndex].firstChild;
					if(!local.attributes) local = local.nodeValue;
					else local=table.rows[j].cells[columnIndex].firstChild.getAttribute('value');
					if (!local) {
						local=table.rows[j].cells[columnIndex].firstChild;
						if(local.nextSibling) local = local.nextSibling;
						if(local.firstChild) local = local.firstChild.nodeValue;
						else local = local.nodeValue;
					}
					local=local.toLowerCase();	
					if (local==newcolumn[i])
					{
						index=j;
						break;
					}
				}

				var storeContent;
				var newStyle;
				var oldStyle;
				if (index!=i)
				{
					for (var j=0; j<colsNb; j++){
						storeContent=table.rows[i].cells[j].innerHTML;
						oldStyle=table.rows[i].cells[j].getAttribute('style');
						newStyle = table.rows[index].cells[j].getAttribute('style');
						table.rows[i].cells[j].innerHTML=table.rows[index].cells[j].innerHTML;
						table.rows[index].cells[j].innerHTML=storeContent;

						// CSS
						table.rows[i].cells[j].setAttribute('style',newStyle);
						table.rows[index].cells[j].setAttribute('style',oldStyle);
					}
					// BETTER THAN THE FOR LOOP BUT NOT WORKING UNDER IE...
					//	storeContent=table.rows[i].innerHTML;
					//	table.rows[i].innerHTML=table.rows[index].innerHTML;
					//	table.rows[index].innerHTML=storeContent

						storeContent=table.rows[i].getAttribute('style');
						newStyle = table.rows[index].getAttribute('style');
						table.rows[i].setAttribute('style',newStyle);
						table.rows[index].setAttribute('style',storeContent);

				}
		}
		if(first>0)
			first=0;
		else
			first++;
	}
}
function firstSortTable(tableId, columnIndex)
{
	var table = document.getElementById(tableId);
	var rowsNb = table.rows.length;	
	if (rowsNb>0)
	{	
		var colsNb = table.rows[0].cells.length;
	
		var column2copy = new Array();
		var newcolumn = new Array(); 
		var sortedCol = new Array(); 
		var local;
			
		for (var i=0; i < rowsNb; i++){
			local=table.rows[i].cells[columnIndex].firstChild;
			if(!local.attributes) local = local.nodeValue;
			else local=table.rows[i].cells[columnIndex].firstChild.getAttribute('value');
			if (!local) {
				local=table.rows[i].cells[columnIndex].firstChild;
				if(local.nextSibling) local = local.nextSibling;
				if(local.firstChild) local = local.firstChild.nodeValue;
				else local = local.nodeValue;
			}
			newcolumn[i]=local.toLowerCase();
		}
		
		newcolumn.sort();
		for (var i=0; i< rowsNb; i++)
		{
				var index=i;
				for (var j=i; j<rowsNb; j++)
				{
					local=table.rows[j].cells[columnIndex].firstChild;
					if(!local.attributes) local = local.nodeValue;
					else local=table.rows[j].cells[columnIndex].firstChild.getAttribute('value');
					if (!local) {
						local=table.rows[j].cells[columnIndex].firstChild;
						if(local.nextSibling) local = local.nextSibling;
						if(local.firstChild) local = local.firstChild.nodeValue;
						else local = local.nodeValue;
					}
					local=local.toLowerCase();
					if (local==newcolumn[i])
					{
						index=j;
						break;
					}
				}

				var storeContent;
				var newStyle;
				var oldStyle;

				if (index!=i)
				{
                    for (var j=0; j<colsNb; j++){
                        storeContent=table.rows[i].cells[j].innerHTML;
                        oldStyle=table.rows[i].cells[j].getAttribute('style');
                        newStyle = table.rows[index].cells[j].getAttribute('style');
                        table.rows[i].cells[j].innerHTML=table.rows[index].cells[j].innerHTML;
                        table.rows[index].cells[j].innerHTML=storeContent;

                        // CSS
                        table.rows[i].cells[j].setAttribute('style',newStyle);
                        table.rows[index].cells[j].setAttribute('style',oldStyle);
                    }
                    // BETTER THAN THE FOR LOOP BUT NOT WORKING UNDER IE...
                    //  storeContent=table.rows[i].innerHTML;
                    //  table.rows[i].innerHTML=table.rows[index].innerHTML;
                    //  table.rows[index].innerHTML=storeContent


						storeContent=table.rows[i].getAttribute('style');
						newStyle = table.rows[index].getAttribute('style');
						table.rows[i].setAttribute('style',newStyle);
						table.rows[index].setAttribute('style',storeContent);
				}
		}
		first++;
	}
}
/*****************************************
	badCharacters
*****************************************/
//check if the string contains any bad characters
//return true if any 
function checkForm(input_id, allowed_type, empty_id, translation_id)
{
	var str=document.getElementById(input_id).value;

	if (!str) 
	{
		//check if str is not empty
		javascript:setInfo("<font color=\"red\"><img src='images/button_cancel.png'>&nbsp;"+getTranslation(empty_id)+"</font>");
		return 1;
	}else{
		switch(allowed_type){
			case 'hostname' : 
						var regExp = /^[a-zA-Z0-9-]+$/;
						break;						
			case 'name' : 
						var regExp = /^[^\s:@"'<>;,\\#&]+$/;
						break;
			case 'sharename' : 
						var regExp = /^[^\s:"'<>;,#&*\/\\\[\]|=?]+$/;
						break;
			case 'workgroup' : 
						var regExp = /^[a-zA-Z@&%-_:,!\^\\\(\)]+$/;
						break;
			default : 
					var regExp = /^[\W]+$/;						
		}		
		if (!str.match(regExp))
		{  			
			javascript:setInfo("<font color=\"red\"><img src='images/button_cancel.png'>&nbsp;"+getTranslation(translation_id)+"</font>"); 			
			return 1;
		}else{
			if ((allowed_type=="hostname")||(allowed_type=="workgroup"))
			{
					var regExp = /^[a-zA-Z]/;					
					if (!str.charAt(0).match(regExp))					
					{
						javascript:setInfo("<font color=\"red\"><img src='images/button_cancel.png'>&nbsp;"+getTranslation(translation_id)+"</font>"); 			
						return 1;
					}
			}
			return 0;
		}					
	}
}
/*****************************************
	escapeHTML
*****************************************/
//convert to HTML string
function escapeHTML(str){
   var div = document.createElement('div');
   var text = document.createTextNode(str);
   div.appendChild(text);   
   return div.innerHTML;
}
/*****************************************
	BuildSizeLabel
*****************************************/
//convert size on KB/MB/GB/TB given in bytes
function BuildDecimalSizeLabel(size,base,precision)
{
	if (typeof precision == "undefined") precision = 2;
	return BuildSizeLabelWithDivisor(size, base, precision, 1000);
}
function BuildSizeLabel(size,base,precision)
{
	if (typeof precision == "undefined") precision = 2;
	return BuildSizeLabelWithDivisor(size, base, precision, 1024);
}

function BuildSizeLabelWithDivisor(size, base, precision, divisor)
{
	if (typeof precision == "undefined") precision = 0;
	if(!size) size = 0;
	
	if (base!="to")
		size = parseFloat(size).toFixed(precision);
	switch (base) {		
		case "oc" :
			if (size<1000)				
				label = size;
			else{
				size = size / divisor;
				BuildSizeLabelWithDivisor(size, "ko", precision, divisor);
			}
			break;
		case "ko" :
			if (size<1000)				
				label = parseFloat(size).toFixed(precision) + " KB";
			else{
				size = size / divisor;
				BuildSizeLabelWithDivisor(size, "mo", precision, divisor);
			}
			break;	
		case "mo" :
		 	if (size<1000)			
				label = parseFloat(size).toFixed(precision) + " MB";
			else{
				size = size / divisor;
				BuildSizeLabelWithDivisor(size, "go", precision, divisor);
			}
			break;	
		case "go" :		
			if (size<1000)
				label = parseFloat(size).toFixed(precision) + " GB";
			else{
				size = size / divisor;				
				BuildSizeLabelWithDivisor(size, "to", precision, divisor);
			}
			break;	
		case "to" :
				label = size.toFixed(precision) + " TB";
				break;
		default :
			size = size / divisor;
			size = size.toFixed(0);
			BuildSizeLabelWithDivisor(size, "ko", precision, divisor);
	}
	
	return label;
}
/*****************************************
	getHostname
*****************************************/
function getHostname() {
	if(gDeviceInfo) {
		hostname = gDeviceInfo.getHostname();
		return;
	}
	if (hostname) return;
	
	var hObj = new getHttpObject();	
	if (hObj) {
		try{
		if ((BrowserDetect.browser=="Explorer")&&(BrowserDetect.version=="7"))
			hObj.open("GET", edconfd_path+"?method=getMachineName&date="+escape(new Date()), false);				
		else
			hObj.open("GET", edconfd_path+"?method=getMachineName", false);	
		hObj.send(null);		
			if (hObj.readyState == 4) {
    		if (hObj.status == 200) {
				var fido = hObj.responseXML.documentElement;
				if (fido.getElementsByTagName('hostname').length>0)
					hostname=fido.getElementsByTagName('hostname')[0].firstChild.nodeValue;			
				}
			}
		}
		catch(ex) {
			hostname = "LaCie-Network";
		}
	}
}
/*****************************************
	getHostname
*****************************************/
function displaySuccess()
{
	var txt="&nbsp;";
	switch (LastSuccessCmd)
	{
		case "adduser" :
			txt=getTranslation("id106");
			break;
		case "edituser" :
			txt=getTranslation("id103");
			break;
		case "deluser" :
			txt=getTranslation("id110");
			break;						
		case "addgroup" :
			txt=getTranslation("id212");
			break;
		case "editgroup" :
			txt=getTranslation("id209");
			break;
		case "delgroup" :
			txt=getTranslation("id202");
			break;			
		case "addshare" :
			txt=getTranslation("id302");
			break;
		case "editshare" :
			txt=getTranslation("id305");
			break;
		case "delshare" :
			txt=getTranslation("id304");
			break;
		case "media" :
			txt=getTranslation("id704");
			break;
		case "system" :
			txt=getTranslation("id414");
			break;
		case "network" :
			txt=getTranslation("id511");
			break;
		case "status" :
			txt=getTranslation("id420");
			break;
		case "rebuildMedia" :
			txt=getTranslation("id703");
			break;
		case "restartMedia" :
			txt=getTranslation("id704");
			break;
		case "delfile" :
			txt=getTranslation("id808");
			break;
		case "adminemailpass" :
			txt=getTranslation("id125");
			break;	
		case "adminpwdemailpass" :
			txt=getTranslation("id124");
			break;		
		case "updates" :
			txt=getTranslation("id447");
			break;
		case "raid" :
			txt=getTranslation("id627");
			break;
		case "format" :
			txt=getTranslation("id625");
			break;
		case "eject" :
			txt=getTranslation("id626");
			break;
	}
	if (txt!="&nbsp;")
		setInfo("<img src='images/button_ok.png'><font color=\"blue\">&nbsp;"+txt+"</font>");
	else
		setInfo("<font color=\"blue\">"+txt+"</font>");
	
	LastSuccessCmd="";	
}
/*****************************************
	redirect()
*****************************************/
function redirect(Obj)
{	
	if (Obj.status == 403) {
		window.location.href="/login.html";
	}
	else if (Obj.status == 0)//for Opera
		window.location.href="login.html";
	else if (Obj.status == 301)
		window.location.href=Obj.getResponseHeader("location");
	else
		//window.location.href="login.html";
		setStatus('error', getTranslation('id24'));
}
/*****************************************
	calculateUsage()
*****************************************/
function calculateUsage(res)
{
	var tmp = res ? res.split(" "):[];
	var progress=0;
	
	if (tmp.length>1)
	{
		var i=0;		
		while (i<tmp.length){
			if (tmp[i].indexOf("%")!=-1) {
				progress=tmp[i];
			}
			i++;
		}				
		tmp=progress.split("%");
		progress=tmp[0];
	}
	
	return progress;
}

/****************************************
      Write a small debug message
****************************************/
function debug(inMessage) {
	if(window.console && console.log) {
		console.log(inMessage);
	} else {
		var myDebugDiv = $('debug');
		if(myDebugDiv) {
			myDebugDiv.update(myDebugDiv.innerHTML +'<br/>'+ inMessage);
		}
	}
}

function enableIeDebug() {
	if(Prototype.Browser.IE) {
		var myElements = document.getElementsByClassName('sub_info');
		
		if(myElements && myElements.length>0) {
			myElements[0].id = 'debug';
		}
	}
}

/****************************************
   	Call a CGI function
****************************************/
function callRemoteFunction(inFunctionName, inArgList, inCallBack) {
	var myRequest = new getHttpObject();
	
	if(myRequest) {
		var myReqString = "";
		
		for(var myKey in inArgList) {
			if(!inArgList[myKey]) continue;
			
			myReqString += "&"+ myKey +"="+ inArgList[myKey];
		}
		
		myRequest.open("GET", edconfd_path+"?method="+ inFunctionName + myReqString, false);
		myRequest.send(null);
		if (myRequest.readyState == 4 && myRequest.status == 200) {
			return myRequest.responseXML.documentElement;
		}
	}
	
	return null;
}

/****************************************
   	JavaScript file upload
****************************************/
// Define the "finishSendFile" function in your code
// The form tag should have this property set:
//   onsubmit="return sendFile(this);"
// 
// Credits to WebToolkit
// http://www.webtoolkit.info/ajax-file-upload.html
function sendFile(inForm) {
	// Construct the target IFrame
	var myId = 'f' + Math.floor(Math.random() * 99999);
	var myHiddenDiv = document.createElement('div');
	
	myHiddenDiv.innerHTML = '<iframe style="display:none" src="about:blank" id="'+myId+'" name="'+myId+'" onload="sendFileCallback(\''+ myId +'\');"></iframe>';
	document.body.appendChild(myHiddenDiv);
	inForm.setAttribute('target', myId);
	setStatus('loading', getTranslation('idfileTransfering'));
	
	return true;
}

function sendFileCallback(inId) {
	var myIFrame = $(inId);
	var myDocumentNode = null;
	if(!myIFrame) return finishSendFile();
	
	if (myIFrame.contentWindow) {
		myDocumentNode = myIFrame.contentWindow.document;
	} else if (myIFrame.contentDocument) {
		myDocumentNode = myIFrame.contentDocument;
	} else {
		myDocumentNode = window.frames[inId].document;
	}

	if (myDocumentNode.location.href == "about:blank" || !myDocumentNode.documentElement ) {
		finishSendFile();
	} else {
		var myXmlNode = new XmlData(myDocumentNode.documentElement);
		
		finishSendFile(myXmlNode);
	}
}

function finishSendFile() {}

function cutText(inText, inMaxLen) {
	if(!inMaxLen) inMaxLen = 40;
	
	if(inText.length > inMaxLen) return inText.substr(0, inMaxLen-3) +'...';
	return inText;
}

function isValidEmail(inEmail) {
	return (true == (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(inEmail)));
}

function setStatus(inType, inMessage) {
	var myInfoNode = $('status');
	var myImage = 'button_ok.png';
	if(!myInfoNode) return;
	
	if('clear' == inType) {
		myInfoNode.update('');
		return;
	}
	
	if(inType == 'ok') myImage = 'button_ok.png';
	else if(inType == 'error') myImage = 'button_cancel.png';
	else if(inType == 'loading') myImage = 'loading.gif';
	else if(inType == 'warning') myImage = 'button_warning.png';
	
	myInfoNode.update('<img src="/images/'+ myImage +'"/> '+ inMessage);
}

function intToString(inNumber, inLength) {
	if (typeof inNumber == "undefined") return "0";
	if(!inLength || inLength<0) return inNumber.toString();
	
	var myNumberString = inNumber.toString();
	
	if(myNumberString.length > inLength) {
		myNumberString = '#'.times(inLength);
	} else if(myNumberString.length < inLength) {
		myNumberString = '0'.times(inLength-myNumberString.length) + myNumberString;
	}
	
	return myNumberString;
}

function isAnonymous() {
	return ('' == getCookie('login'));
}

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/geral/utf-8 [rev. #1]

UTF8 = {
	encode: function(s){
		for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
			s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
		);
		return s.join("");
	},
	decode: function(s){
		for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
			((a = s[i][c](0)) & 0x80) &&
			(s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
			o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
		);
		return s.join("");
	}
};

// Firefox 3 < 3.0.5 does not convert forms iso strings to utf8 when writing XML
// Check for Firefox 3.0
var gIsProblematicFirefox3 = (null != navigator.userAgent.match(/Firefox\/3\.0$/));
// Check for Firefox 3.0.1~4
if(!gIsProblematicFirefox3) {
	gIsProblematicFirefox3 = navigator.userAgent.match(/Firefox\/3\.0\.([0-9])$/);
	if(gIsProblematicFirefox3) gIsProblematicFirefox3 = (gIsProblematicFirefox3[1] < 5) ? true:false;
}
function ff3convert(inString) {
	return gIsProblematicFirefox3 ? UTF8.encode(inString) : inString;
}

// Allow special characters to be passed to an inline JavaScript function
function encodeForFunction(inParameter) {
	return 'decodeFromDomId(\''+ encodeForDomId(inParameter) +'\')';
}

function encodeForDomId(inParameter) {
	return encodeURIComponent(inParameter)
		.replace(/'/g, '%27')
		.replace(/\(/g, '%28')
		.replace(/\)/g, '%29')
		.replace(/%/g, '$');
}

function decodeFromDomId(inParameter) {
	return decodeURIComponent(inParameter.replace(/\$/g, '%'));
}

// Initialize the context and fill the page
function init() {
	//enableIeDebug();
	var myDeviceInfo = getDeviceInfo();
	myDeviceInfo.init(getPageContent);
}
