/*
 * Copyright(c) 2008, Soft Idiom 
 * www.softidiom.com
 */


function gup(name) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.href);

  if(results == null)
    return "";
  else
    return results[1];
}

var entity = 'mix';
var entities = 'mixes';
var grid, store;
Ext.BLANK_IMAGE_URL = '/shared/ext/v2.2/resources/images/default/s.gif';

Ext.override( Ext.ux.grid.GridFilters , {
	buildQuery : function(filters) {
		var uploader = Request.QueryString("user").toString();
		if(uploader) {
			filters.push({"field":"userid","data":{"type":"numeric","comparison":"eq","value": parseInt(uploader)}});
		}
		return {filters: Ext.encode(filters)};
	}
});

Ext.onReady(function(){
	window.onbeforeunload = confirmExit;
	Ext.QuickTips.init();
	Ext.ux.menu.RangeMenu.prototype.icons = {
		gt: '/shared/img/v1/icons/greater_than.png', 
		lt: '/shared/img/v1/icons/less_than.png',
		eq: '/shared/img/v1/icons/equals.png'
	};
		
		
	var name = Request.QueryString("name").toString();
	var artist = Request.QueryString("artist").toString();
	var genre = Request.QueryString("genre").toString();
	var featuredmixes = Request.QueryString("featuredmixes").toString();
	Ext.ux.grid.filter.StringFilter.prototype.icon = '/shared/img/v1/icons/find.png';
	var filters = new Ext.ux.grid.GridFilters({
		filters:[
		{type: 'string', dataIndex: 'name', value: name, active: hasValue(name)},
		{type: 'string', dataIndex: 'artist_name', value: artist, active: hasValue(artist)},
		{type: 'string', dataIndex: 'genre', value: genre, active: hasValue(genre)},
		{type: 'numeric', dataIndex: 'downloads'},
		{type: 'numeric', dataIndex: 'stars'},
		{type: 'boolean', dataIndex: 'featured', value: featuredmixes=='on', active: hasValue(featuredmixes)},
		{type: 'string', dataIndex: 'uploaded_by'}
	]});

    // create the Data Store
    store = new Ext.data.GroupingStore({
        proxy: new Ext.data.HttpProxy({
            url: './php/v1/mixes_get.php?name=' + gup('name')
        }),
        // create reader that reads the records
        reader: new Ext.data.JsonReader({
            root: 'results',
            totalProperty: 'total',
            id: 'id',
            fields: [
                //'id','name','userid','user_is_artist','artist_name','genre','file','downloads','featured'
                'id','name','artist_name','genre','downloads','stars','featured','rating_sum','rating_total', 'upload_time', 'uploaded_by'
            ]
        }),
        sortInfo: {field:'name', direction:'ASC'},
        remoteSort: true
    });

	store.on('beforeload', function() {
	    if(formIsDirty()) {
	      var answer = confirm('Save unsaved changes first?');
	      if (answer) { saveGrid() }
	    }
	});


    //selection model
    var sm = new Ext.grid.CheckboxSelectionModel();

    // the column model
    var cm = new Ext.grid.ColumnModel([
    	//sm,
		{
			header: 'Name', dataIndex: 'name', width: 200,
			renderer: function(v) {return '<span class="mixlink" title="View Mix: '+Ext.util.Format.htmlEncode(v)+'">'+Ext.util.Format.htmlEncode(v)+'</span>'}
		},
		{
			header: 'Artist', dataIndex: 'artist_name', width: 150,
			renderer: Ext.util.Format.htmlEncode
		},
		{
			header: 'Genre', dataIndex: 'genre', width: 110,
			renderer: Ext.util.Format.htmlEncode
		},
		{
			header: 'Hits', dataIndex: 'downloads', align: 'right', width: 60
		},
		{
			header: 'Rating', dataIndex: 'stars', align: 'center', width: 70,
			renderer: function(value,meta,record,row,col,store) {
				var sum = parseInt(record.get('rating_sum'));
				var votes = parseInt(record.get('rating_count'));
				var rating = parseInt(record.get('stars'));
				if(rating==0) return '';
				return '<img src="/shared/img/v1/rated'+rating+'.gif" alt="Rated '+rating+'/5 - '+votes+' votes" width="40px" />';
			}
		},
		{
			header: 'Uploaded', dataIndex: 'upload_time', align: 'right', width: 80
		},
		{
			header: 'Uploaded By', dataIndex: 'uploaded_by', width: 150,
			renderer: Ext.util.Format.htmlEncode
		},
		{
			header: 'Featured', dataIndex: 'featured', align: 'center', width: 70,
			renderer: function(v) {
				if(v == 1) return 'Yes';
				return 'No';
			}
		}
	]);

    // by default columns are sortable
    cm.defaultSortable = true;
    
    var grid = new Ext.grid.GridPanel({
        renderTo: 'copy',
        width:692,
        height:450,
        store: store,
        cm: cm,
        clicksToEdit: 1,
        trackMouseOver: false,
        sm: sm,
        loadMask: true,
        border: false,
        stripeRows: true,
		plugins: filters,
        bbar: new Ext.PagingToolbar({
            plugins: [
            	new Ext.ux.Andrie.pPageSize({afterText: ' '+entities, variations: [5,10,18,25,30,35,40,45,50,100,200,500]}),
            	filters
            	],
	        pageSize: 18,
	        store: store,
	        displayInfo: true,
	        displayMsg: '{0} - {1} of {2} '+entities,
	        emptyMsg: 'No '+entities+' to display'
	    })
    });

	grid.on('cellclick',function(g,r,c,e){
		var record = g.getStore().getAt(r);
		var fieldName = g.getColumnModel().getDataIndex(c);
		if(fieldName == 'name') {
			//window.location = '/mix/?id='+record.data.id;
			mixWin = window.open('/mix/?id='+record.data.id);
			if (window.focus) {mixWin.focus();}
		}
	});
    // trigger the data store load
    store.load({params:{start:0, limit:18}});

    // render it
	grid.render('copy');
	
	function addRecord() {
		Ext.Ajax.request({
		   url: './php/v1/add.php',
		   success: function(response, opts) {
				var data = Ext.decode(response.responseText).data;
				var newRec = new Ext.data.Record({
					id: data.id
				}, data.id);
				grid.stopEditing();
				store.insert(0, newRec);
				grid.getSelectionModel().selectFirstRow();
				grid.startEditing(0, 2);
		   },
		   failure: function(response, opts) {
		   	   alert('failure');
		   }
		});
	}
	
	function deletSelected() {
		var selectedIds = grid.getSelectionModel().selections.keys;
		if(selectedIds.length > 0) {
			if(selectedIds.length == 1) {
				Ext.Msg.confirm('Confirm','Are you sure you want to delete this '+selectedIds.length+' '+entity+'?',deleteRecords);
			} else {
				Ext.Msg.confirm('Confirm','Are you sure you want to delete these '+selectedIds.length+' '+entities+'?',deleteRecords);
			}
		} else {
			return Ext.Msg.alert('Error','Please select one or more '+entities+' to delete first.');
		}
	}
	
	function deleteRecords(btn) {
		if(btn!='yes') {
			return;
		}
		Ext.Ajax.request({
		   url: './php/v1/delete.php',
		   params: {ids: Ext.encode(grid.getSelectionModel().selections.keys)},
		   success: function(response, opts) {
				var selectedRow = grid.getSelectionModel().getSelected();
				var selectedIndex = store.indexOf(selectedRow);
				store.reload();
				if(selectedRow) {
					grid.getSelectionModel().selectRow(selectedIndex,false);
				}
		   },
		   failure: function(response, opts) {
		   	   alert('failure');
		   }
		});
	}
	
	function saveGrid() {
		var dirtyData = new Array();
		for(var i=0;i<store.getCount();i++) {
			var rec = store.getAt(i);
			if(rec.dirty){
				dirtyData[dirtyData.length]=rec.data;
			}
		}
		if (dirtyData.length > 0) {
			var waitMsg = Ext.Msg.wait('Saving changes, please wait...');
			Ext.Ajax.request({
			   url: './php/v1/save.php',
			   params: {dirty_data: Ext.util.JSON.encode(dirtyData)},
			   success: function(response, opts) {
					waitMsg.hide();
					var result = Ext.util.JSON.decode(response.responseText);
					if (result.success) {
						store.commitChanges();
					} else {
						Ext.Msg.alert('Warning','Some changes were not saved - please refresh grid.');
					}
			   },
			   failure: function(response, opts) {
					waitMsg.hide();
					Ext.Msg.alert('Error','Could not connect to server, there may be a problem with the server or the Internet connection. Please wait a few seconds and try saving again.');
			   }
			});	
		} else {
			Ext.Msg.alert('Error','There are no unsaved changes to save at this time.');
		}
	}
	
	function refreshGrid() {
		store.reload();
	}
	
});

function confirmExit() {
	//if there is dirty data prompt to save it
	if (formIsDirty()) {
		return 'There are unsaved changes. If you continue the changes will be lost.';
	}
}
  
function formIsDirty() {
	//return true if the grid has unsaved changes
	for (var i = 0 ;i < store.getCount(); i++) {
		var rec = store.getAt(i);
		if (rec.dirty){
			return true;
		}
	}
	return false;
}

function hasValue(object) {
	//return true if object is not null and is not an empty string
	if(object==null) return false;
	if(object=='') return false;
	return true;
}
