var isIE = (document.all ? true : false); // Is IE browser?

window.onload = init;
document.onmousemove = mouseMove;
document.onmousedown = mouseDown;
document.onmouseup   = mouseUp;

var clipBoard;
var source;
var holders=new Array(0);
var taskManager;
var elementFocus;

var mouseX;
var mouseY;

var popup = 0;

var isNN = document.layers ? true : false;
var isIE = document.all ? true : false;
var drag_enable = true;

var elementOnFocus=null;

var DIV_GOTOURL = "div_gotourl";
var URL_GOTOURL = "hid_gotourl";
var SEARCH_STRING = "searchstring";
var SPAN_GOTOURL = "spn_gotourl";
var DIV_TORRENTLINKS = "torrent_links";
var DIR_ICONS = "images/"
var mySearchTerm = "MYSEARCHTERM";

var NEW_URL = 1;
var EDIT_URL = 2;
var DELETE_URL = 3;
var DATABASE_URL = 4;

var menu = 0;
// Torrent site that will be display by default.
// Just change to domain name of the site you want as default.
var TORRENT_DEFAULT = 'torrentz.com'; // In lower case only
var DOMAIN_LAST = 'domain_last';
var sb_Active_Torrent = '';

var searchBar = null;

// Desktops Tabs bar
var torrentsSearchBar = {
		
	init : function()
	{
		searchBar = document.getElementById( DIV_TORRENTLINKS );
		if(searchBar) searchBar.style.borderRight = '1px solid yellow';
	},
	
	clear :  function()
	{
		if(!searchBar) return;
		// Clear desktop tabs
		if(searchBar)
		{
			while(searchBar.childNodes.length > 0)
			{
				temp = searchBar.childNodes[0];
				value = parseInt(temp.getAttribute('value'));

				this.deleteTorrent(value);
			}
		}
	},

	newTorrent : function(name, url, torrentHost)
	{
		if(!searchBar) if(!this.init()) return;

		if(searchBar)
		{
			if(url.indexOf(torrentHost) >=0 )
			{
				sb_ActiveTorrent = url;
				searchBar.innerHTML = '<a class="search_link_current" value="'+name+'" href="javascript:;" onclick="javascript:openURL(\'\',\'searchbar_searchstring\',\' '+ url + '\');">'+ name +'</a>' + searchBar.innerHTML ;
			}
			else
				searchBar.innerHTML += '<a class="search_link" value="'+name+'" href="javascript:;" onclick="javascript:openURL(\'\',\'searchbar_searchstring\',\' '+ url + '\');">'+ name +'</a>';
		}
		this.updateBar();
	},

	deleteTorrent : function( name )
	{
		if(!searchBar) return;

		var element = torrentTab(name);
		if(element) element.parentNode.removeChild(element);
	},

	updateBar : function()
	{
		if(!searchBar) if(!this.init()) return;
		var width = this.getTabsWidth();
		var scroll = (width > searchBar.parentNode.offsetWidth);

		element = document.getElementById('torrent_previous');
		if(element) element.style.display =( scroll ? 'block' : 'none' );
		element = document.getElementById('torrent_next');
		if(element) element.style.display = ( scroll ? 'block' : 'none' );

		if(searchBar)
		{
			searchBar.style.left = ( scroll ? '20' : '0' ) +'px';
			searchBar.style.width = ( scroll ? (width + 2) +'px' : "auto");
		}
		element.style.left = searchBar.parentNode.offsetWidth - element.offsetWidth;
	},

	getTabsWidth : function()
	{
		if(!searchBar) if(!this.init()) return;

		var width = 0;
		if(searchBar)
		{
			for(var index = 0; index < searchBar.childNodes.length; index++)
			{
				temp = searchBar.childNodes[index];
				value = parseInt(temp.getAttribute('value'));
				if( isTorrentTab(temp)  && nonNull(value) )
					width += searchBar.childNodes[index].offsetWidth + 10;

			}
		}	

		return (width);
	},

	moveTabs : function ( next )
	{
		if(!searchBar) if(!this.init()) return;
		if(searchBar) 
		{
			var width = this.getTabsWidth();
			var left = searchBar.offsetLeft + ( next ? - 80 : 80);
			var leftScroll = true, rightScroll = true;

			if(left > 20 ) 
			{	
				left = 20;			
				leftScroll = false;
			}
			else if(left < -(width - (searchBar.parentNode.offsetWidth - 20)))
			//else if(left 
			{
				left = -(width - (searchBar.parentNode.offsetWidth - 20));
				rightScroll = false;

			}
				
			searchBar.style.left = left +'px';

			var element = document.getElementById('torrent_previous');
			if(element) element.disabled = !leftScroll;
			element = document.getElementById('torrent_next');
			if(element) element.disabled = !rightScroll;
		}			
	}
	
}

function isTorrentTab(element)
{
	if(!searchBar) return;
	if(element)
	{
		if( nonNull(element.className) )
			return( element.className.toLowerCase().indexOf('search_link') >= 0 );
	}
}

// Returns desktop tab with given Id
function torrentTab( name )
{
	if(!searchBar) return;
	var temp;
	
	for(var index = 0; index < searchBar.childNodes.length; index++)
	{
		temp = searchBar.childNodes[index];
		if( isTorrentTab(temp) )
		{
			if(temp.getAttribute('value') == name )	return temp;
		}
	}

	return null;
}

function torrentPrevious()
{
	if(!searchBar) return;
	torrentsSearchBar.moveTabs(false);
}

function torrentNext()
{
	if(!searchBar) return;
	torrentsSearchBar.moveTabs(true);
}

function openSBTorrent( evt )
{
	evt = (evt) ? evt : event;

	if (evt.keyCode == 13) 	openURL('', 'searchbar_searchstring', sb_ActiveTorrent);	
	return true;
	
}
// Initiation process
function init( torrentHost )
{
	clearSearchTorrents();
	
	// Retrieve element with clipboard as ID.	
	clipBoard=document.getElementById('clipboard');

	// Retrieve element with clipboard as ID.	
	taskManager=document.getElementById('taskmanager');
	
	// Get collection of document's element.
	var elements=document.getElementsByTagName('*');
	
	// Loop through the elements.
	for (var index=0;index<elements.length ;index++ )
	{
		// If element is class 'holder', save to holders array for later use by the functions.
		if(elements[index].className.toLowerCase()=="holder")
			holders[holders.length]=elements[index];
	}

	// Creating Focus element which shown sourrounding an element when mouse is moves over it.
	if(holders.length>0)
	{	
		if(holders[0].parentNode)
		{
			// Creating Focus element.
			elementFocus=document.createElement("div");	// Create div element.
			elementFocus.id="holderfocus";
			elementFocus.style.backgroundColor="#ffffff";
			elementFocus.style.position="absolute";
			elementFocus.style.width='84px';
			elementFocus.style.height='84px';
			elementFocus.style.display='none';
			elementFocus.style.zIndex='-1';
			holders[0].parentNode.appendChild(elementFocus);
		}
	}

	// Read URLs from the cookie
	var engines = getCookie('urls');
	// Exit if no URLs are found.
	if( !nonNull(engines)) 
	{
		engines = defaultUrls();
		setCookie('urls',engines);
	}
	
	// Split URLs string in to individual URL.
	var urls=engines.split('||');
	var cols;
	for (var index=0;index<urls.length ;index++ )
	{
		cols=urls[index].split('|');
		// Display URL on the page
		if(cols.length>=5) 
			showUrl(cols[0],cols[1],cols[2],cols[3],cols[4]);
		
		if(nonNull(cols[0])) torrentsSearchBar.newTorrent(cols[0], cols[1], torrentHost);	

	}

	setDefaultTorrent();	
	
}

function setDefaultTorrent()
{
	var domain = getCookie(DOMAIN_LAST);
	if ( !(nonNull(domain) || nonNull(TORRENT_DEFAULT))) return false;
	
	var se_lcase = (nonNull(domain) ? domain.toLowerCase() : TORRENT_DEFAULT.toLowerCase());
	var url = '', element = null;

	for (var index=0;index < holders.length ; index++ )
	{
		url = seLink(holders[index]);
		if( nonNull(url))
		{
			if(url.toLowerCase().indexOf(se_lcase) >= 0 )
			{
				element = holders[index];
				break;
			}
		}
			
	}
	
	if(element) urlClicked(element.id);
}

function clearSearchTorrents()
{
	var el = document.getElementById(DIV_TORRENTLINKS );
	if(el) el.innerHTML = '';
}

function defaultUrls()
{
	var engines;
	engines = seJoin("TorrentBit","http://www.torrentbit.nl/search/?torrent=MYSEARCHTERM&cat_id=0",0,0,"icons/torrentbit.png");
	engines += "||" + seJoin("IsoHunt","http://isohunt.com/torrents/?ihq=MYSEARCHTERM",90,0,"icons/isohunt.png");
	engines += "||" + seJoin("SumoTorrent","http://www.sumotorrent.com/searchResult.php?search=MYSEARCHTERM",0,90,"icons/sumotorrent.png");

	engines += "||" + seJoin("BTJunkie","http://btjunkie.org/search?ref=torrentscan&q=MYSEARCHTERM",720,0,"icons/btjunkie.png");
	engines += "||" + seJoin("TorrentPortal","http://www.torrentportal.com/torrentssearch.php?search=MYSEARCHTERM",810,0,"icons/torrentportal.png");
	engines += "||" + seJoin("SeedPeer","http://www.seedpeer.com/search/MYSEARCHTERM.html",810,90,"icons/seedpeer.png");

	engines += "||" + seJoin("Torrentz.com","http://www.torrentz.com/search?q=MYSEARCHTERM",360,90,"icons/torrentz.png");
	engines += "||" + seJoin("TorrentFreak (Torrent Blog)","http://torrentfreak.com/search/MYSEARCHTERM",450,90,"icons/torrentfreak.png");

	engines += "||" + seJoin("Opensubtitles","http://www.opensubtitles.org/en/search2/sublanguageid-all/moviename-MYSEARCHTERM",360,360,"icons/opensubtitles.png");
	engines += "||" + seJoin("Newzleech","http://www.newzleech.com/?group=&minage=&age=&min=min&max=max&q=MYSEARCHTERM",450,360,"icons/newzleech.png");


	engines += "||" + seJoin("FullDLS","http://www.fulldls.com/search-all-torrents/?qa=MYSEARCHTERM",0,360,"icons/fulldls.png");
	engines += "||" + seJoin("TorrentFactory","http://www.torrentfactory.org/search/1/MYSEARCHTERM",0,450,"icons/torrentfactory.png");
	engines += "||" + seJoin("Now Torrents","http://www.nowtorrents.com/torrents/MYSEARCHTERM.html",90,450,"icons/nowtorrents.png");

	engines += "||" + seJoin("Mininova.org","http://www.mininova.org/search/?search=MYSEARCHTERM",810,360,"icons/mininova.png");
	engines += "||" + seJoin("TorrentMatrix","http://www.torrentmatrix.com/torrents-search.php?search=MYSEARCHTERM",720,450,"icons/torrentmatrix.png");
	engines += "||" + seJoin("Vertor.com","http://www.vertor.com/index.php?mod=search&search=&words=MYSEARCHTERM&x=11&y=6",810,450,"icons/vertor.png");

	return (engines);

}

// Search Engines URL function
// Display the url is designated columns
function showUrl(caption,url,hleft,htop,img)
{
	if ( hleft <0 && htop < 0) return (true);

	var left=hleft-(hleft % 90);
	var top=htop-(htop % 90);
	var id=left+'_'+top;
	
	var element=document.getElementById(id);
	if(!element) return (false);
	if ( element.className == "" || element.className == null) return (false);
	if (element.className.toLowerCase() !='holder' ) return (false);
	
	if(img != "" ) 
		if (img.indexOf( DIR_ICONS ) >= 0 )
			element.style.backgroundImage = "url(" + img + ")";
	else
			element.style.backgroundImage = "url(" + DIR_ICONS + img + ")";
	
	if(element) element.innerHTML="";
	if(caption!="")
	{
		var lnk = document.createElement('a');

		lnk.className = 'selink';
		lnk.href = "javascript:urlClicked('"+id+"');"
		lnk.style.position = 'absolute';
		lnk.setAttribute('value', url);
		lnk.setAttribute('sename',caption);
		if( img.indexOf("icons/") < 0 ) lnk.innerHTML = caption;

		lnk.style.display = 'block';
		element.appendChild(lnk);				
		lnk.style.top = (element.offsetHeight-lnk.offsetHeight)/2;
		lnk.style.left = (element.offsetWidth-lnk.offsetWidth)/2;
	}	
	
	element.setAttribute("icon",img);
	
	var select=document.getElementById("editurl");

	if(caption != "" && caption != null)
	var urlsmall = seJoin(caption,url,hleft,htop,img);
	if(urlsmall != "" && urlsmall != null) urlsmall = urlsmall.toLowerCase();

	if(select)
	{
		for (var index = 0; index < select.options.length ; index++ )
		{
			if(select.options[index].text != "" && select.options[index].text != null)
			{
				if(select.options[index].value.toLowerCase() == urlsmall)
				{
					//select.options[index].value=seJoin(caption,url,hleft,htop,img);
					//select.selectedIndex=-1;
					return (true);
				}
			}
		}

		var option=new Option(caption,seJoin(caption,url,hleft,htop,img));
		select.options[select.options.length] = option;
		select.selectedIndex=-1;
	}
}

// Reads Search engine URL from the user, saves it in the cookie and 
// display the same on the page.
function addContent(element)
{
	//if(!element) return(false);
	//ADD CONTENT
	
	// Get Window co-ordinates.
	var coor=windowCoord();
	// Get Popup element that display whole of the page.
	var popup=document.getElementById("popup");
	// Create one, if popup is not found.
	if(!popup) popup=document.createElement('div');
	// Get body element/
	var body=document.body;

	if(!(popup && body)) return (false);
	
	drag_enable=false;
	
	// Set popup attributes.
	popup.id="popup";
	popup.className="popup";
	popup.style.left = body.offsetLeft;
	popup.style.top = body.offsetTop;
	popup.style.width = ( body.scrollWidth > body.offsetWidth ? body.scrollWidth : body.offsetWidth + "px");
	popup.style.height = ( body.scrollHeight > body.offsetHeight ? body.scrollHeight : body.offsetHeight + "px");	

	body.appendChild(popup);

	popup.style.display='block';
	
	// Get form that is used to read new search engine details.
	var form = document.getElementById("newengine");
	// Create one, if not found.
	if(!form) return(false);

	form.style.display = 'block';
	// Set form attributes.
	form.style.left = body.offsetLeft + (( body.offsetWidth - form.offsetWidth )/2);	
	form.style.zIndex=1;
	if(element)	form.setAttribute("element",element.id);

	var temp=document.getElementById('se_name');
	if(temp) temp.value="";
	temp=document.getElementById('se_url');
	if(temp) temp.value="";

	// Display from
	form.style.display="block";

	// Set Default color to blue.
	setUrlImage("bgblue.png");
	
	showWebsitesFromDatabase();
	newUrl();
}

function urlClicked(elementId)
{
	var element = document.getElementById(elementId);

	if(element) seSelected(element);
}
// Function to perform task when holder is dropped on to taskManager.
function performTask(element,srcElement)
{

	if(!(element && srcElement)) return (false);
	seSelected(srcElement);	
}

function seSelected(element)
{
	var se = seRow(element);

	var div = document.getElementById(DIV_GOTOURL);
	var url = document.getElementById(URL_GOTOURL);
	var txt = document.getElementById(SEARCH_STRING);
	var span = document.getElementById(SPAN_GOTOURL);
	
	if(se.image != null && se.image != "" )
		if(se.image.indexOf(DIR_ICONS) < 0) se.image = DIR_ICONS + se.image;

	if(url) url.value = se.url;
	//if(txt) txt.value = "";
	var domain = urlDomain(se.url);

	if(domain != '') setCookie(DOMAIN_LAST, domain.toLowerCase());

	if(span) 
	{
		span.style.backgroundImage = element.style.backgroundImage; 
		
		span.innerHTML = element.innerHTML;// '<img src="' + se.image +'">';
	}
	if(div)	div.style.display = 'block';
	
	updateSearchCloudLinks(se.url);	
	
}	

function updateSearchCloudLinks( url )
{
	var form = document.forms['form_searchcloud'];
	var el = form.getElementsByTagName('a');
		
	for(var index = 0; index < el.length; index++)
	{
		if(nonNull(el[index].getAttribute('name')))
		{
			if( el[index].getAttribute('name').toLowerCase() == 'searchterm')
				el[index].href = redirectURL( el[index].innerHTML, url);
		}	
	}

}

function showOpenURL( term )
{
	var url = '';
	var urlElement = document.getElementById(URL_GOTOURL);
	if(urlElement) 	url = urlElement.value;

	url = url.replace(mySearchTerm, term);

	window.status = 'torrent.php?site='+ escape(url) + '&term=' + term;
}
function openURL( term, elTermId, torrentUrl )
{
	var url = '';
	var wdw_self = false;

	if( nonNull(torrentUrl))
	{	
		url = torrentUrl;	wdw_self = true;
	}
	else
	{
		var div = document.getElementById(DIV_GOTOURL);
		if(!div) return (false);
		if(div.style.display == 'none') return (false);
		var urlElement = document.getElementById(URL_GOTOURL);
		if(urlElement) 	
			url = urlElement.value;
		else 
			return (false);
	}	

	var searchString = '';
	var txtElement = document.getElementById(( nonNull(elTermId) ? elTermId : SEARCH_STRING));

	if( nonNull(term) && txtElement ) txtElement.value = term;
		
	if (txtElement)
		searchString = txtElement.value;
	else
		return (false);

	if(url == "" )
	{
		alert("Invalid URL.");
		return (false);
	}

	if(searchString == "" )
	{
		alert("No search string in entered.\nPlease enter search string in the textbox provided.");
		return (false);
	}
	
	url = url.replace(mySearchTerm,searchString);

	//window.open(url , "_blank");
	//window.open('torrent.php?site='+ escape(url) + '&term=' + searchString , ( wdw_self ? '_top' : '_blank'));
	window.open( redirectURL(searchString, url) , ( wdw_self ? '_top' : '_blank'));
	
	saveSearchTerm( searchString );
}

function redirectURL( term, url)
{
	url = url.replace(mySearchTerm, term);

	return ('torrent.php?site='+ escape(url) + '&term=' + escape(term));
}

function saveSearchTerm( term )
{
	if(!nonNull(term)) return ;
	// Create Ajax Obhect to send request.
	var ajax = ajaxObject();
	// Exit if Ajax in not supported by the browser.
	if(!ajax) return false;
	// Send query
	ajax.open("GET","searchterm.php?term="+term,true);
	ajax.onreadystatechange = function() {	if(ajax.readyState==4) { }	}
	// Send Request to the server.
	ajax.send(null);
}
function displayOptionDiv(option)
{
	var element = document.getElementById('urldetail');
	if(element) element.style.display = (option !="database"? "block" : "none");

	element = document.getElementById('dbwebsites');
	if(element) element.style.display = (option !="database"? "none" : "block");

	element = document.getElementById('urlspan');
	if(element) element.style.display = (option == "delete"? "none" : "block");
	
}

function setMenuCaption(caption, buttonCaption, info)
{	
	if( !(caption == "" || caption == null))
	{
		var element = document.getElementById( 'menuselected' );
		if(element) element.innerHTML = caption;
	}

	element = document.getElementById( 'menuinfo' );
	if(element) element.innerHTML = ((info == "" || info == null) ? "" : info);
	
	element = document.getElementById( 'okbutton' );
	if(element) element.innerHTML = ((buttonCaption == "" || buttonCaption == null) ? "" : buttonCaption);
	
}
function newUrl()
{
	menu = NEW_URL; 
	setMenuCaption('Make my own','Save','Please fill the following fields to create your own search engine');

	displayOptionDiv('new');
	var element = document.getElementById('editspan');
	if(element) element.style.display = "none";
}

function editCurrent()
{
	menu = EDIT_URL; 
	setMenuCaption('Edit Current','Save','Please select the search engine you want to change');

	displayOptionDiv('edit');

	var element = document.getElementById('editspan');
	if(element) element.style.display = "block";

}

function deleteCurrent()
{
	menu = DELETE_URL; 
	setMenuCaption('Delete search engine','Delete','Please select the search engine you want to delete');

	displayOptionDiv('delete');

	var element = document.getElementById('editspan');
	if(element) element.style.display = "block";

}

function addFromDatabase()
{
	menu = DATABASE_URL; 
	setMenuCaption('Database','Ok',"");

	displayOptionDiv('database');
}

function urlToEditSelected(element)
{
	if(!element) return false;

	for(var index = 0; index < element.options.length ; index++)
	{
		if (element.options[index].selected == true)
		{
			var se=seSplit(element.options[index].value);

			var text=document.getElementById('se_name');
			if(text) text.value=se.name;

			text=document.getElementById('se_url');
			if(text) text.value=se.url;

			setUrlImage(se.image);
		}
	}
}

// Create clipBoard element that hold a copy of element untill it is moved to selected position.
function createClipBoard()
{	
	// Creating div element.
	var elementDiv=document.createElement("div");	// Create div element.
	// Retrieve body element of the document.
	var body=document.getElementsByTagName("body")[0];	// Get Body element.

	// Set Div's ID and style attributes.
	elementDiv.id="clipboard";
	elementDiv.style.width='80px';
	elementDiv.style.height='80px';
	elementDiv.style.display="none";

	// Append this Div element as child element of Body element
	body.appendChild(elementDiv);
	// Copy created clipboard element to clipBoard element
	clipBoard=elementDiv;
	
	// Return clipboard element.
	return (clipBoard);
}


/* -------------------------------------------------
				Mouse Handlers
   ------------------------------------------------- */
// Return mouse pointer's position and element that has mouse within it's boundaries.
function mousePosition(e) 
{
	var mX;
	var mY;
	if (document.layers) 
	{
		mX = e.pageX;	mY = e.pageY;
	} 
	else if (document.all) 
	{
		mX = window.event.x+document.body.scrollLeft;
		mY = window.event.y+document.body.scrollTop;
	} 
	else if (document.getElementById) 
	{
		mX = e.pageX;	mY = e.pageY;
	}	
	
	var evnt= e || window.event;
	// Return Mouse's X and Y co-ordinates and element.
	return {x:mX, y:mY, element:(evnt.target || evnt.srcElement)};
}

// Function to perform tasks when mousedown event occur.
function mouseDown(evnt)
{	

	if(!drag_enable) return (0);
	// Get Mouse co-ordinates and the element on which mousedown event occured.
	var mouse=mousePosition(evnt);
	// If no element, exit.
	if (!mouse.element || ( mouse.element == taskManager)) 
			return(0);
	if(mouse.element.id.toLowerCase()=="popup") return (0);

	if((mouse.element.tagName.toLowerCase() == "img" || mouse.element.tagName.toLowerCase() == "a" || mouse.element.tagName.toLowerCase() == "span") && mouse.element.parentNode.className.toLowerCase() == "holder")
				mouse.element = mouse.element.parentNode;

	// If element is not an holder element, then exit.
	if(mouse.element.className.toLowerCase()!='holder') 
			return(0);

	// If holder element has no content, then exit.
	if(elementText(mouse.element) == "" )//.innerText == "" && mouse.element.textContent == "")	
	{
		// Function to add content
		addContent(mouse.element);
		return(0);
	}

			
	if (!clipBoard) // clipboard element doesnot exist.
		if (!createClipBoard())	// Create clipboard element
				return(0);		// Exit if clipboard element creation failed.
	
	// Remember currently clicked holder element.
	source=mouse.element;
	// Copy holder content to clipBaord and set clipBoard's style.
	clipBoard.innerHTML=source.innerHTML;
	clipBoard.style.backgroundImage = source.style.backgroundImage;
	
	var pos=getElementPosition(source);

	clipBoard.style.left = pos.left ;
	clipBoard.style.top = pos.top ;
	// Display the clipboard.
	clipBoard.style.display = 'block';
	clipBoard.style.zIndex = 5;
	clipBoard.focus();

	mouse=mouseFromWindow(evnt);
	// Remember difference between mouse and clipBoard co-ordinates, 
	// so that that difference will be maintained while mouse and clipboard are moving.
	mouseX=mouse.x;
	mouseY=mouse.y;

}

// Function that will be performing tasks while mouse is moving.
function mouseMove(evnt)
{	
	if(!drag_enable) return (0);
	// Get Mouse co-ordinates and the element on which mouse Up event occured.
	var mouse = mousePosition(evnt);	
	if(mouse.element.id.toLowerCase()=="popup") return (0);

	// Get mouse co-ordinates and element beneath the mouse.
	var mouse=mouseFromWindow(evnt);

	if (clipBoard && source)
	{
		if (clipBoard.style.display=='block') 
		{
			//Update clipBoard co-ordinates.
			clipBoard.style.left=parseInt(clipBoard.style.left)+(mouse.x-mouseX);
			clipBoard.style.top=parseInt(clipBoard.style.top)+(mouse.y-mouseY);

			mouseX=mouse.x;
			mouseY=mouse.y;
		}
	}
	
	// Get holder element that is under mouse pointer.
	var element=hoverHolder(mouse);

	if(element && element!=taskManager && elementFocus ) 
	{
		// Apply appropriate style to this holder element.	
		elementFocus.style.left=parseInt(element.offsetLeft)-2;
		elementFocus.style.top=parseInt(element.offsetTop)-2;
	
		if(elementFocus.style.display=='none') elementFocus.style.display='block';
		
	}
	else if (elementFocus)
		elementFocus.style.display='none';

	updateFocusHolder(element);
	
}

// Function to perform tasks when mouseUp event occur.
function mouseUp(evnt)
{
	if(!drag_enable) return (0);
	// If no holder element is selected, exit.
	if(clipBoard == null || source == null) return(0);

	// Get Mouse co-ordinates and the element on which mouse Up event occured.
	var mouse=mousePosition(evnt);	

	if(!mouse.element) return (0);
	if(mouse.element.id.toLowerCase() == "popup") return (0);

	if(elementFocus) elementFocus.style.display='none';
	
	// Is clipboard displayed?
	if (clipBoard.style.display != 'block') 
		return(0);
	else
		clipBoard.style.display = 'none';
	
	// Get holder element that is below the mouse pointer.
	var element=hoverHolder(mouse);
	
	// If no holder element is below the mouse, then exit.
	if (!element)
			return(0);

	if (element == taskManager) 
		performTask(element,source);
	else if(element.className=='holder')			
	{
		if(element != source )
		{
			// Code for interchnagind of elements.

			// Read source engine details.
			var se_source = seRow(source);
			// Read Target engine details.
			var se_element = seRow(element);
			
			if(!(se_element.name == null || se_element.name == ""))			
				update_SE(se_element.name,se_element.url,se_source.left,se_source.top,se_element.image,"append");

			if(!(se_source.name == null || se_source.name == ""))			
				update_SE(se_source.name,se_source.url,se_element.left,se_element.top,se_source.image,"append");
				
		}
		element.focus();
		urlClicked(element.id);
	}
	// Clear source
	source=null;	

}

// Split Search engines string and return as name , utl ,left,top and color
function seSplit(se)
{
	if(se == null || se == "")
		return { name : "", url : "" , left : "" , top : "" , color : "" };
	else
	{	
		var cols = se.split('|');
		var length = cols.length;
		var name = "";
		var url = "";
		var left = "";
		var top = "";
		var image = "";

		if (length >= 1) name = cols[0];
		if (length >= 2) url = cols[1];
		if (length >= 3) left = cols[2];
		if (length >= 4) top = cols[3];
		if (length >= 5) image = cols[4];

		return { name : name, url : url , left : left , top : top , image : image };
	}
		

}

// Join Search engines variables and return the string
function seJoin(se,se_url,se_left,se_top,se_image,query)
{

	return ( se+"|"+se_url+"|"+se_left+"|"+se_top+"|"+se_image);

}

// Return search engine details of given block
function seRow(element)
{
	// Get content of given element.
	var se =seName(element);// ( element.innerText ? element.innerText : element.textContent );
	var se_url;
	var se_image;
	var se_top;
	var se_left;
	var coor;
	
	if(element)
		 coor = element.id.split("_");
	
	if(se != "")
	{	
		se_image = element.getAttribute('icon');//.style.backgroundImage;
	
		se_url = seLink(element);

		return { name : se , url : se_url , image : se_image , left : coor[0] , top : coor[1] };
	}
	else
		return { name : "" , url : "" , image : "" , left : coor[0] , top : coor[1] };

}

// Return the link of search engine in the given element
function seName(element)
{	
	var url;
	for(var index = 0; index < element.childNodes.length; index++)
	{
		if(element.childNodes[index].tagName.toLowerCase() == "a")
			return (element.childNodes[index].getAttribute("seName"));
	}
	return ("");
}

// Return the link of search engine in the given element
function seLink(element)
{	
	var url;
	for(var index = 0; index < element.childNodes.length; index++)
	{
		if(element.childNodes[index].tagName.toLowerCase() == "a")
			return (element.childNodes[index].getAttribute("value"));
	}
	return ("");
}

// Return the holder with given left and top
function getHolder(left,top)
{
	return ( document.getElementById( left + "_" + top) );
}

// Returns the holder with given search engine
function seHolder(se)
{
	if (se == "" || se == null) return (null);
	
	var se_lcase = se.toLowerCase();

	for (var index=0;index < holders.length ; index++ )
	{
		text = elementText(holders[index]);
		if( text != "" && text != null)
		{
			if(text.toLowerCase() == se_lcase )
				return ( holders[index] );
		}
			
	}

	return (null);
}

// Function that saves selected color of the block displaying search engine.
function setUrlImage(image)
{
	if(image == null || image == "") return (false);

	var element = document.getElementById('se_image');
	if(element) element.value = image;

	var imgs = document.getElementsByTagName('img');
	
	for ( var index = 0;index < imgs.length ; index++ )
	{
		if(imgs[index].className == "urlimage")
		{
			/*
			if(imgs[index].id == image)
				imgs[index].style.border="hidden";				
			else
				imgs[index].style.border="hidden";
			*/
			/*if(imgs[index].id == image)
				imgs[index].style.border="2px solid #909090";
			else
				imgs[index].style.border="2px solid white";
			*/
		}
	}

}

// Function to Closes form that read search engine details.
function closeNewForm(selected)
{	
	if(menu == DATABASE_URL)
	{
		addDatabaseUrls();
	}
	else
	{
		var popup = document.getElementById('popup');
		var newengine = document.getElementById('newengine');
		var id = "";
		var coor;
		if(newengine)
		{
			id = newengine.getAttribute('element');
			if(selected == 1)
			{	
				if (menu == DELETE_URL)
				{
					// Delete selected URL
					var details = getUpdate_SE();
					if(details != "")
					{
						// Remember the left and top of div element
						// displaying this URL.
						var rd = seSplit(details);
						// Delete the search engine from page and cookie
						delete_SE(rd.left,rd.top);
					}
				}
				else
				{
					// Ok is clicked by the user.
					var se_name = "";
					var se_url = "";
					var se_image = "";
					
					var edit=false;
					var element=document.getElementById('editspan');
						
					if(element) edit = ( element.style.display != 'none');
	
					// Read Search engine name.
					element=document.getElementById('se_name');
					if(element) se_name=element.value;
					if(se_name=="")
					{
						// Display message if search engine name is not entered.
						element.focus();
						alert("Search Engine name is empty.\nPlease enter a search engine name.");
						return(false);
					}
	
					// Read Search engine URL.
					element=document.getElementById('se_url');
					if(element) se_url=element.value;
					if(se_url=="")
					{
						// Display message if search engine URL is not entered.
						element.focus();
						alert("Search Engine's url is empty.\nPlease enter search engine's url.");
						return(false);
					}
					
					// Read Search engine block's background color
					element=document.getElementById('se_image');
					if(element) se_image = element.value;
	
					element=document.getElementById(id);
					if(element)
					{
						// Retrieve left and top of the div element that displays
						// this search engine.
						coor=element.id.split("_");
						
						// In case of URL updation, delete the updating URL.
						if(edit)
						{
							// Get record of upating URL.
							var details=getUpdate_SE();
	
							if(details != "")
							{
								// Remember the left and top of div element
								// displaying this URL.
								var rd=seSplit(details);
	
								coor[0] = rd.left;
								coor[1] = rd.top;
	
								// Delete the search engine from page and cookie
								delete_SE(rd.left,rd.top);
							}
						}
						// Save the details in the cookies
						// and show it on the page.
						update_SE(se_name,se_url,coor[0],coor[1],se_image,"append");
					}
				}
			}

		}			
	}
	drag_enable=true;
	menu = 0;

	//Hide popup element and form.
	if(popup) popup.style.display='none';
	if(newengine) newengine.style.display='none';
}

// Return URL that is being updated. 
function getUpdate_SE()
{
	var select=document.getElementById('editurl');
	if(select)
	{		
		for( var index = 0 ; index<select.options.length; index++)
			if(select.options[index].selected)
				return select.options[index].value;
	}
	return ("");
}
// Saves given search engine details in the cookie.
function update_SE(se,se_url,se_left,se_top,se_image,query)
{

	if(se == "" || se == null) return(0);
	var value = se+"|"+se_url+"|"+se_left+"|"+se_top+"|"+se_image+"||";
	var engines = unescape(getCookie('urls'));
	if(engines=='undefined') engines="";
	var urls = engines.split("||");

	var cols;
	var saved=false;
	engines="";	

	for (var index = 0;index < urls.length ; index++ )
	{
		cols = urls[index].split('|');
		if( cols[0] != ""  && cols[0] != null)
		{
			if(cols[0].toLowerCase() == se.toLowerCase())
			{
				engines += value + "||"; 

				var holder = seHolder(se);
				if(holder) clearHolder(holder);
				//delete_SE(cols[2], cols[3] );
				saved = true;
			}
			else
				engines += urls[index] + "||";
		}		
	}
	
	if( !saved )
		engines += value;

	setCookie('urls',engines);

	// show this Search engine on the page.
	showUrl(se,se_url,se_left,se_top,se_image);

}

function delete_SE(left,top)
{
	var engines = unescape(getCookie('urls'));
	if(engines=='undefined') engines="";
	var urls = engines.split("||");
	
	var cols;
	var saved=false;
	var se;
	var checkse = "" ;
	
	// Remove URL from cookies
	for (var index = 0;index < urls.length ; index++ )
	{
		cols = urls[index].split('|');
		if(cols.length >= 4)
		{
			if(cols[2] == left && cols[3] == top )
			{
				se=cols[0];
				checkse = urls[index].toLowerCase();
				urls[index] = ""; 
				break;
			}
		}
	}

	engines = urls.join('||');
	setCookie('urls',engines);
	
	// Remove URL from page
	var text;
	var element = getHolder(left,top);

	clearHolder( element ) ;
	
	// Remove URL from select dropdown
	var select = document.getElementById('editurl');
	if(select)
	{
		for(var index = 0 ; index < select.options.length ; index++)
		{
			if(select.options[index].text != "")
			{
				if (select.options[index].value.toLowerCase() == checkse)
				{
					select.options[index] = null;
					break;
				}
			}
		}
	}
}

// Clear content of given holder
function clearHolder(element)
{
	if(element) 
	{
		element.innerHTML="";
		element.style.backgroundImage = 'url("images/bgblack.png")';
	}
}

// Update elements that currently has focus.
function updateFocusHolder(element)
{
	// IF current focus element and previous focus element is one and same,
	// do nothing
	if(element && elementOnFocus) 
		if(element == elementOnFocus) return(true);

	if(element == taskManager) return(true);

	if(elementOnFocus)	
		if(elementText(elementOnFocus) == "" )//.innerText == "" && elementOnFocus.textContent == "")
			elementOnFocus.innerHTML = "";
	
	elementOnFocus = element;
	if(element==null) return (true);

	if (element.className.toLowerCase()!="holder")
				return true;

	// Element has no text content.
	if(elementText(elementOnFocus) == "")//.innerText == "" && elementOnFocus.textContent == "")
		// If no holder element is selected, exit.
		if(clipBoard == null || source == null) 
		{
			element.innerHTML='<img id="class" src="images/bgadd.png"">';
		}
				// Is drap operation in progress?
		else if (clipBoard.style.display != 'block') 
		{
			element.innerHTML='<img id="class" src="images/bgadd.png"">';
		}
		else
			element.innerHTML='<img id="class" src="images/bgadd.png"">';
		
	
}

// Function returns holder element that contain mouse pointer within it's co-ordinates
function hoverHolder(pos)
{
	// Is a program laucher 
	if(taskManager)
		if(isMouseHover(taskManager,pos)) return taskManager;
	
	var returnHolder=null;
	// Loop through holder array
	for (var index=0;index<holders.length ;index++ )
	{
		// If this holder has mouse within it's co-ordinates,
		// return this holder element.
		if(isMouseHover(holders[index],pos))
			returnHolder= holders[index];
			
	}

	return(returnHolder);
}

// Returns whether mouse is hovering over the given element.
// element is the element to be tested.
// mousepos is co-ordinates of the mouse.
function isMouseHover(element,mousepos)
{
	if(!element) return false;

	// Get element's co-ordinates
	var position=getElementPosition(element);
	
	// Check whether mouse's x is not within element's left and right co-ordinates.
	if(mousepos.x<position.left || mousepos.x>(position.left+element.offsetWidth))
			return false;
	// Check whether mouse's y is not within element's top and bottom co-ordinates.
	if(mousepos.y<position.top || mousepos.y>(position.top+element.offsetHeight))
			return false;
	// Return mouse is within element. 
	return true;
}

// Returns position of given element.		
function getElementPosition(element)
{	
	var elementCurrent=element;
	var left=0;  
	var top = 0;               
			
	while(elementCurrent)
	{   
		left += elementCurrent.offsetLeft;    
		top += elementCurrent.offsetTop;   
		
		elementCurrent = elementCurrent.offsetParent;  
	}                        		         
	
	return {left:left,top:top};
}

// Return co=ordinates of the mouse from browser viewport's left top.
function mouseFromWindow(evt) 
{
	var mX = isIE ? (window.event.clientX + document.body.scrollLeft) : evt.pageX;
	var mY = isIE ? (window.event.clientY + document.body.scrollTop) : evt.pageY;
	
	return { x:mX, y:mY };
}

// Return browser viewport's co=ordinates.
function windowCoord()
{
	if (!window.outerWidth) 
		return { width : document.body.clientWidth , 
				 height : document.body.clientHeight };
	else
		return { width : window.innerWidth , height : window.innerHeight };
}

// Cookie functions
// Saves Cookie on user system.
function setCookie(cname,cvalue)
{	
	var exdate=new Date();

	// Set Expiry date of the cookie.
	exdate.setDate(exdate.getDate()+365);

	// Save Cookie.
	document.cookie=cname+ "=" +escape(cvalue)+";expires="+exdate.toGMTString();

}

// Returns given Cookie's value
function getCookie(cname)
{	
	if (document.cookie.length>0)
	{	
		// Cookies exist.
		cstart=document.cookie.indexOf(cname + "=");
		if (cstart!=-1)
		{	// Cookie is found.
			cstart=cstart + cname.length+1; 
			// Find end of cookie's value
			cend=document.cookie.indexOf(";",cstart);
			if (cend==-1) cend=document.cookie.length;
			// Return cookie's value.
			return unescape(document.cookie.substring(cstart,cend));
		} 
	}
	// Return  empty string.
	return "";
}

/* -----------------------------------------------------------------------
							Ajax Implementation
   ----------------------------------------------------------------------- 	*/
// Create Request Object.
function ajaxObject()
{
	var objRequest;

	try
	{  // Browser : Firefox, Opera 8.0+, Safari  
		objRequest=new XMLHttpRequest();  
	}
	catch (e)
	{  // Browser: Internet Explorer 
		try
		{    objRequest=new ActiveXObject("Msxml2.XMLHTTP");    }
		catch (e)
		{    
			try
			{    objRequest=new ActiveXObject("Microsoft.XMLHTTP");      }
			catch (e) {	}    
		}  
	}
	if(!objRequest)
	{	// Browser doesnot support AJAX.
		alert("Your browser doesnot support AJAX.");
		return(0);
	}	
	return objRequest;
}

// Function sends query to the server for websites.
function showWebsitesFromDatabase()
{

	// Create Ajax Obhect to send request.
	var ajax=ajaxObject();
	// Exit if Ajax in not supported by the browser.
	if(!ajax) return false;
	// Send query
	ajax.open("GET","websites.php",true);
	ajax.onreadystatechange = function()
	{	
		if(ajax.readyState==4)
		{	
			// Complete data is arrived.
			// Exit if no data is found.
			if(ajax.responseText=="") return false;
			// Retrieve data as xmlDoc
			var xmlDoc=ajax.responseXML;
			// Exit if not data is found.
			if (xmlDoc==null) return false;

			// Find the field tag which contains field of item record.
			var item =xmlDoc.getElementsByTagName("website");
			var name;
			var url;
			var value;
			var standard = "";
			var extra = "";
			var holder;

			for (var index = 0; index < item.length; index++)
			{
				// Read website data.
				name = item[index].getAttribute("name");
				url = unescape(item[index].getAttribute("url"));
				value = name + "|" + url + "|" + item[index].getAttribute("left");
				value += "|" + item[index].getAttribute("top");
				value += "|" + item[index].getAttribute("color");
				
				holder = seHolder(name) ;
				
				if(item[index].getAttribute("standard") == "1")
					standard += '<input class="dburl" type="checkbox"'+ (holder ? 'checked="checked"' : '') +' style="width:20px;" value="'+ value +'">' + name + '<br>';
				else
					extra += '<input class="dburl" type="checkbox"'+ (holder ? 'checked="checked"' : '') +' style="width:20px;" value="'+ value +'">' + name + '<br>';
			}
			html = '<div style="width:99%; height: 370px; margin:1px; overflow:auto; color:#000;">'; 
			html += '<div style="width:49%; float:left;"><b>Standard:</b><br>' + standard + '</div>';
			html += '<div style="width:49%; float:left;"><b>Extra:</b><br>' + extra + '</div>';
			html += '</div>';
			html += '<br>';//<a href="javascript:addDatabaseUrls();" class="commandbutton">Ok</a>';
			element = document.getElementById('dbwebsites');
			
			if(element) element.innerHTML=html;	
		}
	}
	// Send Request to the server.
	ajax.send(null);
}

function addDatabaseUrls()
{
	var urls = document.getElementsByTagName('input');
	if ( urls.length == 0 ) return (false);

	var clsName = "";
	var url = "";
	var coor , values , holder , show;
	
	for( var index = 0 ; index < urls.length ; index++ )
	{
		clsName = urls[index].className;
		if( !(clsName == "" || clsName == null) )
		{
			if(clsName.toLowerCase() == "dburl" )
			{

				url = urls[index].getAttribute('value');
				if(url != "" && url != null)
				{
					// Remember the Checkbox's checked status.
					show = urls[index].checked ;
					// Split URL row in to columns
					values=url.split("|");
					// Get Element displaying the URL( if currently shown on the page )												
					holder = seHolder(values[0]);

					if( show ) 
					{	// Show this URL
						if( ! holder )
						{
							// Url is not currently shown on the page.
							// Get an empty Holder element( element that displays no URL)
							holder = emptyHolder();	
							if( holder )
							{
								// An emtpy element is found.
								coor = holder.id.split( "_" );
								// Display URL in this element
								if( coor.length > 1)
									update_SE(values[0],values[1],coor[0],coor[1],values[4],"append");
							}	
						}
						// Nothing to do if url is already shown on the page.
					}
					else	
					{	// Delete this url
						if( holder ) 
						{	// URL is currently displayed
							coor = holder.id.split( "_" );
							// Delete this URL.
							delete_SE(coor[0],coor[1]);
						}
					}
					
				}
			}
		}
	}
	
	drag_enable=true;
	var element = document.getElementById('newengine');
	if(element) element.style.display = 'none';
	
	element = document.getElementById('popup');
	if(element) element.style.display = 'none';

}

function emptyHolder()
{
	var text = "";
	for(var index = 0 ; index < holders.length ; index++)
	{
		text = elementText( holders[index] );
		if( text == "" || text == null )
		{
			return ( holders[index] );
		}
	}

	return (null);
}

function elementText(element)
{
	var se = seRow(element);

	return (se.name);

}

window.onresize = function() 
{
	if( isIE )
	{
		window.status = "IE";
		var popup = document.getElementById( 'popup');
		var body = document.body;
		if(popup && body)
		{
			popup.style.width = ( body.scrollWidth > body.offsetWidth ? body.scrollWidth : body.offsetWidth + "px");
			popup.style.height = ( body.scrollHeight > body.offsetHeight ? body.scrollHeight : body.offsetHeight + "px");
			
			var form = document.getElementById("newengine");
			// Create one, if not found.
			if(!form) return(false);

			if(form.style.display == 'block')
				form.style.left = body.offsetLeft + (( body.offsetWidth - form.offsetWidth )/2);
		}

		
	}
}

function searchTextChange( evt )
{
	evt = (evt) ? evt : event;

	if (evt.keyCode == 13) 
	{
		var element = document.getElementById( 'btn_launchurl' );
		if(element) element.click();
	}
	return true;
}

function nonNull( text )
{
	return ( !(text == null || text == "" ||  text == 'undefined') );
}

function urlDomain( url )
{
	var root = splitUrl( url );
	return ( root.folder.length > 0 ? root.folder[0] : '');
}

// Splits given URL to protocol , folders and file name.
function splitUrl(url)
{
	var protocol;
	var tempUrl;

	if(url.indexOf('://')>0) 
	{
		var temp=url.split("://",2);
		protocol=temp[0];
		tempUrl=temp[1];
	}
	else
	{
		protocol="";
		tempUrl=url;
	}
	
	var folder=tempUrl.split('/');
	if(folder.length==0)
		return { protocol:protocol,  folder:folder , file:"" }	
	
	var file="";
	if (folder[folder.length-1]!="")
	{
		if(folder[folder.length-1].indexOf('.')>=0)
			file=folder.pop();

	}
	return { protocol : protocol,  folder : folder , file : file }
	
}
