/**
 *  s1Jobs Global Utilities 
 *  
 *  Copyright (c) s1now 2008
 *
 *  Version: $Revision: 1.1 $
 *  Author:  David McLaughlin
 */
 
var s1JS = {}; 
s1JS.Jobs = {}; 

/*    DEAN EDWARDS BASE CLASS MINIFIED   */
var Base=function(){};Base.extend=function(_instance,_static){var extend=Base.prototype.extend;Base._prototyping=true;var proto=new this;extend.call(proto,_instance);delete Base._prototyping;var constructor=proto.constructor;var klass=proto.constructor=function(){if(!Base._prototyping){if(this._constructing||this.constructor==klass){this._constructing=true;constructor.apply(this,arguments);delete this._constructing;}else if(arguments[0]!=null){return(arguments[0].extend||extend).call(arguments[0],proto);}}};klass.ancestor=this;klass.extend=this.extend;klass.forEach=this.forEach;klass.implement=this.implement;klass.prototype=proto;klass.toString=this.toString;klass.valueOf=function(type){return(type=="object")?klass:constructor.valueOf();};extend.call(klass,_static);if(typeof klass.init=="function")klass.init();return klass;};Base.prototype={extend:function(source,value){if(arguments.length>1){var ancestor=this[source];if(ancestor&&(typeof value=="function")&&(!ancestor.valueOf||ancestor.valueOf()!=value.valueOf())&&/\bbase\b/.test(value)){var method=value.valueOf();value=function(){var previous=this.base||Base.prototype.base;this.base=ancestor;var returnValue=method.apply(this,arguments);this.base=previous;return returnValue;};value.valueOf=function(type){return(type=="object")?value:method;};value.toString=Base.toString;}
this[source]=value;}else if(source){var extend=Base.prototype.extend;if(!Base._prototyping&&typeof this!="function"){extend=this.extend||extend;}
var proto={toSource:null};var hidden=["constructor","toString","valueOf"];var i=Base._prototyping?0:1;while(key=hidden[i++]){if(source[key]!=proto[key]){extend.call(this,key,source[key]);}}
for(var key in source){if(!proto[key])extend.call(this,key,source[key]);}}
return this;},base:function(){}};Base=Base.extend({constructor:function(){this.extend(arguments[0]);}},{ancestor:Object,version:"1.1",forEach:function(object,block,context){for(var key in object){if(this.prototype[key]===undefined){block.call(context,object[key],key,object);}}},implement:function(){for(var i=0;i<arguments.length;i++){if(typeof arguments[i]=="function"){arguments[i](this.prototype);}else{this.prototype.extend(arguments[i]);}}
return this;},toString:function(){return String(this.valueOf());}});

/*    PERL TEMPLATES    */
if(typeof s1JS=='undefined'){s1JS={};}s1JS.LexicalAnalyser=function(template){this.template=template;this.tokenreg=new RegExp("<tmpl_([a-zA-Z]+)[\\s]+name=[\"]?([a-zA-Z0-9_]+)[\"]?[\\s]*(?:escape=(url|html))?>|<(\/)tmpl_([a-zA-Z]+)>|<tmpl_(else)>|<tmpl_(unless)>");this.tag_type=1;this.tag_name=2;this.escaped=3;this.closing_tag=4;this.closing_tag_type=5;this.else_tag=6;this.unless_tag=7;this.out=null;this.num_loops=0;this.scope=["this","data"];this.prefixOut();this.analyse();this.suffixOut();};s1JS.LexicalAnalyser.prototype.prefixOut=function(){this.out='var __templateOUT = ""; ';};s1JS.LexicalAnalyser.prototype.suffixOut=function(){this.out+='return __templateOUT; ';};s1JS.LexicalAnalyser.prototype.analyse=function(){var lines=this.tokenize(this.template,/\n/);for(var i=0;i<lines.length;i++){var tokens=this.tokenize(lines[i],this.tokenreg);for(var j=0;j<tokens.length;j++){this.parseToken(tokens[j]);}}};s1JS.LexicalAnalyser.prototype.parseToken=function(token){if(typeof token=='string'){this.out+=' __templateOUT += "'+s1JS.PerlTemplates.clean(token)+'";';}else
{if(token.type=='var'){if(token.escape){if(token.escape=='html'){this.out+=' __templateOUT += escape('+this.getScope()+token.value+');';}else
{this.out+=' __templateOUT += encodeURI('+this.getScope()+token.value+');';}}else
{this.out+=' __templateOUT += '+this.getScope()+token.value+';';}}else if(token.type=='if'){var v=this.getScope()+token.value;this.out+=' if( ('+v+' instanceof Array && '+v+'.length > 0) || (!('+v+' instanceof Array) && '+v+')) { ';}else if(token.type=='unless'){this.out+=' if(!'+this.getScope()+token.value+') { ';}else if(token.type=='else'){this.out+=' } else { ';}else if(token.type=='loop'){this.num_loops++;this.out+=this.createLoop(token);this.scope.push(token.value);}else if(token.close){if(token.close=='loop'){this.num_loops--;this.scope.pop();}this.out+=' } ';}}};s1JS.LexicalAnalyser.prototype.createLoop=function(token){return' for(i'+this.num_loops+' = 0; i'+this.num_loops+' < '+this.getScope()+token.value+'.length; i'+this.num_loops+'++) { ';};s1JS.LexicalAnalyser.prototype.getScope=function(){var final_scope=this.scope.slice(0,2).join('.')+'.';if(this.scope.length>2){var loops=this.scope.slice(2,this.scope.length);for(var i=0;i<loops.length;i++){final_scope+=loops[i]+'[i'+(i+1)+'].';}}return final_scope;};s1JS.LexicalAnalyser.prototype.tokenize=function(item,regex){var result=regex.exec(item);var retArr=new Array();while(result!=null){var start=result.index;if((start)!=0){retArr.push(item.substring(0,start));item=item.slice(start);}if(result[this.tag_type]&&result[this.tag_name]){var escape=result[this.escaped]?result[this.escape]:false;retArr.push({type:result[this.tag_type],value:result[this.tag_name],escape:escape});}else if(result[this.closing_tag]&&result[this.closing_tag_type]){retArr.push({close:result[this.closing_tag_type]});}else if(result[this.else_tag]){retArr.push({type:'else'});}else if(result[this.unless_tag]){retArr.push({type:'unless'});}else
{retArr.push(result[0]);}item=item.slice(result[0].length);result=regex.exec(item);}if(!item==''){retArr.push(item);}return retArr;};s1JS.PerlTemplates=function(options){if(options.template){this.template=this.cleanTemplate(options.template);}else if(options.url){this.template=s1JS.PerlTemplates.doRequest(options.url);}if(!this.template){alert('Something went wrong');}this.target=options.target;this.data=options.data;this.parse();};s1JS.PerlTemplates.prototype.cleanTemplate=function(template){template=template.replace(/\r\n/g,"\n");template=template.replace(/\r/g,"\n");return template;};s1JS.PerlTemplates.clean=function(content){content=content.replace(/\\/g,'\\\\');content=content.replace(/\n/g,'\\n');content=content.replace(/\"/g,'\\"');return content;};s1JS.PerlTemplates.prototype.parse=function(){var lex=new s1JS.LexicalAnalyser(this.template);var raw_process_function=' this.process = function() { var data = this.data; '+lex.out+' }; ';eval(raw_process_function);};s1JS.PerlTemplates.prototype.getContent=function(data){if(data){this.data=data;}return this.process();};s1JS.PerlTemplates.prototype.render=function(data){if(data){this.data=data;}if(this.target){document.getElementById(this.target).innerHTML=this.process();}};s1JS.PerlTemplates.Request=function(){var factories=[function(){return new ActiveXObject("Msxml2.XMLHTTP");},function(){return new XMLHttpRequest();},function(){return new ActiveXObject("Microsoft.XMLHTTP");}];for(var i=0;i<factories.length;i++){try{var request=factories[i]();if(request!=null)return request;}catch(e){continue;}}};s1JS.PerlTemplates.doRequest=function(template){template+="?t=new Date().getTime()"; var request=new s1JS.PerlTemplates.Request();request.open("GET",template,false);try{request.send(null);}catch(e){return null;}if(request.status==404||request.status==2||(request.status==0&&request.responseText==''))return null;return request.responseText;};

/*
 *  Core functionality, used on almost every page
 */

;(function(s1) {        
   
    /*
     *  Extend the native Array object to test whether
     *  a value exists in an array
     *
     *  @returns boolean
     */
    Array.prototype.exists = function(needle) 
    {      
        for(var i = 0; i < this.length; i++)
        {        
            if(this[i] == needle)
                return true;        
        }        
        return false; 
    };  
    
    Array.prototype.isIn = function(target)
    {    
 
        for(var i = 0; i < this.length; i++)    
        {
           var reg = new RegExp('\\b' + this[i] + '\\b');  
                   
           if(target.match(reg))
           {
               return true;
           }
        }
        return false;
    };
    
    s1.commas = function(str)
    {
        var new_str = str.replace(/(\d)(\d\d\d)((,\d\d\d)*)$/g,"$1,$2$3");
        if ( new_str == str ) { return new_str }
        return this.commas( new_str );       
    };

    /*
     *  Merge two objects together, the first taking preference for any properties it has defined
     */
    s1.merge = function(opts, defs)
    {
        for(var prop in opts)
        {
           defs[prop] = opts[prop];
        } 
        return defs;
    };
    
    s1.createPageSelect = function(opts)
    {    
        var max_page = parseInt(opts.count/opts.number_per_page) + ( ( opts.count % opts.number_per_page == 0 ) ? 0 : 1 );
        var select = document.createElement('SELECT');
        for(var i = 1; i <=  max_page; i++)
        {   
            var range = s1.createPageData.makeRangeString(i, opts.number_per_page, opts.count);
            var selected = (opts.page == i) ? true : false;
            var link = 'http://' + document.location.host + opts.script + '?' + opts.query_string + '&page=' + i;    
            
            $(select).append('<option value="'+ i + '">' + range + '</option>');           
        }
        return select;        
    };
    
    
    /*
     *  Create Page Data (for page dropdowns)
     */ 
    s1.createPageData = function(opts)
    {             
        var max_page = parseInt(opts.count/opts.number_per_page) + ( ( opts.count % opts.number_per_page == 0 ) ? 0 : 1 );
        var content = [];
        for(var i = 1; i <=  max_page; i++)
        {   
            var range = s1.createPageData.makeRangeString(i, opts.number_per_page, opts.count);
            var selected = (opts.page == i) ? true : false;
            var link = 'http://' + document.location.host + opts.script + '?' + opts.query_string + '&page=' + i;    
            
            content[content.length] = {link: link, selected: selected, text: range, val:(opts.dovals) ? i : false};
        }
        return content;
    };
    
    /*
     *  Creates a string of the first to last numbers based on the page size
     */
    s1.createPageData.makeRangeString = function(page, page_size, max)
    {
        var start = ( ( page - 1 ) * page_size ) + 1;
        var end = page_size * page > max?max:page_size * page;
    
        if ( start != end )
        {
            return s1.commas(String(start)) + '-' + s1.commas(String(end));
        }
        else
        {
            return s1.commas(String(start));
        }        
    };
    
    /*
     *  Check if a value is an array
     */
    s1.isArray = function(val)
    {
        return (val instanceof Array);
    };
    
    /*
     *  Make an object based on the current GET query or a passed in query string
     *  the final format is similar to the Perl CGI request object where multiple params
     *  with the same name become an array
     */
    s1.createObjFromQuery = function(query_string)
    {
        var args = new Object();
        var query = (query_string) ? query_string : document.location.search.substring(1);
        
        var pairs;
       
        pairs = query.split("&");
       
        for(var i = 0; i < pairs.length; i++) 
        {
            var pos = pairs[i].indexOf('=');
            if (pos != -1) 
            {
                var argname = pairs[i].substring(0,pos);
                var value = pairs[i].substring(pos+1);
                
                // already exists, multiple params set
                if(args[argname])
                {
                    if(s1.isArray(args[argname]))
                    {
                        args[argname].push(unescape(value));
                    }
                    else 
                    {                       
                        args[argname] = new Array(args[argname],unescape(value));
                    }
                }
                else 
                {
                    args[argname] = unescape(value);
                }
            }
        }
        return args;    
    };
    
    /*
     *  Take a query object (@see createObjFromQuery) and parses it into a query string, optionally removing
     *  any params in the remove array
     */
    s1.createQueryFromObj = function(obj, remove)
    {    
        var query = [];    
        for(var prop in obj)
        {           
            if(!remove[prop]) 
            {                
                if(s1.isArray(obj[prop]))  
                {                    
                    for(var i =0; i < obj[prop].length; i++)                    
                    {
                       query[query.length] = prop + '=' + obj[prop][i];    
                    }
                }
                else
                {
                    query[query.length] = prop + '=' + obj[prop];
                }
            }
        }
            
        return query.join('&');
    };
    
    s1.loggedIn = function()
    {
        if(s1.Cookies.readCookie('mys1_eid'))
        {
            return true;
        }
        return false;
    };
    
    /*
     *    Cookies
     */
    s1.Cookies = 
    {
        readCookie:function(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;
        }
    };
    
    /*
     *   PAGE LOADERS
     *
     *   Our ad system allows clients to do serial document.writes into our page
     *   which delays the DOMReady trigger in every major JS library. If the ad system
     *   is slow, then all our events slow too. 
     *
     *   The only way to get round this is to explicitly fire all our page events before we 
     *   start rendering the ads.
     *
     *   Usage: s1JS.Jobs.addLoader(pageLoadFunction);   
     */
    
    s1.loaders = [];
    s1.addLoader = function(func)
    {
        this.loaders[this.loaders.length] = func;
    };
    s1.fireLoaders = function()
    {
        for(var i = 0; i < this.loaders.length; i++)
        {	    
            if(this.loaders[i] && typeof this.loaders[i] == 'function')
            {
                this.loaders[i]();
            }
        }
    };
    
    /*
     *
     *    FAST ADS
     *
     */
    s1.fastAds = 
    {
        /*
         *  Mapper for our ad positions to the OAS ad codes
         */
        _adPositions:
        {
            banner: 'Top',
            homepages1learning: 'x02',           
            leaderboard: 'x05',
            mpu: 'x01',
            overLay: 'x03',
            skyscraper: 'Right',
            crm: 'x06'
        }, 
        
        /*
         *  Move the rendered ads to their target
         */ 
        doAds:function()
        {            
            for(var prop in s1.fastAds._adPositions)
            {
                if(document.getElementById(prop + '-target') && document.getElementById(prop + '-loader'))
                {               
                    document.getElementById(prop + '-target').appendChild(document.getElementById(prop + '-loader'));
                }
            }        
        },
        
        hideAds:function()
        {
            for(var prop in s1.fastAds._adPositions)
            {
                if(document.getElementById(prop + '-target'))
                {
                    document.getElementById(prop + '-target').style.visibility = 'hidden';                    
                }
            }
            // AND SELECTS -> IE6.0 select bug
            if($.browser.msie && parseInt($.browser.version) == 6)
            {            
                $('select').css('visibility', 'hidden');
            }
        },
        
        showAds:function()
        {
            for(var prop in s1.fastAds._adPositions)
            {
                if(document.getElementById(prop + '-target'))
                {
                    document.getElementById(prop + '-target').style.visibility = 'visible';
                }
            } 
            // AND SELECTS -> IE6.0 select bug
            if($.browser.msie && parseInt($.browser.version) == 6)
            {            
                $('select').css('visibility', 'visible');
            }
        },
    
        /*
         *  Generate the ad page URL for OAS requests
         */
        adPageURL:function()
        {
            if (document.location.pathname == "/") 
            {
                return "homepage";
            } 
            else if (window.page_data && page_data.core_skill) 
            {
                return page_data.core_skill;
            } 
            else if (document.location.pathname.match(/\/recruiters\//)) 
            {
                return "recruiters";
            } 
            else if (document.location.pathname.match(/\/jobsmanager\//) ||
                     document.location.pathname.match(/\/cvdb\//) ||
                     document.location.pathname.match(/\/applicantmanager\//)) 
            {
                return "jobsmanager";        
            }
                   
            return 'run_of_site';        
        },        
        
    
        /*
         *  Generates the "listpos" OAS value based on loaded ad divs
         */
        getListPos:function()
        {
            var tmp = [];  
            for(var prop in s1.fastAds._adPositions)
            {
                if(document.getElementById(prop + '-target'))
                {
                    tmp[tmp.length] = s1.fastAds._adPositions[prop];           
                }
            }
            return tmp.join(',');
        },         
    
        /*
         *  Renders an ad only if they target div has been loaded
         */
        renderAd:function(position)
        {
            if(!document.getElementById(position + '-target'))
            {
                return false;
            }
            
            var oas_value = s1.fastAds._adPositions[position];   
            OAS_AD(oas_value);
        },
    
        /*
         *  Hide skyscraper if the user is on 1024 (or less)
         */
        revealSkyscraper:function()
        {
            if(!document.getElementById('skyscraper-target'))
            {            
                return false;
            }
                    
            if(document.body.offsetWidth > 1256)
            {           
                document.getElementById('skyscraper-target').style.display = "";    
            }
            else
            {
                document.getElementById('skyscraper-target').style.display = "none";                       
            }            
        }
    };
    
    /* skyscraper show/hide code */
    if(window.addEventListener)
    {
        window.addEventListener("resize", s1.fastAds.revealSkyscraper, false);
    }
    else if(window.attachEvent)
    {
        window.attachEvent("onresize", s1.fastAds.revealSkyscraper);
    }       

    $(function() { s1.fastAds.revealSkyscraper() });

     
})(s1JS.Jobs);


/*
 *   jQuery dependent functionality
 */
 
;(function($,s1) {        
   
    /*
     *  Nice forms applies loving focus/blur event handlers  
     *  to the user 
     */    
    s1.niceForms = 
    {
        /*
         *   Applies the niceForms functionality to a form
         * 
         *   @param $form    a jQuery object containing the target form
         */
        apply:function($form)
        {
            if(!$form) { $form = $(body); } // default is everything
        
            $(':input', $form).focus(function(e) {  
                $(this).parent().parent().addClass('focused');
            });
            
            $(':input', $form).blur(function(e) {  
                $(this).parent().parent().removeClass('focused');
            });            
        }   
    };

    /*
     *  Create sign in
     *
     */
    s1.createSignInForm = function(options) 
    {
        if(typeof jQuery == 'undefined') 
        { 
            return false; 
        }

        var return_to = (options && options.return_to) ? options.return_to : document.location.pathname;
        var myTemplate = new s1JS.PerlTemplates({url:'/ssi/jquery-sign-in-form.html', data:{return_to:return_to}});           
        $('#content').append(myTemplate.getContent());
        s1JS.Jobs.niceForms.apply($('#login-box'));        

        
        $('#sign-in-modal').show().dialog({
              autoOpen: false,
              draggable: false,
              modal: true,
              resizable: false,
              width: 430,
              title: "Sign in form...", 
              overlay: { opacity: 0.5, background: 'black' },
	          open: s1.fastAds.hideAds,
              close: s1.fastAds.showAds
        });                
	

        $('.sign-in-link')
            .click(function() {
               var $sign_in = $('#sign-in-modal');
               $sign_in.dialog("open"); 
               $('#email-address', $sign_in).focus();               
               return false;
        });

    };
    
    s1.authenticationLink = function()
    {
        if(document.getElementById('authentication'))
        {
            if(s1.Cookies.readCookie('mys1_eid'))
            {
                $('#authentication').html('<a href="/myaccount/sign-out/">Sign Out</a>');
            }
            else
            {
                // create sign in link.. $('#authentication'). 
                $('#authentication').html('<a href="/myaccount/sign-in/" class="sign-in-link">Sign In</a>');
                s1.createSignInForm();      
            }
        }        
    };
     
    s1.featuredEmployers = function(num_logos, level1_tag_name)
    {
        if(document.getElementById('recruiter-logos'))
        {            
            var items = $('#recruiter-logos '+level1_tag_name);
            var i = items.length;
            if ( i == 0 ) return false;
            
            s1.fe_buffer_size = 0;
            
            // fisher-yates
            while ( --i )
            {
                var j = Math.floor( Math.random() * ( i + 1 ) );
                var tempi = items[i];
                var tempj = items[j];
                items[i] = tempj;
                items[j] = tempi;
            }
            
            for(var i=0; i<items.length; i++)
            {
                $('#recruiter-logos').append(items[i]);
                if (i >= num_logos)
                {
                    items[i].style.display = "none";
                    s1.fe_buffer_size++;
                } 
            }
            
            var move = function ()
            {
                var items = $('#recruiter-logos '+level1_tag_name);
                for(var i=0; i<items.length; i++)
                {
                    if (i < s1.fe_buffer_size)
                    {
                        $('#recruiter-logos').append(items[i]);
                        items[i].style.display = "none";
                    }
                    else
                    {
                        items[i].style.display = "block";
                    }
                }
                $('#recruiter-logos').fadeIn();
            };
            
            var transition = function ()
            {                
                $('#recruiter-logos').fadeOut(500, move)
                window.setTimeout(transition,4000);
            };
            
            if (s1.fe_buffer_size > 0) window.setTimeout(transition,3000);
        }        
    };   
    
    $(function() { 
        s1JS.Jobs.authenticationLink();
    });
    

    if(document.location.pathname.match(/\/myaccount\//))
    {
        s1JS.Jobs.addLoader(function() {        
            $('#link-cv-docs').attr('href', '/myaccount/#cv');
            $('#link-job-alerts').attr('href', '/myaccount/#ja');            
            $('#link-stored-jobs').attr('href', '/myaccount/#am');            
            $('#link-jobs-applied').attr('href', '/myaccount/#am');            
        });
    }
    
 })(jQuery, s1JS.Jobs);



