/**
 * @author elepid
 */
function insertAfter(parent, node, referenceNode) {
	if (referenceNode.nextSibling === null) {
		parent.appendChild(node);
	}
	else {
		parent.insertBefore(node, referenceNode.nextSibling);
	}
}

function clearChildNodes(currNode)
{
	while(currNode.firstChild){
		currNode.removeChild(currNode.firstChild);
	}
}

var fh;                  
if (!fh) {
	fh = {};	
} 

fh.util = {
	sanitizeInput: function(input) {
		if (input === null || input === undefined) {
			return input;
		}
		var newString = input.replace(/&amp;/g, "%26");
		return newString.replace(/&/g, "%26");
	},
	clearChildNodes: function(currNode)	{
		while(currNode.firstChild){
			currNode.removeChild(currNode.firstChild);
		}
	},
	removeChild: function(parentId, nodeId) {
		var parentNode = document.getElementById(parentId);
		var node = document.getElementById(nodeId);
		parentNode.removeChild(node);
	},
	removeNode: function(currNode) {
		currNode.parentNode.removeChild(currNode);	
	},
	insertAfter: function(parent, node, referenceNode) {
		if(referenceNode.nextSibling === null) {
			parent.appendChild(node);
		}
		else {
			parent.insertBefore(node, referenceNode.nextSibling);
		}
	},
	
	showHide: function(showNodeId, nodeArray) {
		console.log("showNodeId: " + showNodeId);
		var showNode;
		for (var i=0; i<nodeArray.length; i++) {
			if(nodeArray[i] === null) {
				continue;	
			}
			console.log("nodeArray[" + i + "].id = " + nodeArray[i].id);
			nodeArray[i].style.display = "none";
			if (nodeArray[i].id == showNodeId) {
				showNode = nodeArray[i];
			}
		}
		if (showNode !== null) {
			showNode.style.display = "";
		}
	},
	
	genericShowHide: function(showId, elId) {
		var	successEl = document.getElementById("success_input_line_" + elId);
		var	failureEl = document.getElementById("failure_input_line_" + elId);
		var	buttonEl = document.getElementById("button_input_line_" + elId);
		var	processingEl = document.getElementById("processing_input_line_" + elId);
		var divArray = [successEl, failureEl, buttonEl, processingEl];
		fh.util.showHide(showId, divArray);
	},
	
	openCloseDiv: function(divId) {
		var divEl = document.getElementById(divId);
		if(divEl !== null && divEl !== undefined) {
			if(divEl.style.display === "none") {
				divEl.style.display = "";	
			}
			else {
				divEl.style.display = "none";
			}
		}
	},
	
	openDiv: function(divId) {
		var divEl = document.getElementById(divId);
		if(divEl !== null && divEl !== undefined) {
			divEl.style.display = "";
		}
	},
	
	closeDiv: function(divId) {
		var divEl = document.getElementById(divId);
		if(divEl !== null && divEl !== undefined) {
			divEl.style.display = "none";
		}
	},
	searchElementsByClass: function(searchClass, domNode, tagName) {
    	if (domNode === null || domNode === undefined) {
    		domNode = document;
    	}
    	if (tagName === null || tagName === undefined) {
    		tagName = '*';
    	}
    	var el = new Array();
    	var tags = domNode.getElementsByTagName(tagName);
    	var tcl = new RegExp('\\b' + searchClass + '\\b');
    	var classes;
    	for(var i=0, j=0; i<tags.length; i++) {
    		classes = tags[i].className;
    		if (tcl.test(classes)) {
    			el.push(tags[i]);
    		}
    	}
    	return el;
    }
};

fh.util.upload = {
	startProgress: function() {
    	console.log("starting progress");
        document.getElementById('progressBarBoxContent').style.width = 0 + 'px';
        document.getElementById('progressBarText').innerHTML = 'upload in progress: 0%';
        // wait a little while to make sure the upload has started ..
        window.setTimeout("fh.util.upload.refreshProgress()", 1500);
        document.getElementById('progressBar').style.display = 'block';
        return true;
	},
	refreshProgress: function() {
		var sUrl = '/flavorhub/upload/update_upload_progress';
		var callback = {
			success: function(o) {
				var m;
	
				try {
					m = YAHOO.lang.JSON.parse(o.responseText);
				}
				catch (x) {
					console.log("JSON Parse failed!");
					return;
				}
				
				if(m.requestStatus == "ok")	
				{
					var fileIndex = m.fileIndex;
			        var progressPercent = Math.ceil((m.bytesRead / m.totalSize) * 100);
					if(isNaN(progressPercent)) {
						progressPercent = 0;
					}
//			        document.getElementById('progressBarText').innerHTML = 'upload in progress: ' + progressPercent + '%, transfered ' + m.bytesRead + ' of ' + m.totalSize + ' bytes';
			        document.getElementById('progressBarText').innerHTML = 'upload in progress: ' + progressPercent + '%, transferred'
			        widthMultiplier = document.getElementById('progressBarBox').clientWidth / 100;
			        document.getElementById('progressBarBoxContent').style.width = parseInt(progressPercent * widthMultiplier, 10) + 'px';
			        window.setTimeout('fh.util.upload.refreshProgress()', 500);
				}	
			}
		};	
		var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, null);	
	}
};

fh.util.tagbox = {
	getTagBox: function(sUrl, size) {
		var postData = "numtags=" + size;
		fh.util.tagbox.showHide('tagbox_load');
		
		var callback = {
			success: function(o){
				var tagBoxEl = document.getElementById("tag_box");
				var newTagBox = document.createElement('div');
				newTagBox.innerHTML = o.responseText;
				tagBoxEl.parentNode.replaceChild(newTagBox.firstChild, tagBoxEl);
				fh.util.tagbox.showHide('tagbox_nav');
			},	
			failure: function(o) {
				fh.util.tagbox.showHide('tagbox_error');
			}
		};
		
		var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);	
	},
	showHide: function(showId) {
		var	navEl = document.getElementById("tagbox_nav");
		var	loadEl = document.getElementById("tagbox_load");
		var	errorEl = document.getElementById("tagbox_error");
		var divArray = [navEl, loadEl, errorEl];
		fh.util.showHide(showId, divArray);
	}
};

fh.util.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: "Chrome",
			identity: "Chrome"
		},
		{ 	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"
		}
	]

};

