/*
  Base system object.
*/	

// Base sci Class. All custom methods to be held here
function sci() { }

sci.isHere = true;

sci.hasClass = function( target, cl )
{
    var reg = new RegExp( "(^| )"+cl+"( |$)" );
    return ( target && target.className && target.className.match( reg ) ) ?  true : false;
}

sci.addClass = function( target, cl )
{
    if ( ! this.hasClass( target, cl ) )
    {
	var old = '';
	if ( target.className && target.className != '' ) { old = ' '+target.className }
	target.className = cl+old;
    }
}

sci.removeClass = function( target, cl )
{
    if ( this.hasClass( target,cl ) )
    {
	var list = target.className.split( ' ' );
	var nl = new Array;
	for ( var x in list )
	{
	    if ( list[x] != cl ) { nl[nl.length] = list[x] }
	}
	target.className = nl.join( ' ');
    }
}

sci.swapClass = function( target, cl1, cl2 )
{
    this.removeClass( target, cl1 );
    this.addClass( target, cl2 );
}

sci.toggleClass = function( target, cl )
{
    if ( this.hasClass( target, cl ) )
    {
	this.removeClass( target, cl );
    }
    else
    {
	this.addClass( target, cl );
    }
}

sci.getElementsByClass = function(searchClass,node,tag) 
{
    var classElements = new Array();
    if ( node == null )
    node = document;
    if ( tag == null )
    tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    for (i = 0, j = 0; i < elsLen; i++) {
	if ( this.hasClass(els[i], searchClass) ) {
	    classElements[j] = els[i];
	    j++;
	}
    }
    return classElements;
}

sci.runRequestXML = function( url, xmlFunction, forcePost )
{
    if ( ! forcePost  ) { forcePost = false }
    sci.runRequest( url, xmlFunction, forcePost, 'responseXML' );
}

sci.runRequestText = function ( url, textFunction, forcePost )
{
    if ( ! forcePost  ) { forcePost = false }
    sci.runRequest( url, textFunction, forcePost, 'responseText' );
}

sci.runRequest = function( url, callBack, forcePost, functionWrapper )
{   
    var xmlhttp = '';
    if ( window.ActiveXObject ) // if it's ie
    {
	xmlhttp  = new ActiveXObject("Microsoft.XMLHTTP");
	xmlhttp.onreadystatechange = sci.updatefunc( xmlhttp, functionWrapper, callBack );
    }
    else
    {
	if (window.XMLHttpRequest)
	{
	    xmlhttp  = new XMLHttpRequest(); 
	    xmlhttp.onload = sci.updatefunc( xmlhttp,  functionWrapper, callBack );
	}
	else return; //
    }
    // Long URL convert to POST
    var params = null;
    if ( url.length > 2048 || forcePost )
    {
	var l = url.split( '?' );
	url = l[0];
	params = l[1];
	xmlhttp.open( 'POST', url, true );
	xmlhttp.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );
	xmlhttp.setRequestHeader( 'Content-length', params.length );
    }
    else
    {
	xmlhttp.open( 'GET', url, true );
    }
    xmlhttp.send( params );
}

sci.updatefunc = function ( xmlh, type, callBack )
{
    var f = function ()
    {
        if( xmlh.readyState == 4 )
        {
            if ( xmlh.status == 200 )
            {
                callBack( xmlh[type] );
            }
            else
            {
                callBack( '' );
            }
        }
    };
    return f;
}

sci.filler = function( target )
{
   var f = function( content ) 
   { 
       target.innerHTML = content;
   }
   return f;
}

sci.popper = function( e ) 
{
    var targ = get_event_target( e );
    
    if ( targ.nodeName == 'IMG' ) { targ = targ.parentNode }
    
    if ( ! targ.href ) { return true }
    
    var width=300;
    var height=300;
    var scroll='yes';
    if ( targ.rel )
	{
	    var size = targ.rel.match(/^(pop.+) (.+$)/); 
	    if ( size )
		{
		    var tmp = size[2].split(/x/);
		    width = tmp[0];
		    height = tmp[1];
		    if ( size[1] == 'popad' ) { scroll = 'no' }
		}
	    
	}

    var left = 800 - width;
    var top = 600 - height;

    window.open(targ.href,'help','width='+width+',height='+height+',left='+left+',top='+top+',screenX='+left+',screenY='+top+',scrollbars='+scroll);
    
    return false;
}

sci.setupPopups = function()
{
   var links = document.getElementsByTagName( 'A' );
   for ( var x = 0; x < links.length; x++ )
   {
	if ( sci.hasClass( links[x], 'popper' ) ) { addEvent( links[x], 'click', sci.popper ) }
   }
}

addEvent( window, 'load', sci.setupPopups );

sci.findPos = function(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}


function get_event_target( e )
{
    var targ;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;

    return targ;
}


function addEvent(element, type, handler) 
{
    // assign each event handler a unique ID
    if (!handler.$$guid) handler.$$guid = addEvent.guid++;
    // create a hash table of event types for the element
    if (!element.events) element.events = {};
    // create a hash table of event handlers for each element/event pair
    var handlers = element.events[type];
    if (!handlers) {
        handlers = element.events[type] = {};
        // store the existing event handler (if there is one)
        if (element["on" + type]) {
            handlers[0] = element["on" + type];
        }
    }
    // store the event handler in the hash table
    handlers[handler.$$guid] = handler;
    // assign a global event handler to do all the work
    element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) 
{
    // delete the event handler from the hash table
    if (element.events && element.events[type]) {
        delete element.events[type][handler.$$guid];
    }
};

function handleEvent(event) 
{
    // grab the event object (IE uses a global event object)
    event = event || window.event;
    // get a reference to the hash table of event handlers
    var handlers = this.events[event.type];

    var ret = true;

    // execute each event handler
    for (var i in handlers) {
        this.$$handleEvent = handlers[i];
        var newret = this.$$handleEvent(event);
        if ( newret == null ) newret = true;
	ret = ret && newret;
    }

    return ret;
};

function createCookie(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);
}

