// Fake console.log for browsers without console
if(!console || !console.log) {  
	var console = {
		log : function () {} 
	};   
}  

///////////////////////////////////////////// Timeout Array
window.timeOuts=[]; 
function clearAllTimeouts(){  
    for(var key in timeOuts ){ 
        clearTimeout(timeOuts[key]);  
    }  
}

///////////////////////////////////////////// Search
var tsearch=function(sss,ttt) {
    clearAllTimeouts();
    timeOuts['search'] = setTimeout("dosearch('"+sss+"','"+ttt+"')",1000)
}
var dosearch=function(sss,ttt) {
    if (sss.length>2)
    {
        var dname='main_content';
        $(dname).innerHTML='<img id="ajaxloader" src="../library/ajaxloader.gif" alt="loading..." />';
        var act='search';
        new Ajax.Updater(dname,'ajax.asp',{parameters:{act:act,term:sss,h1:ttt},evalScripts:true});
    }
}
////////////////////////////////////////////////////////////////////////////////////////// Jamies JS Pformatter
var pformat=function(sss) {
    if (sss!="") {
        sss=sss.replace(/ /g,'_');
        sss=sss.replace(/__/g,'_');
        sss=sss.replace(/'/g,"");
        sss=sss.replace(/:/g,"");
        sss=sss.replace(/,/g,"");
        sss=sss.replace(/\//g,"");
        sss=sss.replace(/%/g,"");
        sss=sss.replace(/&/g,"");
        sss=sss.replace(/$/g,"");
        sss=sss.replace(/£/g,"");
        sss=sss.replace(/""/g,"");
        sss=sss.replace(/!/g,"");
        sss=sss.replace(/\?/g,"");
        sss=sss.replace(/#/g,"");
        sss=sss.replace(/@/g,"");
        sss=sss.replace(/~/g,"");
        sss=sss.replace(/</g,"");
        sss=sss.replace(/>/g,"");
        sss=sss.replace(/\*/g,"");
        sss=sss.replace(/^/g,"");
        sss=sss.replace(/__/g,"_");
    }
    sss=sss.toLowerCase();
    return sss;
}
///////////////////////////////////////////// Leftnav Slider
var showleft=function(sss,ttt) {
    Effect.Queues.get("lefter").cancel(sss)
    if ($(sss).style.display=='none') {
        Effect.Appear(sss,{ queue:{scope:"lefter"} });
    }
    else {
        $(sss).morph('height:'+eval(ttt*40)+'px;',{ queue:{scope:"lefter"} });
    }
}
var hideleft=function(sss) {
    Effect.Queues.get("lefter").cancel(sss)
    Effect.BlindUp(sss,{queue:{scope:"lefter"}, scaleContent:true, scaleMode:'contents' }); 
}
///////////////////////////////////////////// Bottom Slider
var domorph=function(sss) {
    $(sss).morph('height:120px;'); 
    return false;
}
var unmorph=function(sss) {
    $(sss).morph('height:35px;');
    return false;
}

////////////////////////////////////////////////////////////////////////////////////////// Editing Functions
var pos=function(table,list) {
    var thelist=Sortable.sequence(list);
    var fullist=''
    for (x in thelist) {
        if (parseInt(thelist[1,x])==thelist[1,x]) {
            fullist=fullist+thelist[1,x]+'-'
        }
    }
    new Ajax.Request('ajax.asp',{method:'post',parameters:{act:'pos',table:table,ids:fullist}});
}

var activate=function(table,id,val1,val2) {
    $('activate'+id).innerHTML='';
    new Ajax.Updater('activate'+id,'ajax.asp',{parameters:{act:'activate',id:id,table:table,val1:val1,val2:val2},insertion:Insertion.Top,evalScripts:true});
}
var del=function(table,id,fid,title,fid2,fid3,fid4,fid5) {
    $('msg').innerHTML='';
    new Ajax.Updater('msg','ajax.asp',{parameters:{act:'del',id:id,table:table,fid:fid,title:title,fid2:fid2,fid3:fid3,fid4:fid4,fid5:fid5},insertion:Insertion.Top,evalScripts:true, queue:{position:'end',scope:'doqueue'}});
}
var kill=function(table,id,fid,fid2,fid3,fid4,fid5) {
    new Ajax.Updater('dname','ajax.asp',{parameters:{act:'kill',id:id,table:table,fid:fid,fid2:fid2,fid3:fid3,fid4:fid4,fid5:fid5},insertion:Insertion.Top,evalScripts:true, queue:{position:'end',scope:'doqueue'}});
}
var datesave=function(table,id,fid,vid,iid,rsc,vtype) {
    $(vid).innerHTML='';
    var val=$(fid).value+' '+$(fid+'_hour').value+':'+$(fid+'_min').value+':00';
    new Ajax.Updater(vid,'ajax.asp',{parameters:{act:'editsave',table:table,id:id,fid:fid,vid:vid,val:val,rsc:rsc,vtype:vtype},insertion:Insertion.Top,evalScripts:true, queue:{position:'end',scope:'doqueue'}});
}
var esave=function(table,id,fid,vid,iid,rsc,vtype) {
    clearTimeout(timeOuts['timedsave_'+fid]); 
    timeOuts['timedsave_'+fid] = setTimeout("dosave('"+table+"','"+id+"','"+fid+"','"+vid+"','"+iid+"','"+rsc+"','"+vtype+"')",500);
}
var dosave=function(table,id,fid,vid,iid,rsc,vtype,opt) {
    opt = typeof opt == "object" ? opt : {};
    var onComplete = opt.onComplete || function(){};
    $(vid).innerHTML='';
    if ($(iid).type=='checkbox') {
        var iname=document.getElementsByName($(iid).name);
        var val=''
        if (iname.length>1) {
            var cb=0;
            val='-';
            iid=$(iid).name
            for (cb=0;cb<iname.length;++cb) {
                if (iname[cb].checked) {
                    val=val+iname[cb].value+'-'
                }
            }
        } 
        else {
            if ($(iid).checked) {
                val=$(iid).value
            } else {
                val=0    
            }
        }
    } 
    else if ($(iid).type=='radio') {
        var iname=document.getElementsByName($(iid).name);
        var val=''
        if (iname.length>1) {
            var cb=0;
            iid=$(iid).name
            for (cb=0;cb<iname.length;++cb) {
                if (iname[cb].checked) {
                    val=iname[cb].value
                }
            }
        } 
        else {
            if ($(iid).checked) {
                val=$(iid).value
            } else {
                val=0    
            }
        }
    } 
    else if ($(iid).type=='select-one') {
        var val=$(iid).options[$(iid).selectedIndex].value;
    } 
    else {
        var val=$(iid).value;
    }
    new Ajax.Updater(vid,'ajax.asp',{
        parameters:{
            act:'editsave',
            table:table,
            id:id,
            fid:fid,
            vid:vid,
            val:val,
            rsc:rsc,
            vtype:vtype
        },
        evalScripts:true,
        queue:{
            position:'end',
            scope:'doqueue'
        },
        onComplete : onComplete
    });
}
var ecursave=function(table,id,fid,vid,iid,rsc,vtype) {
    clearTimeout(timeOuts['timedsave_'+fid]); 
    timeOuts['timedsave_'+fid] = setTimeout("docursave('"+table+"','"+id+"','"+fid+"','"+vid+"','"+iid+"','"+rsc+"','"+vtype+"')",1000);
}
var docursave=function(table,id,fid,vid,iid,rsc,vtype) {
    $(vid).innerHTML='';
    var val=cformat($(fid).value);
    new Ajax.Updater(vid,'ajax.asp',{parameters:{act:'editsave',table:table,id:id,fid:fid,vid:vid,val:val,rsc:rsc,vtype:vtype},insertion:Insertion.Top,evalScripts:true, queue:{position:'end',scope:'doqueue'}});
}
var fsave=function(formid,asppage,iid,vid) {
    $(formid).target=iid;
    $(formid).action=asppage;
    submitform(formid);
    $(vid).innerHTML='<img src="/library/ajax-loader.gif" alt="please wait">'
}
var foldersave=function(table,id,fid,vid,iid,vtype) {
    clearTimeout(timeOuts['timedsave_'+fid]); 
    timeOuts['timedsave_'+fid] = setTimeout("folderesave('"+table+"','"+id+"','"+fid+"','"+vid+"','"+iid+"','"+vtype+"')",1000);
}
var folderesave=function(table,id,fid,vid,iid,vtype) {
    $(vid).innerHTML='';
    var val=$(fid).value;
    new Ajax.Updater(vid,'ajax.asp',{parameters:{act:'foldersave',table:table,id:id,fid:fid,vid:vid,val:val},insertion:Insertion.Top,evalScripts:true, queue:{position:'end',scope:'doqueue'}});
}
////////////////////////////////////////////////////////////////////////////////////////// Interface
var useful=function(act,id) {
    $(fid).innerHTML='';
    new Ajax.Updater('use','ajax.asp',{parameters:{act:act,id:id},insertion:Insertion.Top,evalScripts:true, queue:{position:'end',scope:'doqueue'}});
}
var fadeusebox=function() {
    $('useholder').fade();
    new Effect.Opacity('pageholder',{ duration: 0.5, from: 0.3, to: 1 });    
}
var hidemsg=function() {
    $('msgholder').fade();
    if ($('useholder').style.display=='none') {
        new Effect.Opacity('pageholder',{ duration: 0.5, from: 0.3, to: 1 });    
    }
}
var fadepage=function() {
    $('pageholder').fade({from: 1, to: 0.3 });
}
var fadetmsg=function() {
    $('tmsg').fade({ duration: 2.0, from: 1, to: 0, delay: 4.0 });
}
var toggleme=function(sss) {
    if ( $(sss).style.display != 'none' )    {
        $('msgholder').appear();
    }
    else {
        $('msgholder').fade();
    }
}
var toggleshow=function(sss) {
    Effect.Queues.get("shower").cancel(sss)
    $(sss).appear({queue:{scope:"shower"}});
}
var togglehide=function(sss) {
    Effect.Queues.get("shower").cancel(sss)
    $(sss).fade({queue:{scope:"shower"}});
}
var toggleimg=function(sss,ttt,uuu) {
    if ($(sss).src==ttt) {
        $(sss).src=uuu;
    }
    else {
        $(sss).src=ttt;
    }
}
////////////////////////////////////////////////////////////////////////////////////////// Jump to URL
var jump=function(sss) {
    if (sss != "null") {
        document.location.href = sss;
    }
}
////////////////////////////////////////////////////////////////////////////////////////// Forms
var submitform=function(sss) {
    if (sss!="") {
        $(sss).submit();
    }
}
var clearme=function(sss) {
    if (sss.value == sss.defaultValue) {
        sss.value = "";
    }
}
////////////////////////////////////////////////////////////////////////////////////////// Show/Hide Item
var toggleme=function(sss) {
    if ( $(sss).style.display != 'none' )    {
        togglehide(sss);
    }
    else {
        toggleshow(sss);
    }
    document.body.style.overflow="auto";
}
////////////////////////////////////////////////////////////////////////////////////////// Bookmark Page
var bookmarksite=function(title,url) {
    /* Bookmark site script- © Dynamic Drive DHTML Code library 
    (www.dynamicdrive.com) This notice MUST stay intact for legal use
    Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code*/
    if (window.sidebar) // firefox
    {
        window.sidebar.addPanel(title,url,"");
    }
    else if (window.opera && window.print) // opera
    {
        var elem = document.createElement('a');
        elem.setAttribute('href',url);
        elem.setAttribute('title',title);
        elem.setAttribute('rel','sidebar');
        elem.click();
    } 
    else if(document.all)// ie
    {
        window.external.AddFavorite(url, title);
    }
}
////////////////////////////////////////////////////////////////////////////////////////// Cookies
var setco=function(sss) {
    document.cookie += 'setco='+sss+';'
}
var getcookie=function(sss) {
    var results = document.cookie.match ( '(^|;) ?' + sss + '=([^;]*)(;|$)' );
    if (results) {
        return (unescape(results[2]));
    }
    else {
        return null;
    }
}
////////////////////////////////////////////////////////////////////////////////////////// Currency Formatting
var cformat=function(sss) {
    var i = parseFloat(sss);
    if(isNaN(i)) {
        i = 0.00;
    }
    var minus = '';
    if(i < 0) {
        minus = '-';
    }
    i = Math.abs(i);
    i = parseInt((i + .005) * 100);
    i = i / 100;
    s = new String(i);
    if(s.indexOf('.') < 0) {
        s += '.00';
    }
    if(s.indexOf('.') == (s.length - 2)) {
        s += '0';
    }
    s = minus + s;
    return s;
}
///////////////////////////////////////////// get elements by class
/*
    Developed by Robert Nyman, http://www.robertnyman.com
    Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/    
var getElementsByClassName = function (className, tag, elm){
    if (document.getElementsByClassName) {
        getElementsByClassName = function (className, tag, elm) {
            elm = elm || document;
            var elements = elm.getElementsByClassName(className),
                nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
                returnElements = [],
                current;
            for(var i=0, il=elements.length; i<il; i+=1){
                current = elements[i];
                if(!nodeName || nodeName.test(current.nodeName)) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    else if (document.evaluate) {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = "",
                xhtmlNamespace = "http://www.w3.org/1999/xhtml",
                namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
                returnElements = [],
                elements,
                node;
            for(var j=0, jl=classes.length; j<jl; j+=1){
                classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
            }
            try    {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
            }
            catch (e) {
                elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
            }
            while ((node = elements.iterateNext())) {
                returnElements.push(node);
            }
            return returnElements;
        };
    }
    else {
        getElementsByClassName = function (className, tag, elm) {
            tag = tag || "*";
            elm = elm || document;
            var classes = className.split(" "),
                classesToCheck = [],
                elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
                current,
                returnElements = [],
                match;
            for(var k=0, kl=classes.length; k<kl; k+=1){
                classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
            }
            for(var l=0, ll=elements.length; l<ll; l+=1){
                current = elements[l];
                match = false;
                for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
                    match = classesToCheck[m].test(current.className);
                    if (!match) {
                        break;
                    }
                }
                if (match) {
                    returnElements.push(current);
                }
            }
            return returnElements;
        };
    }
    return getElementsByClassName(className, tag, elm);
}
//
var mdlencheck = function() {
    var mdlen = $("metadesc").value.length;
    var mdcont = $("metadesc").value;
    $("mdlen").innerHTML = mdlen;
    if (mdlen>254)
    {
        var mdconc = mdcont.substr(0,254);
        $("metadesc").value = mdconc;
        $("mtlen").innerHTML = '255';
    }
}
//
var mtlencheck = function() {
    var mtlen = $("mtitle").value.length;
    var mtcont = $("mtitle").value;
    $("mtlen").innerHTML = mtlen;
    if (mtlen>254)
    {
        var mtconc = mtcont.substr(0,254);
        $("mtitle").value = mtconc;
        $("mtlen").innerHTML = '255';
    }
}
//
var keylencheck = function() {
    var keylen = $("keywords").value.length;
    var keycont = $("keywords").value;
    $("keylen").innerHTML = keylen;
    if (keylen>254)
    {
        var keyconc = keycont.substr(0,254);
        $("keywords").value = keyconc;
        $("mtlen").innerHTML = '255';
    }
};
// Adams Queue
// Cancel any effect on the specified element
Effect.ScopedQueue.prototype.cancel = function(el)
{
    if(typeof(el) != 'object'){
        el = $(el);    
    }
    
    this._each(function(qel){
        if(qel.element == el){
            qel.cancel();
        }
    })
}
// Adam function check if element is hidden (or if it's ancestors are hidden)
// These are a bit messy as you must use element.addMethods for element.prototype changes in IE
var isHidden = function(elem){

    // recurse through parentNodes    
    var parentWalk = function(currNode){
        var $node = $(currNode);
        
        if($node.nodeType == 9){ //at top level of node tree            
            return false;
        }else if($node.nodeType == 1){
            if($node.getStyle('display') == "none"){
                return true;
            }else{
                return parentWalk($node.parentNode);
            }
        }
    }
    
    // Call parentWalk on this element
    return parentWalk(elem);
}

// Recursive Function to recurse through parentNodes and match them against a function
// Pass a function that accepts one parameter of the current element in the search.
var findAncestor = function(elem, findFunc){
	var parentWalk = function(currNode){
		var $node = $(currNode);
		
		if($node.nodeType == 9){ // At top level of node tree
			return false;
		}else if($node.nodeType == 1){
			// Does this node match the find function
			if(findFunc($node) == true){
				return $node;
			}else{
				return parentWalk($node.parentNode);
			}
		}
	}
	
	// Start recursion
	return parentWalk(elem);
}

//Element.prototype.isHidden = isHidden;

//Opposite of insertBefore...
var insertAfter = function(elem,node,referenceNode){
    elem.insertBefore(node,referenceNode.nextSibling);
}
//Element.prototype.insertAfter = insertAfter;

// Because IE can't handle Element.prototype modification...
var methods = {
    insertAfter : insertAfter,
    isHidden    : isHidden,
    findAncestor : findAncestor   
}
Element.addMethods(methods);

// Make sure element contains a number. Run on keyup to parse out other characters.
// Set isfloat to true to not parse '.'s
var isnum=function(el,isfloat,nozero) {
    var el = (typeof el != "object") ? $(el) : el;
    
    var val = el.value;
    var thisno = '';
    
    if(val.length > 0){
        for(var i=0; i < val.length; i++){
            if((val.charAt(i) == "." && isfloat == true) || !isNaN(val.charAt(i)))
                thisno += val.charAt(i);
        }
    }else{
        thisno = '0';    
    }
    
    if(isfloat == true){
        //thisno = parseFloat(thisno);
    }else
        thisno = parseInt(thisno,10);

    el.value=thisno;
    if(nozero == true && thisno == 0)
        el.value = '';
    return thisno;
}

// Call this to observe all inputs on a page with the class 'number' and call isnum on all of them.
// If they have class 'float' then will pass float = true to isnum
var numput = function(){
    var isfloat = false;
    var nozero = false;
    // Observe input class = number with isnum 
    $$('input.number').each(function(e){
        if(e.hasClassName('float'))
            isfloat = true;
        if(e.hasClassName('nozero'))
            nozero = false;
        e.observe('keyup',function(evt){isnum(evt.element(),isfloat,nozero)});    
    });
}
    
// Returns most fitting event eg. onChange, onClick for an element.
var getObserveType = function(el){
    var returnType;
    
    // Switch on element type
    switch (el.type){
        case 'select-one':
            returnType = 'change';
            break;
        
        case 'radio': case 'checkbox':
            returnType = 'click';
            break;
        
        default:
            returnType = 'keyup';
            break;
    }
    
    // Special cases
    if( el.hasClassName('color') )
        returnType = 'change';
        
    return returnType;
}

// Saves a form with formception.
var save_form = function(evt,form_id){
    evt.stop();
    // Get the element that was clicked on.
    var el = evt.element();
    
    // Clear any error messages
    $$('.error_hold').each(function(eh){eh.remove();});
    $$('input.error').each(function(ie){ie.removeClassName('error');});
                
    // Handle errors
    var errFlag = 0;
    var make_err = function(el,err){
        var errSpan = new Element('span',{'class':'error'}).update(err);
        var errSpanHold = new Element('span',{'class':'error_hold'}).update(errSpan);
        
        el.parentNode.insertAfter(errSpanHold,el);
        el.addClassName('error');
        
        errFlag=1;
    }
    
    /*Uncomment if we're using CodeMirror for textbox syntax highlighting. You can probably add a CKEditor.Instances.invoke("updateElement") or whatever here too
    if(codeMirrors.length > 0)
        codeMirrors.invoke('save');
    */
	var CKInstances = CKEDITOR.instances
	for( var CKI in CKInstances){
		if(CKInstances.hasOwnProperty(CKI)){
			CKInstances[CKI].updateElement();	
		}
	}
    
    // set form action to ajax.asp
    form_id = 'save_form' || form_id;
    var form = $(form_id);
    form.action = form.action || "ajax.asp";
    
    var inputs = form.getInputs();
    inputs.each(function(inp){
        if(inp.hasClassName("required") && inp.value == '')
            make_err(inp,'This field cannot be empty');
    });
    
    // If there are no immediate issues picked up by js
    if(errFlag == 0 ){
        
        // We need to sort out checkboxes before sending them as otherwise they'll only be sent if they're checked.
        var checked = {}
        var checkBoxes = form.getInputs('checkbox');
        checkBoxes.each(function(cb){
            checked[cb.name] = cb.checked ? 1 : 0;
        });
        
        // Params to pass to ajax
        params = {
            act : 'save_form'    
        };
        
        // Merge params with checked object -> if they're sent as params they take precidence over the actual form items
        params = Object.extend(params,checked);
        
        // Ajax submit form
        form.request({
            parameters: params,
            onComplete:function(res){                
                // If there is no response text then assume success.
                var rText = res.responseText;
                if (!rText || rText === ""){
                    // Goto the links href.
                    window.location.href = el.href;    
                }else{
                    var json =     res.responseText.evalJSON();
                    
                    // Loop through json and create relevant errors
                    for(var js in json){
                        if( json.hasOwnProperty(js)){
                            var jsEl = $(json[js].name);
                            var err = json[js].error;
                            
                            make_err(jsEl,err);
                        }
                    }
                }
            },
            evalScripts : true
        });
    }
}

// Ajax updater for event calendar
var calendarAjax = function(){
	$$('.cal_link[href="calendar"]').each(function(cal_link){
		cal_link.observe('click',function(evt){
			evt.stop();
			var newDate = cal_link.getAttribute('data-date');
			
			new Ajax.Updater('cal_holder','/ajax/calendar.asp',{
				parameters:{
					monthdate : newDate
				},
				evalScripts:true
			});
		});
	});
}

// Parses first occurence of number in string
var parseFirstInt = function(str){
	// Loop through string
	for (var i=0; i<str.length; i++) 
	{ 
		// If this part of the string is a number
		if (!isNaN(str[i]))
			return parseInt(str.substr(i,str.length)); 
	}
	// No number found
	return;	
} 

var parseFirstFloat = function(str){
	// Loop through string
	for (var i=0; i<str.length; i++) 
	{ 
		// If this part of the string is a number
		if (!isNaN(str[i]))
			return parseFloat(str.substr(i,str.length)); 
	}
	// No number found
	return;	
}


