(function($){

	
	//instance vars
    var prods = '';
    var added = 0;
	var rowId = 0;
    //DEBUG: console.log('inside');
	
    
   
    // plugin function
    $.fn.addcitrixcompat = function(){
		
		var table = '<h3>Product Compatibility Matrix</h3>';
		var tableObject = new jQuery.citrixcompat.generateTableHTML();
		table += tableObject.getTableHTML();
		
        this.html(table);
        $.getJSON(crhost + '/json/product/list?unique=' + new Date(), {}, function(json){
        	
			prods = json.products;
			
			//Workaround for firefox 2 for select dropdown box that was not scrollable
			if(jQuery.browser.mozilla === true && jQuery.browser.version.substring(0,3) === '1.8')
			{
				$('#compatprodlist').html('<a id="addToList" style="cursor:pointer;padding:3px;">  Add Citrix Product</a>');
				
				$('#addToList').click(
					function()
					{
						 $(this).replaceWith(jQuery.citrixcompat.productdropdown(prods));
							
					});
			}
			else{
            $('#compatprodlist').html(jQuery.citrixcompat.productdropdown(prods));
			}
        });
    }
    
    var noosmessage = 'Not applicable';
    
    // plugin methods
    jQuery.citrixcompat = {
		
		// generate HTML table for Compatibility List 
		generateTableHTML : function(tableType){
		//DEBUG: console.log('generateTableHTML type'+tableType);
		
		//private variables
		var rowType = tableType?tableType:'';
		var prodTDHTML = tableType?'Citrix Product':'&nbsp;';
		var versionTDHTML = tableType?'Version':'&nbsp;';
		var osTDHTML = tableType?' Operating System ':'&nbsp;';
		var padding = tableType?3:4;
		var myTable ='';
		
		if(tableType)
		{
			myTable += '<table width="100%" border="0" cellpadding="2" cellspacing="0" ><tr><td> ';
			
		}
		myTable += '<table class="compatibilityMatrixTable"  width="100%" border="0" cellpadding="'+padding+'" cellspacing="0" style="margin-bottom: 10px;" id="'+rowType+'compat">';
		
	    myTable += '	<tr style="background: #cccccc" id="'+rowType+'compatheader">';
	    myTable += '		<td width="150"  align="center" id="'+rowType+'compatprodlist">'+prodTDHTML+'</td>';
	    myTable += '		<td width="150"  align="center" id="'+rowType+'compatversionlist">'+versionTDHTML+'</td>';
	    myTable += '		<td width="*"  align="center"  id="'+rowType+'compatoslist">'+osTDHTML+'</td>';
		
		if (!tableType) {
			myTable += '		<td width="100" id="compatadd" align="center">&nbsp;</td>';
			myTable += ' </tr>';
			myTable += '</table>';
		}
		else{
			
			myTable += ' </tr></table></td><td id="'+tableType+'CitrixLogo" align="center"></td></tr></table>';
		}
	    
		
	   
		
		//privileged method
		this.getTableHTML = function(){
			return myTable;	
		}
		
    },
		//creates an object representing a  citrix product
		compatibilityProductObject :function(myProd,myVersion,myOS) 
		{
				//DEBUG: console.log('in compatibilityProductObject'+myProd+' '+myVersion+' '+myOS);
				this.prod = myProd?myProd:'';
				this.version= myVersion?myVersion:'';
				this.os = myOS?myOS:'';
				//DEBUG: console.log(this);
		}
		,
		  
        //clears out all options, resets the product pulldown
        clear: function(){
            jQuery.citrixcompat.removeversiondropdown();
            jQuery.citrixcompat.removeosradiobuttons();
            jQuery.citrixcompat.removeaddlink();
            $('#compatprodlist').html(jQuery.citrixcompat.productdropdown());
        },
        
        //handles the product onchange event
        handleproduct: function(){
            jQuery.citrixcompat.removeosradiobuttons();
            jQuery.citrixcompat.removeaddlink();
            $('#compatversionlist').html(jQuery.citrixcompat.versiondropdown());
        },
        
        //creates the product dropdown
        productdropdown: function(jsonProds){
            var localProds = prods;
            if (jsonProds != undefined) {
                localProds = jsonProds;
            }
            var html = '<select id="compatdropdownproduct" onchange="jQuery.citrixcompat.handleproduct();" style="display: block;"><option value="">Select Product</option>';
            for (var p in localProds) {
                html += '<option  value="' + p + '">' + p + '</option>';
            }
            html += '</select>';
            return html;
        },
        
        //handles the version onchange event
        handleversion: function(){
            jQuery.citrixcompat.removeaddlink();
            $('#compatoslist').html(jQuery.citrixcompat.osradiobuttons());
        },
        
        //creates the version dropdown, based on the options selected in the product dropdown
        versiondropdown: function(){
            var prod = $('#compatdropdownproduct').val();
            if (prod == '') 
                return '&nbsp;';
            var hasVersions = false;
            for (var ver in prods[prod]) {
                if (ver != '') {
                    hasVersions = true;
                    break;
                }
            }
            
            if (hasVersions) {
                var html = '<select id="compatdropdownversion" onchange="jQuery.citrixcompat.handleversion()"><option value="">Select Version</option>';
                for (var ver in prods[prod]) {
                    html += '<option value="' + ver + '">' + ver + '</option>';
                }
                html += '</select>';
                return html;
            }
            else {
                html = 'Not applicable';
                jQuery.citrixcompat.addlink();
                return html;
                
            }
            
        },
        
        //creates a list of radiobuttons based on the product, and version dropdowns
        osradiobuttons: function(){
        
            var prod = $('#compatdropdownproduct').val();
            var ver = $('#compatdropdownversion').val();
            if (prod == '' || ver == '') 
                return '&nbsp;';
            var html = '';
            var oses = prods[prod][ver];
            
            if (oses != '') {
                for (var c = 0; c < oses.length; c++) {
                    html += '<input type="radio" id="compatosradiobutton" name="os" value="' + oses[c] + '"/>' + oses[c];
                }
            }
            else {
                html = 'Not applicable';
                jQuery.citrixcompat.addlink();
            }
            
            $('#compatoslist').click(function(){
                if ($('#compatoslist').html() == noosmessage) {
                    return;
                }
                if ($('#edit_compatibilityTab_meta input:radio:checked').size() > 0) {
                    jQuery.citrixcompat.addlink();
                }
                else {
                    jQuery.citrixcompat.removeaddlink();
                }
            });
            return html;
        },
        
        //adds the add link on the end of the table header area
        addlink: function(){
            $('#compatadd').html('[&nbsp;<a href="javascript:void(0);" id="compataddlink" >Add</a>&nbsp;]');
            $('#compataddlink').click(function(){
                var prod = $('#compatdropdownproduct').val();
                var ver = $('#compatdropdownversion').val();
                // var oses = $('input:radio:checked');	
                var osesArray = [];
                $('#edit_compatibilityTab_meta input:radio:checked').each(function(){
                    osesArray[osesArray.length] = $(this).val();
                });
                var osesStr = osesArray.join(', ');
                if (jQuery.citrixcompat.checkForDuplicate(prod, ver, osesStr) === false) {
                    jQuery.citrixcompat.addCompatibility(prod, ver, osesStr);
                }
                else {
                    alert("Product already found in compatibility list!");
                }
            });
        },
        
        //removes the add link
        removeaddlink: function(){
            $('#compatadd').html('&nbsp;');
        },
        
        //removes the dropdown for version	 	
        removeversiondropdown: function(){
            $('#compatversionlist').html('&nbsp;');
        },
        
        //removes the radiobuttons for os area
        removeosradiobuttons: function(){
            $('#compatoslist').html('&nbsp;');
        },
        
        removecompatrow: function(row){
			
            $(row).remove();
			if (--added == 0) {
                $('#compatsave').attr({
                    disabled: 'disabled'
                });
            }
        },
        incrementAddedValue: function(){
            added++;
        },
        
        /*
         * checks for duplicate entries while adding into the product compatibility
         *
         * @param {Object} product
         * @param {Object} version
         * @param {Object} os
         *
         * returns a boolean true if found else returns false
         */
        checkForDuplicate: function(product, version, os){
            var foundDuplicate = false;
            var fullProduct = '' + product;
            
            if (typeof version != "undefined") {
                version = jQuery.trim('' + version);
                if (version.length > 1) 
                    fullProduct += ' ' + version;
            }
            if (typeof os != "undefined") {
                os = jQuery.trim('' + os);
                if (os.length > 1) 
                    fullProduct += ' ' + os;
            }
            fullProduct = jQuery.trim(fullProduct).replace(/[^A-Za-z0-9_.-]+/g, '');
            
            //DEBUG: //DEBUG: console.log('inside check: '+fullProduct+'length is:' +fullProduct.length);
			
            //extract text from each row and compare with newly entered value
            jQuery('#compat tr').each(function(){
                if (this.id != "compatheader" && foundDuplicate === false) {
                
                    var prodString = jQuery.trim(jQuery(this).text().replace('[ remove ]', '').replace(/[^A-Za-z0-9_.-]+/g, ''));
                    
                    //DEBUG: //DEBUG: console.log('in loop after trim: '+prodString+'length is:' +prodString.length);
                    if (prodString == fullProduct) {
                        //DEBUG: //DEBUG: console.log('found match');
                        foundDuplicate = true;
                    }
                    
                }
            });
            return foundDuplicate;
        },
        addCompatibility: function(prod, ver, osesStr, type,prodObject){
			//DEBUG: console.log('insideCompatibilityTable type: '+type);
			if (!StringUtils.isEmpty(prod)) {
				if (StringUtils.isEmpty(ver)) {
					ver = ''
				}
				else 
					if (StringUtils.isEmpty(osesStr)) {
						osesStr = '';
					};
				var prodRow = type ? prod : '&nbsp;<input type="hidden" name="ready_compatProduct_meta_compatibility_' + added + '_family" value="' + prod + '"/>' + prod;
				var versionRow = type ? ver : '&nbsp;<input type="hidden" name="ready_compatProduct_meta_compatibility_' + added + '_version" value="' + ver + '"/>' + ver;
				var osRow = type ? osesStr : '&nbsp;<input type="hidden" name="ready_compatProduct_meta_compatibility_' + added + '_platform" value="' + osesStr + '"/>' + osesStr;
				var color = '#FFFFFF';
				var rowNo = type ? rowId : added;
				var rowType = type ? type : '';
				
				var row = '<tr class="compatibilityMatrixTableRowLight" id="' + rowType + 'compatrow' + rowNo + '" style="border-bottom: 1px dotted #BBBBBB; margin-top: 9px;  padding-top: 9px" >';
				row += '<td >' + prodRow + '</td>';
				row += '<td  align="center">' + versionRow + '</td>';
				row += '<td  align="center">' + osRow + '</td>';
				
				if (typeof(type)=='undefined') {
					row += '<td align="center">[ <a href="javascript:void(0);" onclick="jQuery.citrixcompat.removecompatrow(\'#compatrow' + added + '\')">remove</a> ]</td>'
				}
				row += '</tr>';
				
				if (!type) {
					jQuery.citrixcompat.clear();
					$('#compatheader').after(row);
					$('#compatsave').removeAttr('disabled');
					added++;
				}
				else {
					$('#' + type + 'compatheader').after(row);
					rowId++;
				}
			}
		}	
        ,
		
		getSortedCompatibilityArray:function(objectArray,sortByColumn){
			//DEBUG: console.log('inside addSortedCompatibilityArray sortByColumn '+sortByColumn);
			objectArray.sort(function(a,b)
				{
					if (a && b) 
					{
						return ''+a['prod']+ a['os'] + a['version'] < ''+b['prod']+ b['os'] + b['version'] ? 1 : -1;
					}	
				});
			},
			
		addSortedCompatibilityTable:function(myObjectArray,myType,crhost,profileName){
			//DEBUG: console.log('inside addSortedCompatibilityTable ');
			rowId = 0;
			//get the sorted array object
			var sortedArray =  jQuery.citrixcompat.getSortedCompatibilityArray(myObjectArray,'prod');
			//draw the table
			var divID = '#view'+ myType.substring(0,1).toUpperCase()+myType.substring(1,myType.length)+'_compatibilityTab_meta';
			var tableObject = new jQuery.citrixcompat.generateTableHTML(myType);
			var imageText = '<span class="citrixReadyLogo"><img src="'+crhost+'/res/i/citrix_ready.jpg" alt="Citrix Ready" /></span>';
			var imageElem =  jQuery(imageText);
			var tableHTML =myObjectArray.length >= 1 ?tableObject.getTableHTML():imageText+'<p><i>No Citrix Products defined!</i></p><br clear="all"/>';
			
			var text =  myObjectArray.length >= 1?(typeof profileName !=='undefined' ?'<p>'+profileName+' is verified to be compatible with :</p>':''):'';
			//clean up div
			jQuery(divID).children().remove();
			jQuery(divID).html(text).append(tableHTML);
			jQuery('#'+myType+'CitrixLogo').append(imageElem);
			for(var o in myObjectArray){
				var		co = myObjectArray[o];
				jQuery.citrixcompat.addCompatibility(co.prod, co.version, co.os, myType);
			}
		}
	    
		
    }
})(jQuery);
