// -*- coding: utf-8 -*-

// **. ajax.js

/* Simple AJAX Code-Kit (SACK)  2005 Gregory Wild-Smith  www.twilightuniverse.com Software licenced under a modified X11 licence, see documentation or authors website for more details */
function sack(file) {
	this.AjaxFailedAlert = "Your browser does not support the enhanced functionality of this website, and therefore you will have an experience that differs from the intended one.\n";
	this.requestFile = file;
	this.method = "POST";
	this.URLString = "";
	this.encodeURIString = true;
	this.execute = false;

	this.onLoading = function() { };
	this.onLoaded = function() { };
	this.onInteractive = function() { };
	this.onCompletion = function() { };

	this.createAJAX = function() {
		try {
			this.xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (err) {
				this.xmlhttp = null;
			}
		}
		if(!this.xmlhttp && typeof XMLHttpRequest != "undefined")
			this.xmlhttp = new XMLHttpRequest();
		if (!this.xmlhttp){
			this.failed = true; 
		}
	};
	
	this.setVar = function(name, value){
		if (this.URLString.length < 3){
			this.URLString = name + "=" + value;
		} else {
			this.URLString += "&" + name + "=" + value;
		}
	}
	
	this.encVar = function(name, value){
		var varString = encodeURIComponent(name) + "=" + encodeURIComponent(value);
	return varString;
	}
	
	this.encodeURLString = function(string){
		var varArray = string.split('&');
        var urlVars;
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split('=');
			if (urlVars[0].indexOf('amp;') != -1){
				urlVars[0] = urlVars[0].substring(4);
			}
			varArray[i] = this.encVar(urlVars[0],urlVars[1]);
		}
	return varArray.join('&');
	}
	
	this.runResponse = function(){
		eval(this.response);
	}
	
	this.runAJAX = function(urlstring){
		this.responseStatus = new Array(2);
		if(this.failed && this.AjaxFailedAlert){ 
			alert(this.AjaxFailedAlert); 
		} else {
			if (urlstring){ 
				if (this.URLString.length){
					this.URLString = this.URLString + "&" + urlstring; 
				} else {
					this.URLString = urlstring; 
				}
			}
			if (this.encodeURIString){
				var timeval = new Date().getTime(); 
				this.URLString = this.encodeURLString(this.URLString);
				this.setVar("rndval", timeval);
			}
			if (this.element) {
                this.elementObj = document.getElementById(this.element);
            }
			if (this.xmlhttp) {
				var self = this;
				if (this.method == "GET") {
					var totalurlstring = this.requestFile + "?" + this.URLString;
					this.xmlhttp.open(this.method, totalurlstring, true);
				} else {
					this.xmlhttp.open(this.method, this.requestFile, true);
				}
				if (this.method == "POST"){
  					try {
						this.xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded')  
					} catch (e) {}
				}

				this.xmlhttp.send(this.URLString);
				this.xmlhttp.onreadystatechange = function() {
					switch (self.xmlhttp.readyState){
						case 1:
							self.onLoading();
						break;
						case 2:
							self.onLoaded();
						break;
						case 3:
							self.onInteractive();
						break;
						case 4:
							self.response = self.xmlhttp.responseText;
							self.responseXML = self.xmlhttp.responseXML;
							self.responseStatus[0] = self.xmlhttp.status;
							self.responseStatus[1] = self.xmlhttp.statusText;
							self.onCompletion();
							if(self.execute){ self.runResponse(); }
							if (self.elementObj) {
								var elemNodeName = self.elementObj.nodeName;
								elemNodeName.toLowerCase();
								if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea"){
									self.elementObj.value = self.response;
								} else {
									self.elementObj.innerHTML = self.response;
								}
							}
							self.URLString = "";
						break;
					}
				};
			}
		}
	};

    this.createAJAX();
}

// **. ajax-dynamic-content.js

/*
Ajax dynamic content
Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.

Alf Magne Kalleland, 2006
Owner of DHTMLgoodies.com
	
T. Hoshi <tk279@cornell.edu> modified the original slightly.
*/	

var adcEnableCache = true;    /// not to be changed if json is to be used.
var adcJsCache = new Array();
var dynamicContent_ajaxObjects = new Array();
var adcAfterTextSetFunction = false;

function ajax_showContent(divId,ajaxIndex,url){
	document.getElementById(divId).innerHTML = dynamicContent_ajaxObjects[ajaxIndex].response;
    adcAfterTextSetFunction && adcAfterTextSetFunction();
	if(adcEnableCache)
		adcJsCache[url] = 	dynamicContent_ajaxObjects[ajaxIndex].response;
	dynamicContent_ajaxObjects[ajaxIndex] = false;
}


function ajax_loadContent(divId, url, callback) {
	if(adcEnableCache && adcJsCache[url]) {
		document.getElementById(divId).innerHTML = adcJsCache[url];
        adcAfterTextSetFunction && adcAfterTextSetFunction();
		return;
	}
	var ajaxIndex = dynamicContent_ajaxObjects.length;
	document.getElementById(divId).innerHTML = '<span style="padding-left:20px;"><img src="/media/vw/loading.gif"/></span>';
	dynamicContent_ajaxObjects[ajaxIndex] = new sack();
	if (url.indexOf('?')>=0) {
		dynamicContent_ajaxObjects[ajaxIndex].method='GET';
		var string = url.substring(url.indexOf('?'));
		var url = url.replace(string,'');
		string = string.replace('?','');
		var items = string.split(/&/g);
		for(var no=0;no<items.length;no++){
			var tokens = items[no].split('=');
			if(tokens.length==2){
				dynamicContent_ajaxObjects[ajaxIndex].setVar(tokens[0],
                                                             tokens[1].replace('&amp;', '&').replace('&quot;', '"').replace('&lt;', '<').replace('&gt;', '>').replace( '&#039;', "'") );
			}
		}
		url = url.replace(string,'');
	}
	dynamicContent_ajaxObjects[ajaxIndex].requestFile = url;	// Specifying which file to get
	dynamicContent_ajaxObjects[ajaxIndex].onCompletion = callback || function() {
        ajax_showContent(divId,ajaxIndex,url);
    };	// Specify function that will be executed after file has been found
	dynamicContent_ajaxObjects[ajaxIndex].runAJAX();		// Execute AJAX function	
}

function json_loadContent(divId, url, callback) {
	if(adcEnableCache && adcJsCache[url]) {
		document.getElementById(divId).innerHTML = adcJsCache[url];
        adcAfterTextSetFunction && adcAfterTextSetFunction();
	}
    else {
	    document.getElementById(divId).innerHTML = '<span style="padding-left:20px;"><img src="/media/vw/loading.gif"/></span>';
      // Use json instead of direct ajax access. it requires jquery js library.
        $.getJSON( url,
                  function(data) {
                      var html =data.parse.text[ "*" ];
                      if (thisDataFormatFunction)
                          html = thisDataFormatFunction(html);
                      adcJsCache[url] = html;    /// insert to cache for next access
		              document.getElementById(divId).innerHTML = adcJsCache[url];
                      adcAfterTextSetFunction && adcAfterTextSetFunction();
                  });
    }
}

// **. ajax-tooltip.js

/*
Ajax tooltip
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
Dhtmlgoodies.com., hereby disclaims all copyright interest in this script
written by Alf Magne Kalleland.
Alf Magne Kalleland, 2006
Owner of DHTMLgoodies.com
Copyright (C) 2006  DTHMLGoodies.com, Alf Magne Kalleland
T. Hoshi <tk279@cornell.edu> modified the original slightly.
*/

var ajax_tooltipObj_callback = ajax_tooltipObj_callback || false;

/* Offset position of tooltip */
var x_offset_tooltip = 5;
var y_offset_tooltip = 0;

var ajax_tooltipObj = false;
var ajax_tooltipObj_iframe = false;

var ajax_tooltipObj_timer = false;
var ajax_tooltipObj_timeout = 800;    //| Time until the div disappears
// var ajax_tooltipObj_timeout_show = 900;    //| Cursor time on linked text until the div pops up
var ajax_tooltipObj_timeout_show = 1000;    //| Cursor time on linked text until the div pops up
var ajax_tooltipObj_timer_show = false;
var ajax_tooltipObj_use_json = true;    /// use json rather.

var ajax_tooltip_MSIE = false;
if(navigator.userAgent.indexOf('MSIE')>=0)
    ajax_tooltip_MSIE=true;

function _ajax_showTooltip(url, inputObj) {
    clearTimeout(ajax_tooltipObj_timer);
    if (tkTooltipEnable) {
        
	    if(!ajax_tooltipObj)	/* Tooltip div not created yet ? */ {
		    ajax_tooltipObj = document.createElement('DIV');
		    ajax_tooltipObj.style.position = 'absolute';
		    ajax_tooltipObj.id = 'ajax_tooltipObj';
		    document.body.appendChild(ajax_tooltipObj);
		    
		    var leftDiv = document.createElement('DIV');	/* Create arrow div */
		    leftDiv.className='ajax_tooltip_arrow';
		    leftDiv.id = 'ajax_tooltip_arrow';
		    ajax_tooltipObj.appendChild(leftDiv);
		    
		    var contentDiv = document.createElement('DIV'); /* Create tooltip content div */
		    contentDiv.className = 'ajax_tooltip_content';
		    ajax_tooltipObj.appendChild(contentDiv);
		    contentDiv.id = 'ajax_tooltip_content';
		    
		    if(ajax_tooltip_MSIE) {	/* Create iframe object for MSIE in order to make the tooltip cover select boxes */
			    ajax_tooltipObj_iframe = document.createElement('<iframe frameborder="0">');
			    ajax_tooltipObj_iframe.style.position = 'absolute';
			    ajax_tooltipObj_iframe.border='0';
			    ajax_tooltipObj_iframe.frameborder=0;
			    ajax_tooltipObj_iframe.style.backgroundColor='#FFF';
			    ajax_tooltipObj_iframe.src = 'about:blank';
			    contentDiv.appendChild(ajax_tooltipObj_iframe);
			    ajax_tooltipObj_iframe.style.left = '0px';
			// ajax_tooltipObj_iframe.style.top = '0px';
			    ajax_tooltipObj_iframe.style.top = '0px';
		    }
			
	    }
        
    // TK. Added!! When mouse is in the tooltip, dont erase it and keep showing it.
        ajax_tooltipObj.onmouseover    = function (e) {
            clearTimeout(ajax_tooltipObj_timer);
            return false
        };
        ajax_tooltipObj.onmouseout    = ajax_hideTooltip;
        if (ajax_tooltipObj_use_json)
            json_loadContent('ajax_tooltip_content', url, ajax_tooltipObj_callback);
        else
            ajax_loadContent('ajax_tooltip_content', url, ajax_tooltipObj_callback);
	    if(ajax_tooltip_MSIE) {
		    ajax_tooltipObj_iframe.style.width = ajax_tooltipObj.clientWidth + 'px';
		    ajax_tooltipObj_iframe.style.height = ajax_tooltipObj.clientHeight + 'px';
	    }
        
	    ajax_tooltipObj.style.left = ajaxTooltip_getLeftPos(inputObj) + 'px';
	    ajax_tooltipObj.style.top = (ajaxTooltip_getTopPos(inputObj) + inputObj.offsetHeight + 5) + 'px';
	    ajax_tooltipObj.style.display = 'block';
	    ajax_positionTooltip(inputObj);
    }
}

var _inputObj = false;
var thisDataFormatFunction = false;
var tkTooltipEnable = true;
function ajax_showTooltip(url, inputObj, dataFormatFunction) {    /// !!
        _inputObj = inputObj;
        thisDataFormatFunction = dataFormatFunction || false;
        ajax_tooltipObj_timer_show = setTimeout("_ajax_showTooltip('"+url.replace(/\'/g, "\\'")+"', _inputObj)", ajax_tooltipObj_timeout_show );
}

function ajax_positionTooltip(inputObj) {
	var leftPos = ajaxTooltip_getLeftPos(inputObj);
	var topPos = ajaxTooltip_getTopPos(inputObj) + inputObj.offsetHeight + 5;
	var rightedge = ajax_tooltip_MSIE? document.body.clientWidth : window.innerWidth;
	var tooltipWidth = document.getElementById('ajax_tooltip_content').offsetWidth
        + document.getElementById('ajax_tooltip_arrow').offsetWidth; 
	// Dropping this reposition for now because of flickering
    var overflow_px = (leftPos + tooltipWidth - rightedge) + 40;    //| 40 is added to deal with a bit of overflow in Firefox
    if (overflow_px > 0)
        leftPos = leftPos - overflow_px;
	
	ajax_tooltipObj.style.left = leftPos + 'px';
	ajax_tooltipObj.style.top = topPos + 'px';
}

function ajax_hideTooltip() {
    ajax_tooltipObj_timer = setTimeout(function() {
        if (typeof ajax_tooltipObj.style=="object" && "display" in ajax_tooltipObj.style)
            ajax_tooltipObj.style.display='none'
    }, ajax_tooltipObj_timeout );
    clearTimeout(ajax_tooltipObj_timer_show); 
}

/*
function ajaxTooltip_getTopPos(inputObj) {
    var returnValue = inputObj.offsetTop;
    while((inputObj = inputObj.offsetParent) != null){
  	    if(inputObj.tagName!='html')
            returnValue += inputObj.offsetTop;
    }
    return returnValue;
}

function ajaxTooltip_getLeftPos(inputObj) {
    var returnValue = inputObj.offsetLeft;
    while((inputObj = inputObj.offsetParent) != null){
  	if(inputObj.tagName!='html')
        returnValue += inputObj.offsetLeft;
    }
    return returnValue;
}
*/

function ajaxTooltip_getTopPos(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
	    do {
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);
    }
	return curtop;
}
function ajaxTooltip_getLeftPos(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
	    do {
			curleft += obj.offsetLeft;
		} while (obj = obj.offsetParent);
    }
	return curleft;
}
