Ext.DomQuery.pseudos['grand'] = function (c, name) { 
	var result = []; 
	for (var i = 0; i < c.length; i++) {
		var node = c[i].parentNode;
		var grand = node.parentNode;
		for(var j = 0; j < grand.childNodes.length; j++) {
			var child = grand.childNodes[j];
			if (child.nodeName == name) {
				result[result.length] = child;
			} 
		}
	}
	return result; 
}

function getHostname() {
	var host = "";
	if (Ext.isSecure) {
		host += "https://";
	} else {
		host += "http://";
	}
	host += window.location.host;
	return host;
}

function getUrl() {
	var host = getHostname();

	var path = window.location.pathname.split("/");
	for(var i = 0;i < path.length - 1; i++) {
		if (i != 0) {
			host += '/';
		}
		host += path[i];
	}
	return host;
}

function getValue(idName, formId) {
	var id = idName;
	if (formId != null) {
		if(formId.length > 0){
			id = formId + '_' + idName;
		}
	} else {
		id = 'form' + '_' + idName;
	}
	return Ext.get(id)!=null ? Ext.get(id).dom.value : null;
}

function isChecked(idName, formId) {
	var id = idName;
	if (formId != null) {
		if(formId.length > 0){
			id = formId + '_' + idName;
		}
	} else {
		id = 'form' + '_' + idName;
	}
	return Ext.get(id)!=null ? Ext.get(id).dom.checked : false;
}

function isCheckedValue(idName, formId) {
	return isChecked(idName, formId) ? true : null
}

function getHttpProxy( page , timeout) {
	var time = 240000;
	if (timeout != null) {
		if (timeout.match(/^[0-9]+$/)) {
			time = timeout;
		}
	}
	pagename = page;
	var conn = new Ext.data.Connection({
		url: pagename,
		timeout: time
	});
	return new Ext.data.HttpProxy(conn);
}

function getPagingToolbar(ds) {
	if (ds == null) {
		alert('Datasource Null Pointer');
	}
	return new Ext.PagingToolbar({
		pageSize:100,
		store:ds,
		displayInfo: true,
		displayMsg: 'Displaying topics {0} - {1} of {2}',
		emptyMsg: 'No topics to display'
	});
}

function getTranscriptRecordConfig() {
	return [
		'hit',
		'hix',
		'accession',
		'chromosome',
		{name: 'chr_start', mapping: 'start'},
		{name: 'chr_position'},
		{name: 'chr_end', mapping: 'end'},
		{name: 'gene_name', mapping: 'genename'},
		'category',
		'representative',
		'definition',
		{name: 'transcript_id', mapping: 'id'}
	];
}

function getPolymorphismRecordConfig() {
	return [
			{name: 'polymorphism_id', mapping: 'id'},
			'rs_number',
			{name: 'chromosome', mapping: 'chromosome'},
			{name: 'chr_start', mapping: 'start'},
			{name: 'chr_end', mapping: 'end'},
			{name: 'chr_position'},
			'strand',
			'allele',
			'validation',
			'heterozygosity'
	];
}
function getRepeatSeqRecordConfig(parent) {
	if (parent==null || parent.length==0) {
		parent = '';
	} else {
		parent += ' > ';
	}
	return [
			{name: 'repeat_id', mapping: parent + 'id'},
			{name: 'division', mapping: parent + 'range'},
			{name: 'transcript_start', mapping: parent + 'start'},
			{name: 'transcript_end', mapping: parent + 'end'},
			{name: 'unit', mapping: parent + 'unit'},
			{name: 'repeat_number', mapping: parent + 'number'},
			{name: 'polymorphism', mapping: parent + 'polymorphism'}
		];
}

function getStructuralVariationConfig() {
	return [
		'id',
		{name: 'stv_id', mapping: 'variation_id'},
		{name: 'chromosome', mapping: 'chromosome'},
		{name: 'chr_start', mapping: 'start'},
		{name: 'chr_end', mapping: 'end'},
		{name: 'chr_position'},
		{name: 'stv_type', mapping: 'type'},
		{name: 'method_category', mapping: 'method'},
		{name: 'reference' , mapping: 'reference'},
		'pmid'
	];
}

function renderTranscript(value, p, record) {
	return String.format(
		'<img src="images/gene.gif" alt="gene"/><a href="gene.htm?id={0}">{1}</a>',
		record.data.transcript_id,
		record.data.hit
	);
}

function renderTranscriptPosition(value, p, record) {
	var position = "";
	var start = record.data.transcript_start;
	var end = record.data.transcript_end;
	if (start != 0 || end != 0) {
		position = String.format(
			'{0}..{1}',
			record.data.transcript_start,
			record.data.transcript_end
		);
	}
	return position;
}

function renderChrPosition(value, p, record) {
	var position = ""
	
	var chromosome = record.data.chromosome;
	if (chromosome == 'UM') {
		position = chromosome;
	} else { 
		position = String.format(
			'{0}:{1}..{2}',
			chromosome,
			record.data.chr_start,
			record.data.chr_end
		);
	}
	return position;
}

function renderTranscriptLink(value, p, record) {
	var link = String.format(
		'<img src="images/alignment.gif" alt="alignment"/><a href="alignment.htm?id={0}">Sequence View</a>'
		, record.data.transcript_id);
	link += '&nbsp;';
	link += renderGBrowse(record.data.hit);
	link += '&nbsp;',
	link += renderHInvLink(value, p, record);
	return link;
}

function renderHInvLink(value, p, record) {
	return String.format(
		'<a href="/hinv/spsoup/transcript_view?hit_id={0}" class="external">Transcript view</a>'
		+ '&nbsp;'
		+ '<a href="/hinv/spsoup/locus_view?hix_id={1}" class="external">Locus view</a>',
		record.data.hit,record.data.hix
	);
}

function renderPolymorphism(value, p, record) {
	return String.format(
		'<img src="images/polymorphism.gif" alt="polymorphism"/><a href="polymorphism.htm?id={0}">{1}</a>',
		record.data.polymorphism_id,
		record.data.rs_number
	);
}

function renderdbSNPLink(value, p, record) {
	var number = record.data.rs_number;
	number=number.substring(2);
	
	return String.format(
		'<a href="http://www.ncbi.nlm.nih.gov/SNP/snp_ref.cgi?rs={0}" class="external">dbSNP</a>',
		number, record.data.rs_number
	);
}

function renderDomain(value, p, record) {
	return String.format(
		'<a href="http://www.ebi.ac.uk/interpro/IEntry?ac={0}" class="external">{0}</a>',
		value
	);
}

function renderInterProClass(value, p, record) {
	var str = "";
	var parentNode = record.node;
	var node = parentNode.getElementsByTagName('interpro');
	for( var i = 0; i < node.length; i++) {
		var interpro = node.item(i);
		for(var j=0;j<interpro.childNodes.length;j++){
			var element = interpro.childNodes[j];
			var name = element.tagName;
			if (name == 'interpro_id') {
				if(str.length > 0){
					str += "&nbsp;";
				}
				str += renderDomain(element.firstChild.data);
			} else if(name == 'type') {
				typeName = element.firstChild.data;
				str += '[' + typeName + ']';
			}
		}
	}
	return str;
}

function renderPsv(value, p, record) {
	return value;
}

function renderStructuralVariationLink(value, p, record) {
	return String.format(
		'<img src="images/structure.gif" alt="structure"/><a href="structural_variation.htm?id={0}">{1}</a>',
		record.data.id, record.data.stv_id
		);
}

function renderGBrowsePositionLink(value, p, record) {
	var position = renderChrPosition(value, p, record);
	var landmark = "chr" + position;
	return renderGBrowse(landmark);
}

function renderGBrowse(value) {
	return String.format(
		'<img src="images/genome_viewer.gif" alt="genome viewer"/><a href="/gbrowse/cgi-bin/gbrowse/hinv70?name={0}">GBrowse</a>',
		value
	);
//	return "";
}

function renderCnvLink(value, p, record) {
	var link = renderGBrowsePositionLink(value, p, record);
	return link + '&nbsp;' + String.format(
		'<a href="http://www.ncbi.nlm.nih.gov/sites/entrez?cmd=Search&db=PubMed&term={0}[pmid]" class="external">PubMed</a>',
		record.data.pmid
	);
}

