/* -----Global items--------------------------------------------------------------------------------------------------------------------------------------------*/ 

var settings = {
	'viewFilters':false,    // view filters when open
	'positionWidthMin':180, // position width when filters open
	'positionWidthMax':230, // position width when filters close
	'onSiteLocationMin':100, // Location width when filters open
	'onSiteLocationMax':120, // Location width when filters close
	'gridWidthMin':618,     // grid width when filters open
	'gridWidthMax':740,      // grid width when filters close
	'recordSearchTermTimeout':2000 // Timeout on keyup to record search term in miliseconds.
};

var columns = [
		//{id:'reqID', header:'reqID', width:60, sortable: true,  dataIndex: 'reqID', hidden:true}, 
        {id:'positionTitle', header:'position', width:(settings['viewFilters']?settings['positionWidthMin']:settings['positionWidthMax']), sortable: true,  dataIndex: 'positionTitle', css: 'white-space:normal;'}, 
        {id:'maxRate', header:'salary', width:100, sortable: true,  dataIndex: 'maxRate'}, 
        {id:'maxRate2', header:'salary', width:60, sortable: true,  dataIndex: 'maxRate2', hidden:true, hideable:false}, 
        {id:'onSiteLocation', header:'location', width:(settings['viewFilters']?settings['onSiteLocationMin']:settings['onSiteLocationMax']), sortable: true,  dataIndex: 'onSiteLocation'},
        {id:'onSiteLocationRadius', header:'location', width:60, sortable: true,  dataIndex: 'onSiteLocationRadius', hidden:true, hideable:false}, 
        {id:'addedON', header:'active since', width:120, sortable: true,  dataIndex: 'addedON'},
        {id:'contractLength', header:'duration', width:90, sortable: true,  dataIndex: 'contractLength'},
        {id:'referralFee', header:'referral fee', width:77, sortable: true,  dataIndex: 'referralFee', hidden:true, hideable:false},
        {id:'priority', header:'Hotness', width:80, sortable: true,  dataIndex: 'priority'},
        {id:'contractOrFT', header:'contract or Full Time', width:72, sortable: true,  dataIndex: 'contractOrFT', hidden:true},
        {id:'industry', header:'Industry', width:80, sortable: true,  dataIndex: 'industry', hidden:false, hideable:true},
        {id:'views', header:'Popularity', width:70, sortable: true,  dataIndex: 'views', hidden:true}
];

var dataStore = null;
var dataFilters = null;

/* ------------------------------------------------------------------------------------------------------------------------------------------------------------*/


// getElementById
function getById(id)
{
	return document.getElementById(id);
}

function trim(string) {
   var re = /^\s+|\s+$/g;
   return string.replace(re, "");
}

Ext.onReady(function(){
	
	

// active since filter calendar
var activeSince = new Ext.DatePicker({
		startDay: 1, 
		listeners:{
			'select':function (activeSince,date){getById('active-since').value=date.format('m/d/Y');activeSince.hide();setFilter('active-since');}
		}
});
activeSince.render('active-since-calendar');
activeSince.hide();
//Ext.EventManager.on('active-since', 'click',  function(e) {if (isDate(getById('active-since').value))activeSince.setValue(new Date(getById('active-since').value));activeSince.show();if (!e) var e = window.event;e.cancelBubble = true;if (e.stopPropagation) e.stopPropagation();});
Ext.EventManager.on('active-since-img', 'click',  function(e) {activeSince.show();if (!e) var e = window.event;e.cancelBubble = true;if (e.stopPropagation) e.stopPropagation();});
Ext.EventManager.on('body', 'click',  function() {activeSince.hide();});

Ext.state.Manager.setProvider(new Ext.state.CookieProvider());
		
var ds = new Ext.data.Store({
	proxy: new Ext.data.HttpProxy({
		url:'grid.php'
	}),
	reader: new Ext.data.JsonReader({
		totalProperty: 'data.total',
		root: 'data.results'
	}, Ext.data.Record.create([
		{name: 'positionTitle'},
		{name: 'maxRate'},
		{name: 'maxRate2'},
		{name: 'onSiteLocation'},
		{name: 'addedON'},
		{name: 'contractLength'},
		{name: 'referralFee'},
		{name: 'priority'},
		{name: 'contractOrFT'},
		{name: 'industry'},
		{name: 'views'}])),
	sortInfo: {field: 'addedON', direction: 'DESC'},
	remoteSort: true
});
		
var filters = new Ext.ux.grid.GridFilters({filters:[
		{type: 'numeric', dataIndex: 'maxRate'},
		{type: 'numeric', dataIndex: 'maxRate2'},
		{type: 'string',  dataIndex: 'onSiteLocation'},
		{type: 'numeric',  dataIndex: 'onSiteLocationRadius'},
		{type: 'date',  dataIndex: 'addedON'},
		{type: 'list',  dataIndex: 'contractLength', options: ['Full Time', '3-6 months', '6-12 months', '12+ months'], phpMode: true},
		{type: 'string',  dataIndex: 'contractOrFT'},
		{type: 'string',  dataIndex: 'industry'},
		{type: 'numeric',  dataIndex: 'views'},
		{type: 'list', dataIndex: 'priority', options: ['burning', 'hot', 'normal'], phpMode: true}
]});
//console.log(filters)
filters.addFilter({type:'date', dataIndex:'addedON'}); // , value:{'after':new Date('<?php echo date('m/d/Y', time() - (30 * 24 * 60 * 60));?>')}

var cm = new Ext.grid.ColumnModel(columns);
cm.defaultSortable = true;

// paging bar
var paging = new Ext.PagingToolbar({
	  pageSize: 20,
	  store: ds,
	  displayInfo: true,
	  displayMsg: '{2} live jobs | {0}-{1} displayed ',
	  emptyMsg: "No jobs to display",
	  prependButtons: true
});
// paging 2
var paging2 = new Ext.PagingToolbar({
	  pageSize: 20,
	  store: ds,
	  displayInfo: true,
	  displayMsg: '{2} live jobs | {0}-{1} displayed ',
	  emptyMsg: "No jobs to display",
	  prependButtons: true
});

 var grid = new Ext.grid.GridPanel({
 	id: 'jobs',
 	el: 'searchResultsGrid',
	ds: ds,
    store: ds,
    cm: cm,
	plugins: filters,
   // height:'auto',
    height:790,
    width:(settings['viewFilters']?settings['gridWidthMin']:settings['gridWidthMax']),
    autoExpandMax:true,
   // frame: true,
    stripeRows: true,
    disableSelection:true,
    tbar:paging,
    bbar:paging2,
    stateful: true,
    stateEvents: ['columnmove', 'columnresize', 'hiddenchange' ]

});

// click row open win
grid.on('rowclick', function(grid, rowIndex, e){
	
//	 if (!e) 
//    var e = window.event;
//    e.cancelBubble = true;
//    if (e.stopPropagation) 
//    	e.stopPropagation();         
//    	console.log(e);
      var rec = grid.store.getAt(rowIndex);
      rec.set('status', !rec.get('status'));
      //console.log(rec.json['reqID'])
	 var pageTitle = rec.get('positionTitle');
	 var jobId = rec.json['reqID'];
	 showJob(jobId, pageTitle, this);
	 
});

grid.render();
paging.add(' <a id="btn-filter" href="#"><b>open filter menu</b></a>');
grid.doLayout();

// btn to open filters
if (settings['viewFilters'])
	document.getElementById('btn-filter').style.display='none';
else
	document.getElementById('table-filter').style.display='none';

// filters
Ext.EventManager.on('close-filter', 'click',  function() {
	document.getElementById('table-filter').style.display='none';
	document.getElementById('btn-filter').style.display='';
	grid.setWidth(settings['gridWidthMax']);
	grid.getColumnModel().setColumnWidth(0, settings['positionWidthMax']);
	grid.getColumnModel().setColumnWidth(3, 100);
	return false;
});

// filters
Ext.EventManager.on('btn-filter', 'click',  function() {
	document.getElementById('btn-filter').style.display='none';
	document.getElementById('table-filter').style.display='';
	grid.setWidth(settings['gridWidthMin']);
	grid.getColumnModel().setColumnWidth(0, settings['positionWidthMin']);
	grid.getColumnModel().setColumnWidth(3, 80);
	return false;
});


ds.load({params:{start: 0, limit: 20, empty: true}});
dataStore = ds;
dataFilters = filters;



});

function loadGrid()
{
	var s = getById('desc').value;
	if (dataStore)
	{
		var filterParams = dataFilters.buildQuery(dataFilters.getFilterData());
		//console.log(dataFilters);
		dataStore.load({params:Ext.apply(filterParams, {search:s, empty: ((s.length > 0)?'false':'true'), start: 0, limit: 20})});
	}
}

function logSearch() {
//	var e = dataStore;
	var s = getById('desc').value;
	var t = getById('requestToken').value;
//	if (s != '' && e.data.items.length > 0) {
		jQuery.ajax({
			url			:	'recordedSearches.php',
			type		:	'POST',
			data		:	({ requestToken : t, searchTerm : s}),
			dataType	:	'json'
		});
//	}
}

function intval (mixed_var, base) 
{
    var tmp;
    var type = typeof( mixed_var );
 
    if (type === 'boolean') {
        return (mixed_var) ? 1 : 0;
    } else if (type === 'string') {
        tmp = parseInt(mixed_var, base || 10);
        return (isNaN(tmp) || !isFinite(tmp)) ? 0 : tmp;
    } else if (type === 'number' && isFinite(mixed_var) ) {
        return Math.floor(mixed_var);
    } else {
        return 0;
    }
}

function changePriority(img, reqID)
{
	Ext.Ajax.request({
		  url : 'hotness.php',
	      method: 'POST',
	      params: {ajax: 1, 'act':'change_priority', 'reqID': reqID},
	      success: function ( result, request ) {
	      		jQuery(img).attr('src', 'images/priority-' + result.responseText + '.gif').attr('alt', result.responseText).attr('title', result.responseText);
	      },
	      failure: function ( result, request ) {
	       var jsonData = Ext.util.JSON.decode(result.responseText);
	       var resultMessage = jsonData.data.result;
	       Ext.MessageBox.alert('Failure', resultMessage);
	   }
	});
}

function changePriorityDetail(img, reqID)
{
	Ext.Ajax.request({
		  url : 'hotness.php',
	      method: 'POST',
	      params: {ajax: 1, 'act':'change_priority', 'reqID': reqID},
	      success: function ( result, request ) {
	    	  jQuery('#hotnessImg-' + reqID).attr('src', 'images/priority-' + result.responseText + '.gif').attr('alt', result.responseText).attr('title', result.responseText);
	    	  jQuery(img).css('background-image', 'url(images/priority-' + result.responseText + '.gif)').html(result.responseText);
	      },
	      failure: function ( result, request ) {
	       var jsonData = Ext.util.JSON.decode(result.responseText);
	       var resultMessage = jsonData.data.result;
	       Ext.MessageBox.alert('Failure', resultMessage);
	   }
	});
}

function setFilter(id)
{
	switch(id)
	{
		case 'location':
			var location = getById('location').value;					
	    	dataFilters.addFilter({type:'string', dataIndex:'onSiteLocation', "value":location});
	    	dataStore.reload({params:{start: 0, limit: 20}});			
			break;		
		case 'location-radius':
			var locationRadius = intval(getById('location-radius').value);					
			if (locationRadius>=0)
			{
				dataFilters.addFilter({type:'numeric', dataIndex:'onSiteLocationRadius', "value":{lt:locationRadius}});
	    		dataStore.reload({params:{start: 0, limit: 20}});			
			}
			break;		
		case 'salary':
			var salaryFrom = intval(getById('salary-from').value);
			var salaryTo = intval(getById('salary-to').value);
			if (salaryFrom > 0 && salaryTo > 0 && salaryFrom <= salaryTo)
			{
		    	dataFilters.addFilter({type:'numeric', dataIndex:'maxRate', "value":{gt:salaryFrom, lt:salaryTo}});
		    	dataStore.reload({params:{start: 0, limit: 20}});
			}
			else if (salaryFrom > 0)
			{
				dataFilters.addFilter({type:'numeric', dataIndex:'maxRate', "value":{gt:salaryFrom}});
				dataStore.reload({params:{start: 0, limit: 20}});
			}
			else if (salaryTo > 0)
			{
				dataFilters.addFilter({type:'numeric', dataIndex:'maxRate', "value":{lt:salaryTo}});
				dataStore.reload({params:{start: 0, limit: 20}});
			}		
			
			if (getById('salary-from').value == "" && getById('salary-to').value == "")
			{
				dataFilters.getFilter('maxRate').setActive(false);
			}	
			break;
		case 'hourly-rate':
			var salaryFrom = intval(getById('hourly-rate-from').value);
			var salaryTo = intval(getById('hourly-rate-to').value);
		
			if (salaryFrom > 0 && salaryTo > 0 && salaryFrom <= salaryTo)
			{
		    	dataFilters.addFilter({type:'numeric', dataIndex:'maxRate2', "value":{gt:salaryFrom, lt:salaryTo}});
		    	dataStore.reload({params:{start: 0, limit: 20}});
			}
			else if (salaryFrom > 0)
			{
				dataFilters.addFilter({type:'numeric', dataIndex:'maxRate2', "value":{gt:salaryFrom}});
				dataStore.reload({params:{start: 0, limit: 20}});
			}
			else if (salaryTo > 0)
			{
				dataFilters.addFilter({type:'numeric', dataIndex:'maxRate2', "value":{lt:salaryTo}});
				dataStore.reload({params:{start: 0, limit: 20}});
			}
			
			
			if (getById('hourly-rate-from').value == "" && getById('hourly-rate-to').value == "")
			{
				dataFilters.getFilter('maxRate2').setActive(false);
			}
			
			
			break;
		case 'Full Time':
		case '3-6 months':
		case '6-12 months':
		case '12+ months':
			if (!getById('Full Time').checked || !getById('3-6 months').checked || !getById('6-12 months').checked || !getById('12+ months').checked)
			{
				var checked = [];
				if (getById('Full Time').checked) checked[checked.length] = 'Full Time';
				if (getById('3-6 months').checked) checked[checked.length] = '3-6 months';
				if (getById('6-12 months').checked) checked[checked.length] = '6-12 months';
				if (getById('12+ months').checked) checked[checked.length] = '12+ months';
		   		dataFilters.addFilter({type: 'list',  dataIndex: 'contractLength', options: ['Full Time', '3-6 months', '6-12 months', '12+ months'], phpMode: true, 
		   			value:checked.join(',')});
				dataStore.reload({params:{start: 0, limit: 20}});				
			}
			else
			{
				dataFilters.getFilter('contractLength').setActive(false);
			}
			break;
		case 'active-since':
			if (getById('active-since').value == "")
			{
				dataFilters.getFilter('addedON').setActive(false);
				//dataStore.reload({params:{start: 0, limit: 20}});
				
			}
			else
			{
				dataFilters.addFilter({type:'date', dataIndex:'addedON', value:{'after':new Date(getById('active-since').value)}});
				dataStore.reload({params:{start: 0, limit: 20}});
			}
			break;
	}
	
}

function clearFiler(id)
{
	switch(id)
	{
		case 'active-since':
			getById('active-since').value = '';
			dataFilters.getFilter('addedON').setActive(false);
			break;
	}
	
}

var pressTime = 0;
var timer = null;
function setFilterDelay(type)
{
	var elapsed = new Date().getTime() - pressTime;
	if (elapsed < 1000 && timer)
	{
		clearTimeout(t);
		var t=setTimeout(function(){setFilter(type)},1000);
		return;
	}
	
	pressTime = new Date().getTime();
}

function isDate(sDate) {
   var re = /^\d{2}\/\d{2}\/\d{4}$/
   if (re.test(sDate)) {
      var dArr = sDate.split("/");
      var d = new Date(sDate);
      return d.getMonth() + 1 == dArr[0] && d.getDate() == dArr[1] && d.getFullYear() == dArr[2];
   }
   else {
      return false;
   }
}


var winJob = null;
var jobid = 0;

function showJob(reqID, pageTitle, e)
{
	  winJob = new Ext.Window({
            autoLoad:{url:'applyjobwin.php?id='+reqID,scripts:true},
            title: pageTitle,
            width:800,
            height:600,
            draggable:false,
            closable:true,            
            plain:true,
            modal:true,
            autoScroll:true,
            border:false
        });
		jobid = reqID;
        winJob.show();
        if (!e) var e = window.event;e.cancelBubble = true;if (e.stopPropagation) e.stopPropagation();
}

function shareThis(sTitle, sUrl)
{
  SHARETHIS.addEntry({title:sTitle,url:sUrl},{button:false,popup:false}).attachButton(document.getElementById("share"));
  SHARETHIS.onReady();
}

function showNotifyWin(keywords)
{
  if(trim(keywords)) {
    window.open("emailnotification.php?keyword="+keywords,"emailnotification","menubar=no,width=450,height=300,toolbar=no");
  } else {
    window.open("emailnotification.php?keyword="+'all_jobs',"emailnotification","menubar=no,width=450,height=300,toolbar=no");
    //Ext.MessageBox.show({title:'Error', msg: 'Please enter some keyword into search field.', icon: Ext.MessageBox.ERROR, buttons: Ext.MessageBox.OK, animEl: 'email-notification-btn'});
  }
  
	return;
	var win = new Ext.Window({
            autoLoad:'',
            width:450,
            height:300,
            draggable:false,
            closable:true,            
            plain:true,
            modal:true,
           // resizable:false,
            autoScroll:true,
            border:false
        }).show();

}

// facebook share
function fbs_click() 
{
	u=location.href;
	t=document.title;
	window.open('http://www.facebook.com/sharer.php?u='+encodeURIComponent(u)+'&t='+encodeURIComponent(t),'sharer','toolbar=0,status=0,width=626,height=436');
	return false;
}

function changePriority(img, reqID)
{
	Ext.Ajax.request({
		  url : 'hotness.php',
	      method: 'POST',
	      params: {ajax: 1, 'act':'change_priority', 'reqID': reqID},
	      success: function ( result, request ) {
	    	  jQuery('#hotnessImg-'+reqID).attr('src', 'images/priority-' + result.responseText + '.gif').attr('title', result.responseText).attr('alt', result.responseText);
	      },
	      failure: function ( result, request ) {
	       var jsonData = Ext.util.JSON.decode(result.responseText);
	       var resultMessage = jsonData.data.result;
	       Ext.MessageBox.alert('Failure', resultMessage);
	   }
	});
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function createMarker(point,html) {
var marker = new GMarker(point);
GEvent.addListener(marker, "click", function() {
  marker.openInfoWindowHtml(html);
});
return marker;
}

// ====== Geocoding ======
function getAddress(search) {
	
// ====== Maps for locations ======
var map=new GMap2(document.getElementById("map"));
map.addControl(new GLargeMapControl()) ;
map.addControl(new GMapTypeControl()) ;
map.setCenter(new GLatLng(0,0),10);

// ====== Create a Client Geocoder ======
var geoGeocoder = new GClientGeocoder();

								
// ====== Array for decoding the failure codes ======
var reasons=[];
reasons[G_GEO_SUCCESS]            = "Success";
reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
reasons[403]                      = "Error 403: Probably an incorrect error caused by a bug in the handling of invalid JSON.";

// ======= Global variables to remind us what to do next
var nextAddress = 0;
var markers;
var lastsearch = ""; 
var geoResult;	
	
geoGeocoder.getLocations(search, function (result)
  { 
    if (result.Status.code == G_GEO_SUCCESS) {
      map.clearOverlays(); 
      geoResult = result;

      for (var i=0; i<result.Placemark.length; i++) {
        var p = result.Placemark[i].Point.coordinates;
        var lat=p[1];
        var lng=p[0];
        var point = new GLatLng(lat,lng); 
        map.addOverlay(new GMarker(point));
        if (i==0) {
          map.setCenter(point);
        }
      }
    } else {
      var reason="Error code "+result.Status.code;
      if (reasons[result.Status.code]) {
        reason = reasons[result.Status.code]
      }
      alert(reason);
    }
  }
);
}

// confirmApply function
function confirmApplyNoResume(btn)
{
	if (btn=='yes')
	{
		window.location = './profile.php?errResume=true';
	}
}
// confirmApply function
function confirmApply(btn)
{
	if (btn=='yes')
	{
		Ext.MessageBox.confirm('Confirm', 'The resume that we have on file for you will be used. <a href=\'./profile.php\'>Upload new</a>', confirmApplyOk);
	}
}
function confirmApplyOk(btn) {
	if (btn=='yes') {    
		Ext.Ajax.request({
        	url : './processor.php',
        	method: 'POST',
        	params: {ajax: 1, reqid: jobid},
        	success: function ( result, request ) {
        		var jsonData = Ext.util.JSON.decode(result.responseText);
        		var resultMessage = jsonData.data.result;
                var success = jsonData.success;
                if (success) {
                	pageTitle = winJob.title;
                    winJob.destroy();
                    winJob = new Ext.Window({
                    	autoLoad:{url:'confirm.php',scripts:true},
                        title: pageTitle,
                        width:820,
                        height:600,
                        draggable:false,
                        closable:true,            
                        plain:true,
                        modal:true,
                        autoScroll:true,
                        border:false
                    }).show();
                } else {
                	Ext.MessageBox.alert('Errors', resultMessage);
                }
        	},
        		failure: function ( result, request ) {
        		var jsonData = Ext.util.JSON.decode(result.responseText);
        		var resultMessage = jsonData.data.result;
        		Ext.MessageBox.alert('Failure', resultMessage);
        	}
		});
	}
}