// -------------------------------------------------------------------
// Madgex Limited
// Copyright (c) 2006-2007 Madgex Limited. All Rights Reserved.
// JobAdvertWidget, version 1.1
// Glenn Jones
// 18 June 2007
// -------------------------------------------------------------------

var baseCSSLoaded = false;


function JobAdvertWidget( objectName )
{
	var me;
	var data;
	
    if (this.constructor == JobAdvertWidget){
        me = this;
    }else{
        me = arguments[arguments.length-1];
    } 
    
    // Public properties
    me.dataUrl = '';				// The Json data url
    me.insertIntoId = '';			// String id of dom node to insert widget into
	me.insertAfterId = '';			// String id of dom node to insert widget after
	me.title = '';					// The widget title;
	me.jobNumber = 3;				// Number of jobs [0-20];
	me.truncateDescription = 250;	// The number of charters display in the description
	me.displayTitle = true;			// Display the title
	me.displaySearch = true;		// Display the search feature
	me.cssUrl = '';					// CSS Url
	me.breakChar = '-';				// The break char
	me.searchInputWidth = '13em'    // The width property of the search input box
	
	// Internal properties
	me.objectName = objectName;
	me.insertNode;
	me.afterNode;
	me.containingNode;
	me.siteUrl = '';
	me.baseCSSUrl = '';
	me.detailUrl = '';
	me.SearchUrl = '';
	me.keywordField = "keywords";
	me.formVerb = "get";  
    me.listeners = [];
    
    
	
	me.config = function( jsonData ){
	    me.setURls();
	    if( me.cssUrl != '' ){
	        me.addCSS( me.cssUrl );
	    }
	    else if ( baseCSSLoaded == false ){
	        me.addCSS( me.baseCSSUrl );
	        baseCSSLoaded = true;
	    }      
	
		if( document.getElementById ) {
			if(! document.location.href.indexOf("file:///") > -1 ) {
			    me.addScript(me.dataUrl + (me.dataUrl.indexOf('?') > -1 ? '&' : '?') + 'callback=' + objectName + '.loadJobData' + '&WidgetDomain=' + location.hostname);
			}
		}
	}
	
	me.loadJobData = function( jsonData )
	{
		data = jsonData.JobAdverts;
		me.siteUrl = data.SiteURL + '/';
		me.setURls();
		me.build();
	}
	
	me.setURls = function(){
    	me.baseCSSUrl = me.siteUrl + 'jobadvertwidget.css';
		me.detailUrl = me.siteUrl + 'job/';
		me.SearchUrl = me.siteUrl + 'searchjobs/';
    }

    me.build = function() {
        if (me.insertAfterId != '' || me.insertIntoId != '') {

            me.containingNode = document.createElement('div');
            me.containingNode.setAttribute('id', me.objectName);
            me.containingNode.className = 'jobAdvertWidget';

            if (me.displayTitle)
                me.buildTitle();
            if (me.displaySearch)
                me.containingNode.appendChild(me.buildForm());
            if (me.jobNumber > data.Jobs.length)
                me.jobNumber = data.Jobs.length;
            for (var i = 0; i < me.jobNumber; i++) {
                me.buildJobItem(data.Jobs[i]);
            }
            me.buildFooterLinks();


            if (me.insertAfterId != '') {
                me.afterNode = document.getElementById(me.insertAfterId);
                me.insertAfter(me.afterNode.parentNode, me.containingNode, me.afterNode);
            } else if (me.insertIntoId != '') {
                me.insertNode = document.getElementById(me.insertIntoId);
                me.insertNode.appendChild(me.containingNode);
            } else {
                document.write(me.containingNode.innerHtml);
            }
        }

    }
	
	me.buildTitle = function() {
		
		if( me.title != '' )
		{
			var h3 = document.createElement( 'h3' );
			h3.appendChild( document.createTextNode( me.title ) );
			me.containingNode.appendChild( h3 );
		}
	}
	
	me.buildForm = function() {
	
		var form = document.createElement( 'form' );
		var fieldset = document.createElement( 'fieldset' );
		form.setAttribute('action', me.SearchUrl );
		form.setAttribute('method', me.formVerb );
		
		var textInput = document.createElement( 'input' );
		textInput.setAttribute('id', 'keyword' );
		textInput.setAttribute('name', 'keyword' );
		textInput.setAttribute('type', 'text' );
		textInput.setAttribute('name', me.keywordField );
		textInput.setAttribute('width', me.searchInputWidth );
		fieldset.appendChild( textInput );
		
		var hiddenInput = document.createElement( 'input' );
		hiddenInput.setAttribute('type', 'hidden' );
		hiddenInput.setAttribute('name', 'widget' );
		hiddenInput.setAttribute('value', 'true' );
		fieldset.appendChild( hiddenInput );
		
		var submit = document.createElement( 'input' );
		submit.setAttribute('id', 'Search' );
		submit.setAttribute('type', 'submit' );
		submit.setAttribute('value', 'go' );
		submit.setAttribute('name', 'Search' );
		fieldset.appendChild( submit );
		
		form.appendChild( fieldset );
		
		return form;
	}
	
	
	me.buildJobItem = function( Job )
	{
		var a = document.createElement( 'a' );
		a.setAttribute('href', Job.DetailsUrl);
		a.setAttribute('target', '_blank' );
		a.appendChild( document.createTextNode( Job.Title ) );
		me.containingNode.appendChild( a );
		
		var description 
		if( Job.Description.length > me.truncateDescription )
			description = Job.Description.substr( 0,50 ) + '...';
		else
			description = Job.Description;
			
		var ul = document.createElement( 'ul' );
		ul.appendChild(me.buildLI(description + ' ' + me.breakChar, 'madgexJobsWidgetJobDesc'));
		ul.appendChild(me.buildLI(Job.SalaryDescription + ' ' + me.breakChar));
		ul.appendChild(me.buildLI(Job.Location));
		me.containingNode.appendChild( ul );
		
	}

	me.buildLI = function(text, theclass) {
	    var li = document.createElement('li');
	    li.appendChild(document.createTextNode(text));
	    if (typeof(theclass) != 'undefined' && theclass != '') {
	        li.className = theclass;
	    }
	    return li
	}
	
	me.buildFooterLinks = function() {
	
	}
	
	me.addScript = function( url ) {
		newScript = document.createElement("script");
		newScript.setAttribute('id','tackerloadimg');
		newScript.setAttribute("type", "text/javascript");
		if( url.indexOf('?') > -1)
			url += '&';
		else
			url += '?';	
		url += 'rand=' + Math.random()
		newScript.setAttribute("src", url);
		document.getElementsByTagName('head')[0].appendChild(newScript);
		return newScript;
	}
	
	me.addCSS = function( url ) {
	    var newCSS = document.createElement("link");
	    newCSS.setAttribute('rel', "stylesheet");
	    newCSS.setAttribute('media', "all");
		newCSS.setAttribute('type',"text/css");
		if( url.indexOf('?') > -1)
			url += '&';
		else
			url += '?';
url += 'rand=' + Math.random()

        //james suggestion newCSS.setAttribute('href', '/JBV2Web/widget/' + url);
	
		newCSS.setAttribute('href', url );
		document.getElementsByTagName('head')[0].appendChild(newCSS);
	}

	me.addEvent = function( elm, evType, fn, useCapture ) {
		// Updated version which captures passed events 
		if (elm.AddEventListener) 
		{ 
			elm.AddEventListener(evType, fn, useCapture); 
			return true; 
		} else if (elm.attachEvent) { 
			var r = elm.attachEvent('on' + evType, fn);
			me.listeners[me.listeners.length] = [ elm, evType, fn ];
			return r; 
		} else {
			var xEventFn = elm['on' + evType];
			if (typeof elm['on' + evType] != 'function') 
			{
				elm['on' + evType] = fn;
			} else {
				elm['on' + evType] = function(e) { xEventFn(e); fn(e); };
			}
		}
	}
	
	me.insertAfter = function(parent, node, referenceNode) {
		parent.insertBefore(node, referenceNode.nextSibling);
	}	
	
	me.addEvent( window, 'load', me.config, false )
}

// An Inherited version 2
// ---------------------------------------------------------------------
function JobAdvertWidget2( objectName )
{
	var me;
    if (this.constructor == JobAdvertWidget2){
        me = this;
    }else{
        me = arguments[arguments.length-1];
    } 
    JobAdvertWidget( objectName, me );
    me.breakChar = '|';	
    
    // Override
 	me.buildFooterLinks = function()
	{
        var p = document.createElement( 'p' );
		var a = document.createElement( 'a' );
		a.setAttribute('href', me.siteUrl + 'jobs/' );
		a.setAttribute('target', '_blank' );
		a.appendChild( document.createTextNode( 'Browse' ) );
		p.appendChild( a );
		me.containingNode.appendChild( p );
	}
  
    // Override
 	me.buildJobItem = function( Job )
	{
		var a = document.createElement( 'a' );

		a.setAttribute('href', Job.DetailsUrl);
		a.setAttribute('target', '_blank' );
		a.appendChild( document.createTextNode( Job.Title ) );
		me.containingNode.appendChild( a );
			
		var ul = document.createElement( 'ul' );	
		ul.appendChild( me.buildLI( Job.SalaryDescription + ' ' + me.breakChar  ) );
		ul.appendChild( me.buildLI( Job.Location ) );
		me.containingNode.appendChild( ul );
		
	}
}
Inherit(JobAdvertWidget, JobAdvertWidget2)



// An Inherited version 3
// ---------------------------------------------------------------------
function JobAdvertWidget3( objectName )
{
	var me;
    if (this.constructor == JobAdvertWidget3){
        me = this;
    }else{
        me = arguments[arguments.length-1];
    } 
    
    JobAdvertWidget2( objectName, me );

    
    // Override
 	me.buildFooterLinks = function()
	{
		var p = document.createElement( 'p' );
		
		var a1 = document.createElement( 'a' );
		a1.setAttribute('href', me.siteUrl + 'profile/' );
		a1.appendChild( document.createTextNode( 'Upload your CV' ) );
		p.appendChild( a1 );
		
		p.appendChild( document.createTextNode( ' and ' ) );
		
		var a2 = document.createElement( 'a' );
		a2.setAttribute('href', me.siteUrl + 'alerts/' );
		a.setAttribute('target', '_blank' );
		a2.appendChild( document.createTextNode( 'get jobs by email' ) );
		p.appendChild( a2 );
		
		p.appendChild( document.createTextNode( '.' ) );
		me.containingNode.appendChild( p );
	}
}

Inherit(JobAdvertWidget2, JobAdvertWidget3)

function MadgexJobWidget(objectName) {
    var me;
    if (this.constructor == MadgexJobWidget) {
        me = this;
    } else {
        me = arguments[arguments.length - 1];
    }

    JobAdvertWidget(objectName, me);

    me.config = function(jsonData) {
        me.setURls();
        if (me.cssUrl != '') {
            me.addCSS(me.cssUrl);
        }
        else if (baseCSSLoaded == false) {
            me.addCSS(me.baseCSSUrl);
            baseCSSLoaded = true;
        }

        if (document.getElementById) {
            if (!document.location.href.indexOf("file:///") > -1) {
                me.addScript(me.dataUrl + (me.dataUrl.indexOf('?') > -1 ? '&' : '?') + 'callback=' + objectName + '.loadJobData');
            }
        }
    }

    me.loadJobData = function(jsonData) {
        data = jsonData.JobAdverts;
        me.siteUrl = data.SiteURL + '/';
        me.setURls();
        me.build();
    }

    me.setURls = function() {
        me.baseCSSUrl = me.siteUrl + 'jobadvertwidget.css';
        me.detailUrl = me.siteUrl + 'job/';
        me.SearchUrl = me.siteUrl + 'searchjobs/';
    }

    me.build = function() {
        me.containingNode = document.createElement('div');
        me.containingNode.className = me.objectName;

        if (me.displayTitle)
            me.buildTitle();
        if (me.displaySearch)
            me.containingNode.appendChild(me.buildForm());
        if (me.jobNumber > data.Jobs.length)
            me.jobNumber = data.Jobs.length;
        for (var i = 0; i < me.jobNumber; i++) {
            me.buildJobItem(data.Jobs[i]);
        }
        me.buildFooterLinks();

        var inserted = false;

        if (me.insertAfterId != '') {
            me.afterNode = document.getElementById(me.insertAfterId);
            if (me.afterNode != null) {
                me.insertAfter(me.afterNode.parentNode, me.containingNode, me.afterNode);
                inserted = true;
            }
        } else if (me.insertIntoId != '') {
            me.insertNode = document.getElementById(me.insertIntoId);
            if (me.insertNode != null) {
                me.insertNode.appendChild(me.containingNode);
                inserted = true;
            }
        }

        if (!inserted) {
            var scr = document.getElementById('MadgexJobWidgetScript');
            scr.parentNode.insertBefore(me.containingNode, scr);
        }        
    }

    me.buildTitle = function() {

        if (me.title != '') {
            var titleDiv = document.createElement('div');
            titleDiv.className = 'madgexJobsWidgetTitle';

            var a = document.createElement('a');
            a.setAttribute('href', me.siteUrl);

            var img = document.createElement('img');
            img.setAttribute('src', me.siteUrl + 'images/logo-jobsSm.gif');
            img.setAttribute('alt', me.displayTitle);

            a.appendChild(img);
            
            titleDiv.appendChild(a);
            me.containingNode.appendChild(titleDiv);
        }
    }
  
    // Override
    me.buildJobItem = function(Job) {
        var ul = document.createElement('ul');

        var li = document.createElement('li');
        var a = document.createElement('a');

        //Title + link
        a.setAttribute('href', Job.DetailsUrl);
        a.setAttribute('target', '_blank' );
        a.appendChild(document.createTextNode(Job.Title));
        me.containingNode.appendChild(a);
        li.appendChild(a);
        ul.appendChild(li);

        //Salary
        if (Job.SalaryDescription != "")        
            ul.appendChild(me.buildLI("Salary: " + Job.SalaryDescription));

        //Location
        if(Job.Location != "")
            ul.appendChild(me.buildLI("Location: " + Job.Location));

        //Description
        var description
        if (Job.Description.length > me.truncateDescription)
            description = Job.Description.substr(0, me.truncateDescription) + '...';
        else
            description = Job.Description;
        ul.appendChild(me.buildLI(description, 'madgexJobsWidgetJobDesc'));
        
                
        me.containingNode.appendChild(ul);
    }
}

Inherit(JobAdvertWidget, MadgexJobWidget)

function Inherit( base, derived ){
	for ( var i in base.prototype ){
		eval( 'derived.prototype.' + i + '= base.prototype.' + i )
	}
}
