/*
 * Lib.js
 * (c)2008/2009 Bell Systems LLC
 * 
 * License: http://bellspace.net/licenses/non-commercial.html (Non-Commercial) 
 * Licensing: http://bellspace.net/licensing/index.html 
 * 
 * Bell Systems LLC Libraries
 *
 */

var globalInterrupt = false;

function errorFunction(response)
{
    ERR.innerHTML = "viewMain.js: ajaxCall() error. Please try again.";
	ERR.innerHTML += "<br/>"
	ERR.innerHTML += response
};

function includeScript(src)
{
    var newScript = document.createElement("script");
    newScript.src = src;
    newScript.language = "javascript";
    document.body.appendChild(newScript);
}

function includeCss(href, title)
{
    var sheets = document.styleSheets;
    var alreadyIncluded = false;
	
    if(sheets)
    {
        for(var i=0; i<sheets.length; i++)
		{
			if(sheets[i].title == title)
			{
                alreadyIncluded = true;
				break;
			}
		}
	}
	
	if(!alreadyIncluded)
	{
        var newCss = document.createElement("link");
		newCss.title = title;
        newCss.rel = "stylesheet";
        newCss.type = "text/css";
        newCss.href = href;
        newCss.disabled = true;
        document.getElementsByTagName("head")[0].appendChild(newCss);		
    }
}

var safariHackIndex = 0;
function updateCss(innerHTML, title)
{
    var styles = document.getElementsByTagName("style");
    var links = document.getElementsByTagName("link");
	var alreadyIncluded = false;
    /*alert(navOrientation)
	alert("START TITLE");
	alert(title)*/	
		
	if(links)
	{
        //alert("START LINKS")
        for(var i=0; i<links.length; i++)
        {
            //alert(links[i].title);
			//alert(links[i].disabled);
            if(links[i].title == title)
            {
				links[i].title = "disabled" + i;
				links[i].disabled = true;
				links[i].parentNode.removeChild(links[i]);
                break;
            }				
        }		
    }		
		
	if(styles)
	{
		//alert("START STYLES")
        for(var i=0; i<styles.length; i++)
        {
			//alert(styles[i].title);
            if(styles[i].title == title)
            {
                alreadyIncluded = true;
                break;
            }
        }
    }

    if(!alreadyIncluded)
    {
		//alert("1")
        var newCss = document.createElement("style");
		newCss.setAttribute("type", "text/css");
		
		//explorer and safari do things their own way
		if(browserDetect.browser == "Explorer")
		{
            newCss.styleSheet.cssText = innerHTML;			
		}
		else if(browserDetect.browser == "Safari")
		{
            newCss = document.createElement("link");
            newCss.rel = "stylesheet";
            newCss.type = "text/css";       
			newCss.href = "http://" + myHost + "/new_slang/lib/css/safariComplexCssHack" + safariHackIndex + ".css";
			safariHackIndex++;
		}	
        else
		{
            newCss.innerHTML = innerHTML;
		}
        newCss.title = title;
        newCss.disabled = true;
        document.getElementsByTagName("head")[0].appendChild(newCss);
    }
	else
	{
		//alert("2")

        styles[i].disabled = true;			

		if(browserDetect.browser == "Explorer")
		{          
			if(browserDetect.version > 6)
			{
                //ie6 crashes after a few ajax reloads of the statement below...				
                styles[i].styleSheet.cssText = innerHTML;	
			}
			else
			{				
				//so we do it ghetto like this					
	            styles[i].title = "ie_ghettostylesheet_disabled";
				
		        var newCss = document.createElement("style");
		        newCss.setAttribute("type", "text/css");
				
				newCss.styleSheet.cssText = innerHTML;
				
		        newCss.title = title;
		        newCss.disabled = true;
		        document.getElementsByTagName("head")[0].appendChild(newCss);
			}			
		}
		else if(browserDetect.browser == "Safari")
		{
            //
		}
		else
		{
            styles[i].innerHTML = innerHTML;
        }
	}
}

function getEventObject(e)
{
    var eventObject;
    if(window.event != undefined)
    {
        eventObject = window.event;
    }
    else if(e)
    {
        eventObject = e;
    }   
    
    return eventObject;
}

function getEventTarget(eventObject)
{
    var eventTarget;
    
    if(eventObject.target) 
    {
        eventTarget = eventObject.target;
    }
    else if(eventObject.srcElement) 
    {
        eventTarget = eventObject.srcElement
    }
	if(browserDetect.browser == "Safari")
	{
	    if (eventTarget.nodeType == 3) // defeat Safari bug
	    {
	        eventTarget = eventTarget.parentNode;   
	    }
	}
    
    return eventTarget; 
}

/* getElementsByClassName*/

/* Sadly ie7 does not think that objects that are retrieved from the dom 
 * can be prototyped (iebug1). Maybe I can get this to work one day so I'll leave it.
 */

/*Object.prototype.getElementsByClassName = function(className, tagName)
{
    return getElementsByClassName(className, this, tagName);
}

Object.prototype.getElementByClassName = function(className, tagName)
{
    return getElementByClassName(className, this, tagName);
}*/

function getElementByClassName(className, containerEl, tagName)
{
    return getElementsByClassName(className, containerEl, tagName, true);
}

function getElementsByClassName(className, containerEl, tagName, returnSingleEl)
{
    return getElementsBy("className", undefined, className, containerEl, tagName, returnSingleEl);
}

function getElementsByClassNameie6HACK(className, containerEl, tagName, returnSingleEl)
{
    /* ie6 uses the whatever:hover .htc from peterNed 
     * this .htc mangles the classNames of elements so that ie6 can use :hover 
     * psuedoclasses. So we have to use getElementsByClassNameie6HACK() in the
     * instances where elements may have been mangled. getElementsByClassNameie6HACK()
     * uses a .search() comparison rather than == comparison because mangled classNames
     * can look like "keyboard_selected_none onhover" instead of "keyboard_selected_none"
     */
    return getElementsBy("className", undefined, className, containerEl, tagName, returnSingleEl, true);
}

function getElementByAttribute(attributeName, property, containerEl, tagName)
{
    return getElementsByAttribute(attributeName, property, containerEl, tagName, true);
}

function getElementsByAttribute(attributeName, property, containerEl, tagName, returnSingleEl)
{
    return getElementsBy("attribute", attributeName, property, containerEl, tagName, returnSingleEl);
}

function getElementByName(name, containerEl, tagName)
{
	return getElementByAttribute("name", name, containerEl, tagName);
}

function getElementsByName(name, containerEl, tagName)
{
	return getElementsByAttribute("name", name, containerEl, tagName);
}

function getElementBy(type, attributeName, property, containerEl, tagName, returnSingleEl, ie6hack)
{
	if(type == "name")
	{
		type = "attribute";
		property = attributeName;
		attributeName = "name";
	}
	return getElementsBy(type, attributeName, property, containerEl, tagName, returnSingleEl, ie6hack)[0];
}

function getElementsBy(type, attributeName, property, containerEl, tagName, returnSingleEl, ie6hack)
{
    var returnElements = new Array();
    var docElements;

    //check if the tagName is defined
    if(tagName != undefined)
    {
        if(containerEl != undefined)
        {
            docElements = containerEl.getElementsByTagName(tagName)
        }           
        else
        {
            docElements = document.getElementsByTagName(tagName);
        }   
    }
    else
    {
        if(containerEl != undefined)
        {
            docElements = containerEl.getElementsByTagName("*");
        }
        else
        {
            docElements = document.getElementsByTagName("*");
        }
    }

    var elementsLength = docElements.length;

    for(var i=0; i<elementsLength; i++)
    {
        if(type == "className")
        {
            if(ie6hack)
            {
                if(docElements[i].className.search(property) > -1)
                {
                    returnElements.push(docElements[i]);
                    
                    //return a single element NOT an array
                    if(returnSingleEl)
                    {
                        returnElements = returnElements[0];
                        break;
                    }
                }               
            }
            else
            {
                if(docElements[i].className == property ||
				   docElements[i].getAttribute("class") == property)
                {
                    returnElements.push(docElements[i]);
                    
                    //return a single element NOT an array
                    if(returnSingleEl)
                    {
                        returnElements = returnElements[0];
                        break;
                    }
                }
            }
        }
        else if(type == "attribute")
        {
            if(docElements[i].getAttribute(attributeName) == property)
            {
                returnElements.push(docElements[i]);
                
                //return a single element NOT an array
                if(returnSingleEl)
                {
                    returnElements = returnElements[0];
                    break;
                }
            }
        }
    }
	
	if(typeof(returnElements) == "object" && returnElements.length == 0)
	{
		returnElements = false;
	}
    
    return returnElements;  
}

function findPos(obj) 
{
    var curLeft = 0;
    var curTop = 0;
    if (obj.offsetParent) 
    {
        curLeft = obj.offsetLeft;
        curTop = obj.offsetTop;
        
        while((obj = obj.offsetParent)) 
        {
            curLeft += obj.offsetLeft
            curTop += obj.offsetTop
        }
    }
    return {left:curLeft, top:curTop};
}

function initForms(actionObj, formInput)
{	
	var firstFocus = true;

	if(formInput)
	{
		var inputs = Array(formInput);
	}
	else
	{
        var inputs = document.getElementsByTagName("input")		
	}
	
    if(actionObj)
	{
	    if(actionObj.id && actionObj.id == "create_account_button2")
	    {
	        firstFocus = false;
	    }   
	}

	if(firstFocus)
	{
	    //focus first input element
		for(var i=0; i<inputs.length; i++)
		{
	        if(inputs[i].type == "text")
	        {
                try
				{
                    inputs[i].focus();
				}
				catch(err)
				{
					
				}
                break;
			}
		}
	}
    
    //add enter key submit 
	/*fix so dropdowns are not interrupted*/
    for(var i=0; i<inputs.length;i++)
    {
        inputs[i].onkeypress = function(e)
        {
            var eventObject;
            if(window.event != undefined)
            {
                eventObject = window.event;
            }
            else if(e)
            {
                eventObject = e;
            }
            
            if(eventObject.keyCode == 13)
            {
				if(actionObj.type && actionObj.type == "button")
				{
					actionObj.click();
				} 
				else if(actionObj)
				{
					actionObj();
				}
				else
				{
                    this.form.submit();
				}
            }
        }
    }
}

function getCss(selector, property) 
{
    for(var i=0; i<document.styleSheets.length; i++)
    {
        var sheet = document.styleSheets[i];
        
        if(browserDetect.browser == "Explorer")
        {
            var rules = sheet.rules;
        }
        else
        {
            var rules = sheet.cssRules;
        }
        
        for(var j=0; j<rules.length; j++)
        {       		
            if(rules[j].selectorText)
            {
				//there could be multiple selectors in the selector text
				//eg.. tr.highlight_bgcolor, tr.highlight_bgcolor_first
				var multipleSelectors = rules[j].selectorText.split(",");
				
				//lets check them here
				for(var k=0; k<multipleSelectors.length; k++)
				{
					if(multipleSelectors[k].toLowerCase() === selector.toLowerCase())
					{
						return rules[j].style[property];
					}
				}
            }
        }   
    }
    return null;
}

function ajaxSendFile(param, formObj, successFunction, errorFunction)
{
    if(successFunction == false)
    {
        successFunction = function()
        {
            //
        }
    }

    //default url we call
    var callUrl = mySelf + param;
    if(param.search("http://") == 0)
    {
        callUrl = param;
    }
		
	dojo.io.iframe.send
	({
        url: param,
        contentType: "multipart/form-data",
        handleAs: "html",
        load: function(response, ioArgs)
        {
			successFunction(response);
        },
        error: function(error, ioArgs)
        {
            alert(error);
        },
        form: formObj
	});
}

function ajaxPostCall(param, contentObj, successFunction, errorFunction, responseDataType)
{
    //we may have decided to be lazy and not pass in a success function
    //because we really didnt care if the ajax call succeeded or it required no
    //further processing
	
	var formName = "";
	if(typeof(contentObj) == "string")
	{
		//contentObj is the name of a form
		formName = contentObj
		contentObj = new Object();
	}
	
	var fixedContent = {};
	fixPostContent(contentObj, null, fixedContent);
	contentObj = fixedContent;	
	
    if(successFunction == false)
    {
        successFunction = function()
        {
            //
        }
    }
	
    if(!responseDataType)
    {
        responseDataType = "text";
    }
    
    //default url we call
    var callUrl = mySelf + param;
    if(param.search("http://") == 0)
    {
        callUrl = param;
    }
    
    dojo.xhrPost(
    {
        url: callUrl,
        handleAs: responseDataType,
        timeout: 1000000, //1000 seconds

        form:formName,
        content:contentObj,
		
        // The LOAD function will be called on a successful response.
        load: function(response, ioArgs) 
        { 
            successFunction(response);
        },

        // The ERROR function will be called in an error case.
        error: function(response, ioArgs) 
        {
            //hacked in for now... make a real error function later
            if(errorFunction)
            {
                errorFunction(response);
            }
            else
            {
                //console.error("HTTP status code: ", ioArgs.xhr.status); 
                ERR.innerHTML = "ajaxPostCall() error: dojo.xhrPost. callUrl=" + callUrl;
                //return response; 
            }
        }
    });	
}

//this function is 
function fixPostContent(content, key, pdata)
{
	if (typeof(content) == 'object')
	{
		for (k in content)
		{
            if (!key)
            {
                fixPostContent(content[k], k, pdata);
            } 
			else
            {
                fixPostContent(content[k], key + '[' + k +']', pdata);
            }
        }
	} 
	else if (key) 
	{
		pdata[key] = content;
	}  
}

function ajaxGetCall(param, successFunction, errorFunction, responseDataType)
{
	ajaxCall(param, successFunction, errorFunction, responseDataType);
}

function ajaxCall(param, successFunction, errorFunction, responseDataType)
{
	//this is the original ajaxCall() it uses GET to post stuff to the server 
	
	//we may have decided to be lazy and not pass in a success function
	//because we really didnt care if the ajax call succeeded or it required no
	//further processing
	if(successFunction == false)
	{
		successFunction = function()
		{
			//
		}
	}
	
	if(!responseDataType)
	{
		responseDataType = "text";
	}
	
	//default url we call
	var callUrl = mySelf + param;
	if(param.search("http://") == 0)
	{
		callUrl = param;
	}
	
    dojo.xhrGet(
    {
        url: callUrl,
        handleAs: responseDataType,
        timeout: 1000000, //1000 seconds

        // The LOAD function will be called on a successful response.
        load: function(response, ioArgs) 
        { 
            successFunction(response);
        },

        // The ERROR function will be called in an error case.
        error: function(response, ioArgs) 
        {
			//hacked in for now... make a real error function later
			if(errorFunction)
			{
				errorFunction(response);
			}
			else
			{
                //console.error("HTTP status code: ", ioArgs.xhr.status); 
                ERR.innerHTML = "ajaxCall() error: dojo.xhrGet. callUrl=" + callUrl;
                //return response; 
			}
        }
    });
}

function activateStyleSheet(title) 
{
    var sheets = document.styleSheets;
    var activated = false;
    
    if(browserDetect.browser == "Safari")
    {
        var links = document.getElementsByTagName("link");
        if(links)
        {
            for(var i=0; i<links.length; i++)
            {
                if(links[i].title == title)
                {
                    activated = true;
                    links[i].disabled = false;
                    break;
                }  
            }
        }
    }
    else if(sheets)
    {
        for(var i=0; i<sheets.length; i++)
        {
            if(sheets[i].title == title)
            {
                activated = true;
                sheets[i].disabled = false;
                break;
            }       
        }
    }
        
    return activated;
}

function deactivateStyleSheet(title) 
{
    var sheets = document.styleSheets;
    var deactivated = false;

    if(browserDetect.browser == "Safari")
    {
        var links = document.getElementsByTagName("link");
        if(links)
        {
            for(var i=0; i<links.length; i++)
            {
                if(links[i].title == title)
                {
                    deactivated = true;
                    links[i].disabled = true;
                    break;
                }  
            }
        }
    }
    else if(sheets)
    {
        for(var i=0; i<sheets.length; i++)
        {
            if(sheets[i].title == title)
            {
                deactivated = true;
                sheets[i].disabled = true;
                break;
            }       
        }
    }
    
    return deactivated;
}

function dbugPrint(string)
{
	if(gDbug)
	{
		DBUG.innerHTML = string;
	}
}

function setCookie(name,value,days) 
{
    if(days) 
	{
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) 
{
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) 
	{
        var c = ca[i];
        while(c.charAt(0)==' ')
		{
			c = c.substring(1,c.length);
		}
        if(c.indexOf(nameEQ) == 0) 
		{
            return c.substring(nameEQ.length,c.length);		
		}
    }
    return null;
}

function eraseCookie(name) 
{
    createCookie(name,"",-1);
}

function Cursor()
{
	this.elements = document.body.getElementsByTagName("*");
	
	this.startWaiting = function()
	{
		for(var i=0; i<this.elements.length; i++)
		{
            if(this.elements[i].style.cursor == "pointer")
            {
				this.elements[i].origCursor = "pointer";       
            }
						
			if(this.elements[i].nodeName != "SPAN" && this.elements[i].nodeName != "TD")
			{
                this.elements[i].style.cursor = "wait";
			}
		}
	};
	
	this.stopWaiting = function()
	{
        for(var i=0; i<this.elements.length; i++)
        {
            if(this.elements[i].nodeName == "A" || this.elements[i].origCursor == "pointer")
            {
                this.elements[i].style.cursor = "pointer";
            }
			else if(this.elements[i].parentNode.nodeName == "A")
			{
				this.elements[i].style.cursor = "pointer";
			}
			else if(this.elements[i].nodeName != "SPAN" && this.elements[i].nodeName != "TD")
			{
                this.elements[i].style.cursor = "default";
			}		
        }		
	};
}

function loadingSpinIndicator()
{
	//stub function that requires a loadingSpinner() function in 
	//your ajax javascript to do the actual gui indicating
    this.interval = false;
	this.isLoading = false;
	this.startLoading = function()
	{
		this.isLoading = true;
		if(!this.interval)
		{
            this.interval = setInterval("loadingSpinner();", 250);
		}
	}
	this.stopLoading = function()
	{
        clearInterval(this.interval);
		loadingSpinner(true);
		this.isLoading = false;
	}
}

function sortingSpinIndicator(obj)
{
    obj.style.color="red";
	if(obj.nodeName == "SPAN")
	{
	   obj.innerHTML = "Sorting...";
    }
}

function pagingSpinIndicator(obj)
{
    obj.style.color="red";
	if(obj.nodeName == "SPAN")
	{
	   obj.innerHTML = "Paging...";
    }
}


function in_array(needle, haystack, strict) 
{
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
 
    var found = false, key, strict = !!strict;
 
    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }
 
    return found;
}

function array_search(needle, haystack, strict ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: array_search('zonneveld', {firstname: 'kevin', middle: 'van', surname: 'zonneveld'});
    // *     returns 1: 'surname'
 
    var strict = !!strict;
 
    for(var key in haystack){
        if( (strict && haystack[key] === needle) || (!strict && haystack[key] == needle) ){
            return key;
        }
    }
 
    return false;
}

function multiSelectAll(elementSrc, fieldName)
{
	var inputs = elementSrc.getElementsByTagName("input");
	for(var i=0; i<inputs.length; i++)
	{
		if(!inputs[i].checked)
		{
			inputs[i].checked = true;
		}
	}
}

function multiSelectAll(elementSrc, fieldName)
{
	var inputs = elementSrc.getElementsByTagName("input");
	for(var i=0; i<inputs.length; i++)
	{
		if(!inputs[i].checked)
		{
			inputs[i].checked = true;
		}
	}
}

function multiReset(elementSrc, fieldName)
{
	var inputs = elementSrc.getElementsByTagName("input");
	for(var i=0; i<inputs.length; i++)
	{
		if(inputs[i].checked)
		{
			inputs[i].checked = false;
		}
	}	
}

function startLoadingIndicator(loadingEl)
{
	if(!loadingEl)
	{
		return;
	}
	
	var property = "innerHTML";
	var buttonSpacer3Space = "";
	var buttonSpacer2Space = "";
	var buttonSpacer1Space = "";
	
	if(loadingEl.nodeName == "INPUT")
	{
		property = "value";
		//used if element is a button so button width will not change 
		buttonSpacer3Space = "   ";
		buttonSpacer2Space = "  ";
		buttonSpacer1Space = " ";
	}
	
	var prefixes = new Array("Search", "Load");
	
	for(var i=0; i<prefixes.length; i++)
	{
		var indicatorString = prefixes[i] + "ing";
	
		if(loadingEl[property] == prefixes[i])
		{
			loadingEl[property] = indicatorString + buttonSpacer3Space;
		}		
		else if(loadingEl[property] == "")
		{
			loadingEl[property] = indicatorString + buttonSpacer3Space;
		}
		else if(loadingEl[property] == indicatorString + buttonSpacer3Space)
		{
			loadingEl[property] = indicatorString + "." + buttonSpacer2Space;
		}
		else if(loadingEl[property] == indicatorString + "." + buttonSpacer2Space)
		{
			loadingEl[property] = indicatorString + ".." + buttonSpacer1Space
		}
		else if(loadingEl[property] == indicatorString + ".." + buttonSpacer1Space)
		{
			loadingEl[property] = indicatorString + "...";
		}
		else if(loadingEl[property] == indicatorString + "...")
		{
			loadingEl[property] = indicatorString + buttonSpacer3Space;
		}
	}

	var timeoutObj = setTimeout(function(){startLoadingIndicator(loadingEl)}, 200);

	loadingEl.timeoutObj = timeoutObj;	
}

function resetLoadingIndicator(loadingEl)
{
	clearTimeout(loadingEl.timeoutObj);
	
	var property = "innerHTML";
	var originalProperty = "original_innerHTML";
	if(loadingEl.nodeName == "INPUT")
	{
		property = "value";
		originalProperty = "original_value";
	}	
	
	if(loadingEl[originalProperty] && loadingEl[originalProperty] != "")
	{
		loadingEl[property] = loadingEl[originalProperty];
	}
	else
	{
		loadingEl[property] = "";	
	}
}

function checkExportFile(fileName, runningQueryFile, loadingObj)
{
    var successFunction = function(response)
    {
		if(response.status == "!EXPORT_TO_FILE_SUCCESS!")
		{
			var iframe = document.createElement("iframe");
			iframe.style.display = "none";
			document.body.appendChild(iframe);
			iframe.src = "http://" + myHost + "/linktron_frontend/file_export/" + response.file_name;
			
			
			//window.location.href = "http://" + myHost + "/linktron_frontend/file_export/" + response.file_name;
			resetLoadingIndicator(loadingObj);		
		}
		else if(response.status == "!WAITING!")
		{
			checkExportFile(fileName, runningQueryFile, loadingObj);
		}
    }; 
	
    var param = "http://" + myHost + "/linktron_frontend/ajax_controllers/CheckExportFile.php?&file_name=" + fileName + "&running_query_file=" + runningQueryFile;     
	ajaxPostCall(param, "view_form", successFunction, errorFunction, "json");			
}
