﻿/*dynSearchResult = {};
dynSearchResult.resTable = new Array();
dynSearchResult.infoClassName = 'uiPriceLineBriefInfoRow'; //tr that contains search result
dynSearchResult.addInfoClassName = 'searchResultExpanded'; //tr that contains search result additional info
dynSearchResult.resultRowClassName = 'uiProductInfo';//tr that contains search result info
dynSearchResult.sortDirection = true; //desc. false - asc
dynSearchResult.resTableSize = 0;*/

//jquery.jqURL.js
////////////////////////////////////////////////////////////////////////////////////////////////////////////
jQuery.jqURL = {
	url : // returns a string
	function(args) {
		args = 
			jQuery.extend({
				win : window
			},
			args);
		return args.win.location.href;
	},
	
	loc : 
	function(urlstr, args) {
		args = 
			jQuery.extend({
				win : window,
				w : 500,
				h : 500,
				wintype : '_top'
			},
			args);
			
		if (!args.t) {
			args.t = screen.height / 2 - args.h / 2;
		}
		if (!args.l) {
			args.l = screen.width / 2 - args.w / 2;
		}
		if (args['wintype'] == '_top') {
			args.win.location.href = urlstr;
		}
		else {			
			open(
			urlstr,
			args['wintype'],
			'width=' + args.w + ',height=' + args.h + ',top=' + args.t + ',left=' + args.l + ',scrollbars,resizable'
			);
		
		}
		return;
	},
	
	qs :
	function(args) {
		args = jQuery.extend({
			ret : 'string',
			win : window
		},
		args);
		
		if (args['ret'] == 'string') {
			return jQuery.jqURL.url({ win:args.win }).split('?')[1];
			}

		else if (args['ret'] == 'object') {
			
			var qsobj = {};
			var thisqs = jQuery.jqURL.url({ win:args.win }).split('?')[1];
			
			if ( thisqs ) {
				var pairs = thisqs.split('&');
				for ( i=0;i<pairs.length;i++ ) {
					var pair = pairs[i].split('=');
					qsobj[pair[0]] = pair[1];
				}
			}
			return qsobj;
		}
	},
	
	strip :
	function(args) {
		args = jQuery.extend({
			keys : '',
			win : window
			},
			args);
		
		if (jQuery.jqURL.url().indexOf('?') == -1) { // no query string found
			return jQuery.jqURL.url({ win:args.win });
		}
		// if no keys passed in, just return url with no querystring
		else if (!args.keys) {
			return jQuery.jqURL.url({ win:args.win }).split('?')[0];
		}
		else { //return stripped url

			var qsobj = jQuery.jqURL.qs({ ret:'object',win:args.win });  // object with key/value pairs		
			var counter = 0;
			var url = jQuery.jqURL.url({ win:args.win }).split('?')[0] + '?';
			var amp = '';
			
			for (var key in qsobj) {
				if (args.keys.indexOf(key) == -1) { 
					// pass test, add this key/value to string
					amp = (counter) ? '&' : '';
					url = url + amp + key + '=' + qsobj[key];
					counter++;
				}
			}
			return url;
		}			
	},
	
	get :
	function(key,args) {
		args = jQuery.extend({
			win : window
			},args);
	
	qsobj =  jQuery.jqURL.qs({ ret:'object', win:args.win });
	return qsobj[key];
	},
	
	set :
	function(hash,args) {
		args = jQuery.extend({
			win : window
			},args);
		
		// get current querystring
		var qsobj =  jQuery.jqURL.qs({ ret:'object',win:args.win });
		
		// add/set values from hash
		for (var i in hash) {
			qsobj[i] = hash[i];
		}
		
		var qstring = '';
		var counter = 0;
		var amp = '';
		
		// turn qsobj into string
		for (var k in qsobj) {
			amp = (counter) ? '&' : '';
			qstring = qstring + amp + k + '=' + qsobj[k];
			counter++;
		}
		return jQuery.jqURL.strip({ win: args.win }) + '?' + qstring;
	}
	
};

//search.Result.js
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function SearchResultUtility()
{
    this.sortContext;
    this.sortOrder = true;
    this.lastSortType = 3;
    this.sortHiddenElements = ['uiLengthOfContract', 'uiKwhPrice', 'uiSubscriptionPrice', 'uiSummarizedPrice', 'uiSupplierName'];
    this.filterHiddenElements = ['uiFlatPrice', 'uiVariablePrice', 'uiGreenEl', 'uiGreenCo2', 'uiGreenReductionCo2',
                                    'uiGreenFromNew', 'uiGreenFromExisting2Less', 'uiGreenFromExisting2To10', 'uiGreenFromExisting10More', 'uiContractLess3', 'uiContractBetween3And12', 
                                    'uiContractBetween12And24', 'uiContractGreaterThen24', 'uiContractIsInfinite'];
    this.filterPriceTypeGroup = [0, 1];
    this.filterGreenMajorGroup = [2];
    this.filterGreenGroup = [3, 4, 5, 6, 7, 8];
    this.filterContractGroup = [9, 10, 11, 12, 13];
    this.expandedSectionElements = [['ContractConditionsExpanded', false], ['CommonPaymentConditionsExpanded', false], ['SpecialPaymentConditionsExpanded', false],
                                    ['SpecialPaymentForSupplierExpanded', true], ['SpecialPaymentForNetExpanded', false], ['SpecialPaymentTaxesExpanded', false],
                                    ['ProductHasFixedPriceExpanded', false]];
    this.filterChoiseIdTemplate = "type";
    this.searchResultExpanded = "searchResultExpanded";
    this.searchResultsTableId = "SearchResultsTable";
    this.defaultProductTableId = "DefaultProduct";
    this.excludeFromSearchId = "SearchResultAdditionalData";
    this.searchResultNoHitsMessage = "SearchResultNoHitsMessage";
    this.upArrowClassName = "sorted";
    this.downArrowClassName = "sorted asc";
    this.noHitsRowIdPostfix ="uiRowNoHits";
    this.sendToFriendMessageIdPostfix = "uiTxtYourMessageToRecipient";
    this.compareCheckBoxIdPostfix = "uiCbxCompare";
    this.sortLinkIdPrefix = "uiLnkSorter";
    
    //url parameters to apply sorting and filtering by query parameters in url
    this.sortTypeParameter = "sortType";
    this.sortOrderParameter = "sortOrder";
    this.filterOptionsParameter = "filterBy";
    this.expandedProductsParameter = "expandProducts";
    this.expandedSectionsParameter = "expanded";
    
    //  identifiers of hidden elements with additional data
    this.priceLineBriefInfoRow = "PriceLineBriefInfoRow";
    this.hiddenSortData = "uiHiddenSortData";
}

SearchResultUtility.prototype.SwapRows = SearchResultUtility_SwapRows;
SearchResultUtility.prototype.Swap = SearchResultUtility_Swap;
SearchResultUtility.prototype.GetChildElementValue = SearchResultUtility_GetChildElementValue;
SearchResultUtility.prototype.GetChildElement = SearchResultUtility_GetChildElement;
SearchResultUtility.prototype.Sort = SearchResultUtility_Sort; 
SearchResultUtility.prototype.ResetHeader = SearchResultUtility_ResetHeader;
SearchResultUtility.prototype.ChangeHeader = SearchResultUtility_ChangeHeader;
SearchResultUtility.prototype.GatherFilterCheckBoxes = SearchResultUtility_GatherFilterCheckBoxes;
SearchResultUtility.prototype.Filter = SearchResultUtility_Filter;
SearchResultUtility.prototype.GetNextElement = SearchResultUtility_GetNextElement;
SearchResultUtility.prototype.DefineSearchResultItemVisibility = SearchResultUtility_DefineSearchResultItemVisibility;
SearchResultUtility.prototype.HasCheckedOptions = SearchResultUtility_HasCheckedOptions;
SearchResultUtility.prototype.ClearFilters = SearchResultUtility_ClearFilters;
SearchResultUtility.prototype.CheckNoHitsMessage = SearchResultUtility_CheckNoHitsMessage;
SearchResultUtility.prototype.NeedToExcludeFromSearchSort = SearchResultUtility_NeedToExcludeFromSearchSort;
SearchResultUtility.prototype.ConstructUrl = SearchResultUtility_ConstructUrl;
SearchResultUtility.prototype.ChangeSearchRepresentationByUrl = SearchResultUtility_ChangeSearchRepresentationByUrl;
SearchResultUtility.prototype.ChangeUrls = SearchResultUtility_ChangeUrls;
SearchResultUtility.prototype.FindUrl = SearchResultUtility_FindUrl;
SearchResultUtility.prototype.GetUrlParameter = SearchResultUtility_GetUrlParameter;
//  compare products validation
SearchResultUtility.prototype.ValidateProductsToCompare = SearchResultUtility_ValidateProductsToCompare;
SearchResultUtility.prototype.CountSelectedProducts = SearchResultUtility_CountSelectedProducts;
SearchResultUtility.prototype.IsProductSelected = SearchResultUtility_IsProductSelected;
SearchResultUtility.prototype.HandleNoResults = SearchResultUtility_HandleNoResults;
SearchResultUtility.prototype.ExpandProductSectionByUrlOrCookies = SearchResultUtility_ExpandProductSectionByUrlOrCookies;

        
function QuickSort(context)
{        
    Qsort(context, 0, context.SearchValuesChahe.length-1);    
}

function Qsort(context, begin, end) {

    var pivot = begin + Math.floor((end - begin) / 2);
    var pivotValue = context.GetValue(pivot);
    
    var i = begin;
    var j = end;

    var condition = false;
    
    do 
    {
        while (Compare(context.GetValue(i), pivotValue, context.SortOrder))        
        {
            i = i + 1;
        }

        while (Compare(pivotValue, context.GetValue(j), context.SortOrder))        
        {
            j = j - 1;
        }

        if (i <= j) 
        {
            condition = context.GetValue(i) != context.GetValue(j);
            
            if(condition)
            {
                context.Swap(i, j);                                                
            }   
                     
            i = i + 1;
            j = j - 1;
        }        
    } while (i <= j)       	            	        
            
    if(begin < j)
    {
        Qsort(context, begin, j);
    }
            
    if(i < end)
    {
        Qsort(context, i, end);		
    }		    
}

function Compare(a, b, sortorder)
{
    if(sortorder)
    {
        return a < b;
    }
    else
    {
        return a > b;
    }
}

function GetIndex(index)
{
    return index * 2 + 2;
}

function SortContext(rows, searchValuesChahe)
{
    this.SortOrder;
    this.SortBy;
    this.SwapMatrix = new Array();
        
    this.SearchValuesChahe = searchValuesChahe;
    this.Rows = rows;
        
    this.Swap = SortContext_Swap;
    this.GetValue = SortContext_GetValue; 
    this.SetUpSettings = SortContext_SetUpSettings;
}

function SortContext_SetUpSettings(sortorder, sortby, searchResultTable)
{
    this.SortOrder = sortorder;
    this.SortBy = sortby;
    this.SearchResultTable = searchResultTable;    
}

function SortContext_GetValue(index)
{
    return this.SearchValuesChahe[index][this.SortBy];
}
    
function SortContext_Swap(index1, index2)
{
    var rowIndex1 = GetIndex(index1);
    var rowIndex2 = GetIndex(index2);

    var tmp = this.SearchValuesChahe[index1];        
    this.SearchValuesChahe[index1] = this.SearchValuesChahe[index2];
    this.SearchValuesChahe[index2] = tmp;        
     
     
var tableNode = this.SearchResultTable;
var parent = tableNode.rows[2].parentNode;

//  save checked state
var compareCheckBox1 = searchUtility.GetChildElement(searchUtility.compareCheckBoxIdPostfix, false, parent.rows[rowIndex2 - 1].cells[1]);
var compareCheckBox2 = searchUtility.GetChildElement(searchUtility.compareCheckBoxIdPostfix, false, parent.rows[rowIndex1 - 1].cells[1]);
var checked1 = compareCheckBox1.checked;
var checked2 = compareCheckBox2.checked;

//  swap rows
parent.insertBefore(parent.rows[rowIndex1], parent.rows[rowIndex2]);
parent.insertBefore(parent.rows[rowIndex2], parent.rows[rowIndex1]);
parent.insertBefore(parent.rows[rowIndex1 - 1], parent.rows[rowIndex2 - 1]);
parent.insertBefore(parent.rows[rowIndex2 - 1], parent.rows[rowIndex1 - 1]);

//  restore checked state
compareCheckBox1 = searchUtility.GetChildElement(searchUtility.compareCheckBoxIdPostfix, false, parent.rows[rowIndex2 - 1].cells[1]);
compareCheckBox2 = searchUtility.GetChildElement(searchUtility.compareCheckBoxIdPostfix, false, parent.rows[rowIndex1 - 1].cells[1]);
compareCheckBox1.checked = checked2;
compareCheckBox2.checked = checked1;

//searchUtility.Swap(this.Rows[rowIndex1], this.Rows[rowIndex2]);
}

function SearchResultUtility_Sort(sortLink, currentSortType)
{    
    if(currentSortType == this.lastSortType)
    {
        this.sortOrder = !this.sortOrder;
    }
    
    this.lastSortType = currentSortType;

    var searchResult = document.getElementById(this.searchResultsTableId);    
    if(!sortLink)
    {
        sortLink = this.GetChildElement(this.sortLinkIdPrefix + currentSortType, false, searchResult);
    }
        
    this.ChangeHeader(sortLink, this.sortOrder, searchResult);
        
    //  create sort context        
    if(!this.sortContext)    
    {        
        var searchValuesChahe = new Array();
        
        for(var index = 2; index < searchResult.rows.length - 2;)
        {
            var row = searchResult.rows[index];
            var arrayCell = new Array();
            
            arrayCell[0] = parseInt(this.GetChildElementValue(this.sortHiddenElements[0], row));
            arrayCell[1] = parseFloat(this.GetChildElementValue(this.sortHiddenElements[1], row));
            arrayCell[2] = parseFloat(this.GetChildElementValue(this.sortHiddenElements[2], row));
            arrayCell[3] = parseFloat(this.GetChildElementValue(this.sortHiddenElements[3], row));
            arrayCell[4] = this.GetChildElementValue(this.sortHiddenElements[4], row);
         
            searchValuesChahe.push(arrayCell);
            index = index  + 2;       
        }
                
        this.sortContext = new SortContext(searchResult.rows, searchValuesChahe);
    }
    
    this.sortContext.SetUpSettings(this.sortOrder, currentSortType, searchResult);    
    QuickSort(this.sortContext);   
}

function SearchResultUtility_GetChildElementValue(childElementId, parentElement)
{
    if(parentElement)
    {
       var result = this.GetChildElement(childElementId, false, parentElement);
       if(result)
       {        
            return result.innerHTML;
       }
    }
    return 0;
}

function SearchResultUtility_GetChildElement(childElementId, exact, parentElement)
{
    if(parentElement)
    {
        for(var i=0; i< parentElement.childNodes.length; i++)
        {
            if((exact && parentElement.childNodes[i].id == childElementId)
                || !exact && parentElement.childNodes[i].id && parentElement.childNodes[i].id.indexOf(childElementId) > 0)
            {
               return parentElement.childNodes[i];
            }
            var childElement = this.GetChildElement(childElementId, exact, parentElement.childNodes[i]);
            if(childElement)
            {
                return childElement;
            }
        }
    }
    return null;
}

function SearchResultUtility_Swap(element1, element2)
{  
    if(element1.nodeName == "TR" && element2.nodeName == "TR" 
            && element1.cells.length == element2.cells.length)
    {
        this.SwapRows(element1, element2);
        
        var detailed1 = this.GetNextElement(element1);
        var detailed2 = this.GetNextElement(element2);
        if(detailed1 && detailed1.nodeName == "TR" && detailed1.id.indexOf(this.searchResultExpanded) != -1 
            && detailed2 && detailed2.nodeName == "TR" && detailed2.id.indexOf(this.searchResultExpanded) != -1)
            {
                this.SwapRows(detailed1, detailed2);
            }
            else
            {
                alert('SearchResultUtility_Swap _detailed2');
            }
    }
    else
    {
        alert('SearchResultUtility_Swap');
    }
}

function SearchResultUtility_GetNextElement(element) 
{
    var n = element;
    do n = n.nextSibling;
    while (n && n.nodeType != 1);
    return n;
}


function SearchResultUtility_SwapRows(row1, row2)
{    
    for(var i = 0; i < row1.cells.length; i++)
    {   
        var compareCheckBox1 = this.GetChildElement(this.compareCheckBoxIdPostfix, false, row1.cells[i]);
        var compareCheckBox2 = this.GetChildElement(this.compareCheckBoxIdPostfix, false, row2.cells[i]);
        
        var temp = row1.cells[i].innerHTML;
        row1.cells[i].innerHTML = row2.cells[i].innerHTML;
        row2.cells[i].innerHTML = temp;
        
        temp = row1.cells[i].id;
        row1.cells[i].id = row2.cells[i].id;
        row2.cells[i].id = temp;
        
        var compareCheckBoxAfterSwap1 = this.GetChildElement(this.compareCheckBoxIdPostfix, false, row1.cells[i]);
        var compareCheckBoxAfterSwap2 = this.GetChildElement(this.compareCheckBoxIdPostfix, false, row2.cells[i]);
        
        if(compareCheckBox1 && compareCheckBox2
            && compareCheckBoxAfterSwap1 && compareCheckBoxAfterSwap2)
        {       
            compareCheckBoxAfterSwap1.checked = compareCheckBox2.checked;
            compareCheckBoxAfterSwap2.checked = compareCheckBox1.checked;
        }
    }
        
    var tempStyle = row1.style.display;
    row1.style.display = row2.style.display;    
    row2.style.display = tempStyle;
}

function SearchResultUtility_ResetHeader(searchTable)
{
    if(searchTable && searchTable.rows && searchTable.rows[0])
    {
        var headRow = searchTable.rows[0];
        for(var i = 0; i < headRow.childNodes.length; i++)
        {
             if(headRow.childNodes[i].nodeName == "TH" && (headRow.childNodes[i].className == this.upArrowClassName 
                                                                        || headRow.childNodes[i].className == this.downArrowClassName))
            {
                headRow.childNodes[i].className = "";
            } 
        }
    }
}

function SearchResultUtility_ChangeHeader(sortLink, sortDirection)
{
    var defaultProductTable = document.getElementById(this.defaultProductTableId);
    this.ResetHeader(defaultProductTable);
    var searchResultTable = document.getElementById(this.searchResultsTableId);
    this.ResetHeader(searchResultTable);
    if(sortLink)
    {   
        sortLink.parentNode.className = sortDirection? this.upArrowClassName: this.downArrowClassName;
    }
}

// filters search result according to checked filter options
// quite complicated logic because of huge amount of requirements to the filter
//TODO:can be made generic, refactor after final 
function SearchResultUtility_Filter()
{
    //console.profile();
    //  try to find 'no hits' message in the search result
    var noHitsMessage = document.getElementById(this.searchResultNoHitsMessage);
    
    //  if 'no hits' message exists
    if(noHitsMessage)
    {
        //  do not apply any filters because there are no data
        return false;
    }
    
    //  do filtration
    var searchResult = document.getElementById(this.searchResultsTableId);
    var filterCheckBoxes = this.GatherFilterCheckBoxes();
    
    var hasPriceTypeOptionsChecked = this.HasCheckedOptions(filterCheckBoxes, this.filterPriceTypeGroup);
    var hasGreenMajorOptionChecked = this.HasCheckedOptions(filterCheckBoxes, this.filterGreenMajorGroup);
    var hasGreenOptionsChecked = this.HasCheckedOptions(filterCheckBoxes, this.filterGreenGroup);
    var hasContractOptionsChecked = this.HasCheckedOptions(filterCheckBoxes, this.filterContractGroup);
          
    if(!hasPriceTypeOptionsChecked && !hasGreenOptionsChecked 
        && !hasContractOptionsChecked && !hasGreenMajorOptionChecked)
    {
        for(var i=0; i<searchResult.rows.length; i++)
        {         
            if(searchResult.rows[i].id.indexOf(this.excludeFromSearchId) == -1)
            {
                searchResult.rows[i].style.display = "";
            }
        }
        this.CheckNoHitsMessage(searchResult);
        return;
    }
    
    for(var i=0; i<searchResult.rows.length; i++)
    {
        if(searchResult.rows[i].id.indexOf(this.excludeFromSearchId) == -1)
        {
            searchResult.rows[i].style.display = "none";
        }
    }
       
    //processing price type group 

    for(var i=0; i<searchResult.rows.length; i++)
    {        
        if(this.NeedToExcludeFromSearchSort(searchResult.rows[i]))
        {
            continue;
        }
        
        
        var priceTypeBitFlag = !hasPriceTypeOptionsChecked;
        for(var j=0;j<this.filterPriceTypeGroup.length; j++)   
        {
            if(filterCheckBoxes[this.filterPriceTypeGroup[j]].checked)
            {                                
                var priceTypeValue = this.GetChildElementValue(this.filterHiddenElements[this.filterPriceTypeGroup[j]], searchResult.rows[i]);
                priceTypeBitFlag = priceTypeBitFlag || (parseInt(priceTypeValue) == 1);                
            }
        }
        
        var greenMajorBitFlag = !hasGreenMajorOptionChecked;
        for(var j=0;j<this.filterGreenMajorGroup.length; j++)   
        {
            if(filterCheckBoxes[this.filterGreenMajorGroup[j]].checked)
            {
                var greenMajorValue = this.GetChildElementValue(this.filterHiddenElements[this.filterGreenMajorGroup[j]], searchResult.rows[i]);
                greenMajorBitFlag = greenMajorBitFlag || (parseInt(greenMajorValue) == 1);
            }
        }
        
        var greenElBitFlag = !hasGreenOptionsChecked;
        for(var j=0;j<this.filterGreenGroup.length; j++)   
        {
            if(filterCheckBoxes[this.filterGreenGroup[j]].checked)
            {
                var greenElValue = this.GetChildElementValue(this.filterHiddenElements[this.filterGreenGroup[j]], searchResult.rows[i]);
                greenElBitFlag = greenElBitFlag || (parseInt(greenElValue) == 1);
            }
        }
        
        var contractGroupBitFlag = !hasContractOptionsChecked;
        for(var j=0;j<this.filterContractGroup.length; j++)   
        {
            if(filterCheckBoxes[this.filterContractGroup[j]].checked)
            {
                var contractGroupValue = this.GetChildElementValue(this.filterHiddenElements[this.filterContractGroup[j]], searchResult.rows[i]);
                contractGroupBitFlag = contractGroupBitFlag || (parseInt(contractGroupValue) == "1");
            }
        }
        
        this.DefineSearchResultItemVisibility(searchResult.rows[i], priceTypeBitFlag && greenMajorBitFlag && greenElBitFlag && contractGroupBitFlag);
    }
    
   /* //processing green group 
    if(hasGreenOptionsChecked)
    {
        for(var i=0; i<searchResult.rows.length; i++)
        {
            if(this.NeedToExcludeFromSearchSort(searchResult.rows[i]))
            {
                continue;
            }
            
            var greenElBitFlag = false;
            for(var j=0;j<this.filterGreenGroup.length; j++)   
            {
                if(filterCheckBoxes[this.filterGreenGroup[j]].checked)
                {
                    greenElBitFlag = greenElBitFlag || (this.GetChildElementValue(this.filterHiddenElements[this.filterGreenGroup[j]], searchResult.rows[i]) == "1");
                }
            }
            if(searchResult.rows[i].style.display != "none")
            {
                this.DefineSearchResultItemVisibility(searchResult.rows[i], greenElBitFlag);
            }
            
        }
    }
    
    //processing contract group 
    if(hasContractOptionsChecked)
    {
        for(var i=0; i<searchResult.rows.length; i++)
        {
            if(this.NeedToExcludeFromSearchSort(searchResult.rows[i]))
            {
                continue;
            }
            
            var contractGroupBitFlag = false;
            for(var j=0;j<this.filterContractGroup.length; j++)   
            {
                if(filterCheckBoxes[this.filterContractGroup[j]].checked)
                {
                    contractGroupBitFlag = contractGroupBitFlag || (this.GetChildElementValue(this.filterHiddenElements[this.filterContractGroup[j]], searchResult.rows[i]) == "1");
                }
            }
            if(searchResult.rows[i].style.display != "none")
            {
                this.DefineSearchResultItemVisibility(searchResult.rows[i], contractGroupBitFlag);
            }
            
        }
    }*/
    
    //whether need to show no hits message
   this.CheckNoHitsMessage(searchResult);
   
    //console.profileEnd();   
    
}

//Is used to change filter representation if there are no any search results
function SearchResultUtility_HandleNoResults()
{
     //  try to find 'no hits' message in the search result
    var noHitsMessage = document.getElementById(this.searchResultNoHitsMessage);
    
}

function SearchResultUtility_NeedToExcludeFromSearchSort(row)
{
    return row.id.indexOf(this.excludeFromSearchId) != -1 
                || row.id.indexOf(this.searchResultExpanded) != -1
                || row.id.indexOf(this.noHitsRowIdPostfix) > 0 ;
}

function SearchResultUtility_CheckNoHitsMessage(searchResult)
{
     var noResult = true;        
    var resultCounter = 0;
    
    //alert('length ' + searchResult.rows.length);
    for(var i=0; i<searchResult.rows.length; i++)
    {
        if(this.NeedToExcludeFromSearchSort(searchResult.rows[i]))
        {
            continue;
        }
        //alert('style.display ' + searchResult.rows[i].style.display);
        if(searchResult.rows[i].style.display != "none")
        {
            noResult = false;
            resultCounter++;
            //alert('noResult = false;');
        }
    }
    
    var resultPageCount = document.getElementById('searchResultCount');
    if(resultPageCount)
    {
        resultPageCount.innerHTML = resultCounter;
    }
    
    if(noResult)
    {
//        $('.extra .filter').addClass('noResults');
    }
    
    for(var i=0; i<searchResult.rows.length; i++)
    {
        if(searchResult.rows[i].id.indexOf(this.noHitsRowIdPostfix) > 0)
        {            
            searchResult.rows[i].style.display = noResult
                                                    ? ""
                                                    : "none";  
        }        
    }
}

function SearchResultUtility_ClearFilters()
{
    var filterCheckBoxes = this.GatherFilterCheckBoxes();
    if(filterCheckBoxes && filterCheckBoxes.length > 0)
    {
        for(var i =0; i < filterCheckBoxes.length; i++)
        {
            filterCheckBoxes[i].checked = false;
        }
    }
    this.Filter();
}

function SearchResultUtility_GatherFilterCheckBoxes()
{
    var choises = new Array();
    for(var i=0; i< this.filterHiddenElements.length; i++)
    {
        choises[i] = document.getElementById(this.filterChoiseIdTemplate + i);
    }    
    return choises;
}

function SearchResultUtility_DefineSearchResultItemVisibility(shortenedViewElement, visibility)
{
    shortenedViewElement.style.display = visibility
                                        ? ""
                                        : "none"; 
    if(!visibility) 
    {
        var compareCheckbox = this.GetChildElement(this.compareCheckBoxIdPostfix, false, shortenedViewElement);
        if(compareCheckbox)
        {
            compareCheckbox.checked = false;
        }        
    }
    var details = this.GetNextElement(shortenedViewElement);
    if(details)
    {
        details.style.display = visibility
                                ? ""
                                : "none"; 
    }
}

function SearchResultUtility_HasCheckedOptions(options, indexes)
{
    var hasCheckedOptions = false;
    for(var i = 0; i < indexes.length; i++)
    {
        if(options[indexes[i]] && options[indexes[i]].checked)
        {
            hasCheckedOptions = true;
            break;
        }
    }
    
    return hasCheckedOptions;
}

// handling sorting and filtering via url

//Creates url which contains filtering and sorting data from current
function SearchResultUtility_ConstructUrl()
{
    var newUrl;
    var linkNameIndex = window.location.href.indexOf('?');
    if(linkNameIndex > 0)
    {
        newUrl = window.location.href.substring(0, linkNameIndex);
    }
    else
    {
        newUrl = window.location.href;
    }
    
    newUrl += newUrl.indexOf('?') > 0
                ? '&' 
                : '?';
       
    var existingQueryParameters = $.jqURL.qs();
       
    if(existingQueryParameters && existingQueryParameters != '')
    {
        var parameters  = existingQueryParameters.split('&');
        
        for(var i = 0; i < parameters.length; i++)
        {
            var paramParted =  parameters[i].split('=');   
            
            if(paramParted[0] != this.sortTypeParameter
                && paramParted[0] != this.sortOrderParameter
                && paramParted[0] != this.filterOptionsParameter
                && paramParted[0] != this.expandedProductsParameter
                && paramParted[0] != this.expandedSectionsParameter)
            {
                newUrl += parameters[i];
                newUrl +='&';
            }
        }
        
    }
                
    newUrl += this.sortTypeParameter + '=' + this.lastSortType;
    newUrl +='&';
    newUrl += this.sortOrderParameter + '=' + this.sortOrder;
    newUrl +='&';
    newUrl += this.filterOptionsParameter + '=';
    
    var filterCheckBoxes = this.GatherFilterCheckBoxes(); 
    for(var i = 0; i< filterCheckBoxes.length; i++)
    {
        if(filterCheckBoxes[i]) {
            if(filterCheckBoxes[i].checked) {
               newUrl += filterCheckBoxes[i].id;
               newUrl += ',';
            }
        }
    }
    
    var expandedProducts = readCookie(this.expandedProductsParameter);
    if(expandedProducts)
    {
        newUrl +='&';
        newUrl += this.expandedProductsParameter + '=';
        newUrl += expandedProducts;     
    }

    var expandedSectionsValue = "";
    for (var i = 0; i < this.expandedSectionElements.length; i++)
    {
        var cookieName = this.expandedSectionElements[i][0];
        var defaulCookieValue = this.expandedSectionElements[i][1];
        var cookie = readCookie(cookieName);
        if (cookie)
        {
            expandedSectionsValue += cookie == "true" ? "1" : "0";
        }
        else
        {
            expandedSectionsValue += defaulCookieValue == "true" ? "1" : "0";
        }
    }

    if (expandedSectionsValue.length == this.expandedSectionElements.length)
    {
        newUrl += '&';
        newUrl += this.expandedSectionsParameter + '=';
        newUrl += expandedSectionsValue;
    }
    return newUrl;
}

//Does filtering and sorting by url parameters
function SearchResultUtility_ChangeSearchRepresentationByUrl()
{
    var sortTypeUrl = $.jqURL.get(this.sortTypeParameter);
    var sortOrderUrl = $.jqURL.get(this.sortOrderParameter);
    if(sortOrderUrl && sortOrderUrl != '')
    {
        this.sortOrder = !Boolean.parse(sortOrderUrl);
    }
    if(sortTypeUrl && sortTypeUrl != '')
    {
        this.lastSortType = sortTypeUrl;
        this.Sort(null, sortTypeUrl);
    }
    
    var filterOptionsUrl = $.jqURL.get(this.filterOptionsParameter);
    if(filterOptionsUrl && filterOptionsUrl != '')
    {
        var filterOptionIds = filterOptionsUrl.split(',');
        //alert(filterOptionIds);
        var filterCheckBoxes = this.GatherFilterCheckBoxes();
        
        for(var i=0; i < filterOptionIds.length; i++)
        {
            if(filterOptionIds[i] && filterOptionIds[i] != '')
            {
                //alert(filterOptionIds[i]);
                for(var j=0; j< filterCheckBoxes.length; j++)
                {
                    
                    filterCheckBoxes[j].checked = filterCheckBoxes[j].id == filterOptionIds[i]
                                                    ? true
                                                    : filterCheckBoxes[j].checked;
                }
            }
        }
        
        this.Filter();
    }
}

//Changes url in Send to a friend textarea to one that contains filtering and sorting data
function SearchResultUtility_ChangeUrls()
{
    //alert('changing');
    var inputs = document.getElementsByTagName('TEXTAREA');
    var sendToFriendMessageInputs = new Array();
    var counter = 0;
    for(var i = 0; i< inputs.length; i++)
    {
        //alert(inputs[i].id);
        if(inputs[i].id.indexOf(this.sendToFriendMessageIdPostfix) > 0)
        {
            sendToFriendMessageInputs[counter++] = inputs[i];
        }
    }
    
    //alert('message textareas: ' + sendToFriendMessageInputs.length);
    
    for(var i = 0; i< sendToFriendMessageInputs.length; i++)
    {
        //var url = this.FindUrl(sendToFriendMessageInputs[i].value);
        //alert('Found url: ' + url);
        
        var urlWithFilters = this.ConstructUrl();
        createCookie("ExtendedSearchResultUrl", urlWithFilters, 20);        
        //sendToFriendMessageInputs[i].value = sendToFriendMessageInputs[i].value.replace(url, urlWithFilters);
        
    }
}

//Finds url in send to Friend textarea
function SearchResultUtility_FindUrl(input)
{
    var linkStart = 'http://';
    var linkEnds = ['\r\n', ' ', '\n'];
    var httpIndex = input.indexOf(linkStart);
    var endIndex = 1000000;
    for(var i = 0; i< linkEnds.length; i++)
    {
        var newEndIndex = input.indexOf(linkEnds[i], httpIndex);
        if(newEndIndex > 0 && newEndIndex < endIndex)
        {   
            endIndex = input.indexOf(linkEnds[i], httpIndex);
        }
    }
    
    //alert(httpIndex);
    //alert(endIndex);
    if(endIndex > httpIndex && endIndex > 0)
    {
        return input.substring(httpIndex, endIndex);
    }
    return input;
}


function SearchResultUtility_GetUrlParameter(key)
{
    var query = window.location.href.substring(window.location.href.indexOf('?') + 1, window.location.href.length);
    if(query && query != '')
    {
        var queryParams = query.split('&');
        for(var i = 0; i < queryParams.length; i++)
        {
            var queryParamParts = queryParams[i].split('=');
            if(queryParamParts[0] == key)
            {
                return queryParamParts[1];
            }
        }
    }
    return null;   
}

// handling sorting and filtering via url end


// ------ compare products validation ------ 

//  compare products validation function
function SearchResultUtility_ValidateProductsToCompare()
{          
    //  variable to store common number of selected products
    var selectedProducts = 0;
    
    //  process 'all products' table 
    var searchResultTable = document.getElementById(this.searchResultsTableId);
    selectedProducts += this.CountSelectedProducts(searchResultTable);
              
    //  process 'default product' table
    var defaultProductTable = document.getElementById(this.defaultProductTableId);
    selectedProducts += this.CountSelectedProducts(defaultProductTable);             
    
    //  for comparison are needed at least two products
    return selectedProducts > 1;    
}



//  counts selected products in the table
function SearchResultUtility_CountSelectedProducts(searchResultsTable)
{
    //  variable to store number of selected products
    var selectedProducts = 0;
    
    //  check is product row exist
    if(searchResultsTable)
    {
        //  go through cells in this product row               
        for(var i = 0; i < searchResultsTable.rows.length; i ++)
        {            
            //  cell with compareCheckbox css class should contain checkbox
            if(searchResultsTable.rows[i].id.indexOf(this.priceLineBriefInfoRow) != -1)
            {
                //  check is thie product selected                
                if(this.IsProductSelected(searchResultsTable.rows[i]))
                {
                    //  increase selected products number
                    selectedProducts += 1;
                }
            }
        }               
    }
       
    return selectedProducts;
}



//  finds checkbox for a product
function SearchResultUtility_IsProductSelected(productRow)
{            
    //  check is product row exist
    if(productRow)
    {        
        //  go through cells in this product row               
        for(var i = 0; i < productRow.cells.length; i ++)
        {            
            //  cell with compareCheckbox css class should contain checkbox
            if(productRow.cells[i].className == "compareCheckbox")            
            {                                                                                                
                //  find span
                for(var j = 0; j < productRow.cells[i].childNodes.length; j++)
                {
                    if(productRow.cells[i].childNodes[j].className == "chkBox")
                    {
                        //                          tr         td            span          input
                        var selectProductCheckBox = productRow.cells[i].childNodes[j].childNodes[0];   
                        return selectProductCheckBox.checked;
                    }
                }
            }
        }        
    }    
    
    //  unable to get result
    return false;
}

function SearchResultUtility_ExpandProductSectionByUrlOrCookies()
{
    var expandSectionsFromUrl = $.jqURL.get(this.expandedSectionsParameter);
    for (var i = 0; i < this.expandedSectionElements.length; i++)
    {
        var cookieName = this.expandedSectionElements[i][0];
        var cokieValue = this.expandedSectionElements[i][1];
        var cookie = readCookie(cookieName);
        if (!cookie)
        {
            createCookie(cookieName, cokieValue, 20);
        }

        if (expandSectionsFromUrl)
        {
            var sectionInfo = expandSectionsFromUrl.substring(i, i + 1);
            if (sectionInfo)
            {
                var value = sectionInfo == "1" ? true : false;
                createCookie(cookieName, value, 20);
            }
        }
    }
}

// ------ end compare products validation ------ 
var searchUtility = new SearchResultUtility();

//base.js
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
var dictionaries = {};

dictionaries.amount = 0;//amount of opened boxes
dictionaries.leftDefault = 0.4;//default position in percents (X)
dictionaries.topDefault = 0.2;//default position in percents (Y)

var comparePage = {};
comparePage.products = 0;//amount of comparing products
comparePage.isNavigation = false;//state of navigation (active/non active)
comparePage.productsPerPage = 4;//products per page
comparePage.cellWidth = 195;

var frontpage = {};
frontpage.privateString = 'privateClient';
frontpage.corporateString = 'corporate';

var greenChildAmount;

var moreDetailsTitle = "Flere detaljer";
var lessDetailsTitle = "Luk detaljer";
var electricityConsumptionUtility;

if (typeof (ElectricityConsumptionUtility) != 'undefined')
{
    electricityConsumptionUtility = new ElectricityConsumptionUtility()
}

$(function() {

    if (electricityConsumptionUtility) {
        electricityConsumptionUtility.initialize();
    }

    //to close confirmation window on create user page
    $('.createNewUser .warning a.closeLink').click(function() {
        $('.createNewUser .warning').hide();
    });

    if ($.browser.msie && $.browser.version < 7) {
        $('td.icons img').attr('src', '/gfx/danskenergi/blank.gif');
    }
    $('td.icons img').css('visibility', 'visible');

    if ($('.compare').length) {
        setComparePage();
    }

    $('.searchResults table td.supplierLogo').click(function() {
        emulateDetailsLinkClick($(this));
    });
    $('.searchResults table td.productName').click(function() {
        emulateDetailsLinkClick($(this));
    });
    $('.searchResults table td.icons').click(function() {
        emulateDetailsLinkClick($(this));
    });
    $('.searchResults table td.period').click(function() {
        emulateDetailsLinkClick($(this));
    });
    $('.searchResults table td.price').click(function() {
        emulateDetailsLinkClick($(this));
    });
    $('.searchResults table td.subscription').click(function() {
        emulateDetailsLinkClick($(this));
    });


    //add corners to the blocks
    $('.box').each(function() {
        $(this).prepend('<div class="leftTop"></div><div class="rightTop"></div>');
        $(this).append('<div class="leftBottom"></div><div class="rightBottom"></div>');
    });

    //added corners for main menu
    $('#header .topNav ul li.current').each(function() {
        $(this).prepend('<span class="leftBorder"></span>');
        $(this).append('<span class="rightBorder"></span>');
    });

    //highlight selected power consumption on the frontpage
    $('.powerConsumption input:checked').each(function() {
        $(this).parent().parent().addClass('selected');
    });

    //make IE label effect for image
    $('.powerConsumption .field label img').click(function() {
        $('#content .powerConsumption label').removeClass('selected');
        $(this).parent().addClass('selected');
        $(this).parent().click();
    });
    $('.powerConsumption .field label').click(function() {
        $('#content .powerConsumption label').removeClass('selected');
        $(this).addClass('selected');
        if (!$(this).parent().hasClass('otherPower')) {
            $('.otherPowerError').hide();
            $('.otherPower input').removeClass('error');
            $('.otherPower input').attr('value', '');
        }
    })


    //make logic to other power field on the frontpage	
    $('label.otherPower input').focus(function() {
        $('#content .powerConsumption label').removeClass('selected');
        $('.powerConsumption .field.otherpower label input').click();
        $('#content .powerConsumption .field.otherpower label').addClass('selected');
    });
    $('.powerConsumption .field.otherpower label').click(function() {
        $('#content .powerConsumption label').removeClass('selected');
        $('label.otherPower input').focus();
        $('#content .powerConsumption .field.otherpower label').addClass('selected');
    });

    // popup window "Send a friend"
    $('a.showFormSendToFriend').click(function() {
        var link = $(this);
        var frame = $('.popupFrame');
        var shadow = $('.popupShadow');
        var formSentToFriend = $('.formSentToFriend');
        var btnClose = $('.btnClose');

        formSentToFriend.show();
        frame.show();
        shadow.show();

        //get width and height of form
        var w = formSentToFriend.width();
        var h = formSentToFriend.height();

        //move form to the center of window
        formSentToFriend.css({
            width: w,
            marginLeft: -w / 2,
            height: h,
            marginTop: -h / 2
        });

        if ($.browser.msie && ($.browser.version < 7)) {
            formSentToFriend.css('margin-left', '0');
        }

        formSentToFriend.addClass('popupCanvas');

        // add event to close form
        function closeit() {
            formSentToFriend.css("display", "none");
            shadow.css("display", "none");
            frame.css("display", "none");
        }

        shadow.click(function() { closeit() });
        btnClose.click(function() { closeit() });

        $(document).keydown(function(e) {
            if (e.which == 27) closeit();
        });
        searchUtility.ChangeUrls();
    });


    //emulate click event for the label when clicked on icons (IE fix)
    $('.extra .filter .filterBox .field img').click(function() {
        $(this).parent().click();
        greenBoxAction();
    });
    //if checked Green checkbox - expand additional checkboxes
    if ($('.chkBox.green').is(':checked')) {
        $('.extraServices').css('display', 'block');
    }
    //if checked Green checkbox is clicked - toggle additional checkboxes
    $('.chkBox.green').click(function() {
        greenBoxAction();
    });

    //if clicked checkbox into extra services list (Filter block)
    $('ul.extraServices input.chkBox').click(function() {
        if ($(this).is(':checked')) {
            greenChildAmount++;
        }
        else {
            greenChildAmount--;
        }
        if (!greenChildAmount) {
            $('.chkBox.green').attr('checked', false);
        }
        else {
            $('.chkBox.green').attr('checked', true);
        }
        searchUtility.Filter();
    });


    //close dictionary
    $('.dictionaryBg').click(function() {
        closeDictionaryLayer();
    });


    //add user name to "Send a Friend" form
    $('.formSentToFriend input.receiverName').keyup(function() {
        message = $('.formSentToFriend textarea.yourMessage').val();
        mas = message.split('\n');
        firstRow = 'Hej ' + $(this).val() + ',';
        mas[0] = firstRow;
        message = '';
        for (i = 0; i < mas.length - 1; i++) {
            message += mas[i] + '\n';
        }
        message += mas[mas.length - 1];
        $('.formSentToFriend textarea.yourMessage').val(message);
    });
    //add user friend's name to "Send a Friend" form
    $('.formSentToFriend input.yourName').keyup(function() {
        message = $('.formSentToFriend textarea.yourMessage').val();
        mas = message.split('\n');
        lastRow = $(this).val();
        mas[mas.length - 1] = lastRow;
        message = '';
        for (i = 0; i < mas.length - 1; i++) {
            message += mas[i] + '\n';
        }
        message += mas[mas.length - 1];
        $('.formSentToFriend textarea.yourMessage').val(message);
    });

    //expand more details block on the compare page
    $('.compare table td a.details').click(function() {
        if ($(this).hasClass('netTaxes')) {
            recalculateComparePage('netTaxes');
        }
        else {
            if ($(this).hasClass('paymentsForNetcompany')) {
                recalculateComparePage('paymentsForNetcompany');
            }
            else {
                recalculateComparePage('paymentToSupplier');
            }
        }
    });

    //compare page navigation
    $('.navButtonsComparePage a').click(function() {
        if (!comparePage.isNavigation) {
            return false;
        }
        compareTable = $('.compare .compareContainer table');

        prevPos = $(compareTable).css('left');
        if (prevPos == 'auto') {
            prevPos = 0 + 'px';
        }
        prevPos = prevPos.slice(0, -2);
        if (prevPos % comparePage.cellWidth) {
            return;
        }
        if ($(this).hasClass('next')) {
            nextPos = prevPos - comparePage.cellWidth;
            if (nextPos > -($(compareTable).width() - 700)) {
                $(compareTable).animate({ left: nextPos }, 500);
            }
        }
        else {
            nextPos = parseInt(prevPos) + comparePage.cellWidth;
            if (nextPos < 10) {
                $(compareTable).animate({ left: nextPos }, 500);
            }
        }
        if ((nextPos - comparePage.cellWidth) <= -($(compareTable).width() - 700)) {
            $('.compareContainer').css('border-right-width', '1px');
            $('.navButtonsComparePage a.next').addClass('noMore');
        }
        else {
            $('.compareContainer').css('border-right-width', '0');
            $('.navButtonsComparePage a.next').removeClass('noMore');
        }
        if ((nextPos + comparePage.cellWidth) > 10) {
            $('.navButtonsComparePage a.prev').addClass('noMore');
        }
        else {
            $('.navButtonsComparePage a.prev').removeClass('noMore');
        }
    });

    if ($('.yourElectricity').length) {

        if ($('.whoAreYou input:checked').length) {
            frontpagePanelUpdate('.whoAreYou input:checked', true);
        }
        else {
            frontpagePanelUpdate($('.whoAreYou input:first-child'), true);
        }

        $('.whoAreYou label').click(function() {
            $(this).prev().focus();
        })

        $('.whoAreYou input').focus(function() {
            if (!$(this).is(':checked')) {
                $('.yourElectricity').hide();
                frontpagePanelUpdate(this, false);
            }
        })
    }

});

function frontpagePanelUpdate(input, first) {
    if ($(input).parent().parent().hasClass(frontpage.privateString)) {
        $('#' + frontpage.privateString).show();
        if (!first) {
            electricityConsumptionUtility.corporateConsumption = electricityConsumptionUtility.GetConsumptionData();
            electricityConsumptionUtility.LoadConsumption(electricityConsumptionUtility.privateConsumption);
        }
    }
    else {
        $('#' + frontpage.corporateString).show();
        if (!first) {
            electricityConsumptionUtility.privateConsumption = electricityConsumptionUtility.GetConsumptionData();
            electricityConsumptionUtility.LoadConsumption(electricityConsumptionUtility.corporateConsumption);
        }
    }

}

/* print defined product info */
function printProduct(printLink)
{
	productDesc = $(printLink).parents('.moreInfo').html();
	productTitle = $(printLink).parents('td.expand').parent().prev('tr').html();
	$('body').addClass('printSelected');
	$('body').append('<div class="printSelection"><div class="searchResults"><table><tr>' + productTitle + '</tr><tr><td class="expand" colspan="100"><div class="moreInfo">' + productDesc + '</td></tr></table></div></div>');
	window.print();
	
	window.setTimeout(pageCleaner, 1000);
	
	return false;
}
function pageCleaner()
{
	$('body').removeClass('printSelected');
	$('.printSelection').remove();
}
/* print defined product info */


//show dictionary box with ID = idDicBox
function showDictionaryBox(idDicBox, evt) {
    if(evt.pageX) {
        clickedPosX = evt.pageX;
        clickedPosY = evt.pageY;
    }
    else {
        clickedPosX = evt.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
        clickedPosY = evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    }
	showDictionaryLayer();
	$('#'+idDicBox).css('display', 'block');

    if ($.browser.msie) {
        differenceY = document.documentElement.scrollTop;
    }
    else {
        differenceY = window.scrollY;    
    }
    blockHeight = $('#' + idDicBox)[0].scrollHeight;
    blockWidth = $('#' + idDicBox)[0].scrollWidth;

    //if clicked link placed at the left part of browser
    if(clickedPosX < $(window).width()/2) {
        arrowPosX = 'left';
        boxPosX = clickedPosX - 50;
    }
    //if clicked link placed at the right part of browser
    else {
        arrowPosX = 'right';
        boxPosX = clickedPosX - blockWidth + 50;
    }
    
    boxPosY = clickedPosY - blockHeight - 40;
    arrowPosY = "Bottom";
    if(boxPosY < differenceY) {
        boxPosY = clickedPosY + 40;
        arrowPosY = "Top";
    }

    $('#'+idDicBox).children('.triangle').attr('class', 'triangle');
    $('#'+idDicBox).children('.triangle').addClass('triangle ' + arrowPosX + arrowPosY);
	$('#'+idDicBox).css('top', boxPosY + 'px');
	$('#'+idDicBox).css('left', boxPosX + 'px');

 	dictionaries.amount++;	
	//set level of layout
	$('#'+idDicBox).css('z-index', parseInt($('#'+idDicBox).css('z-index')) + dictionaries.amount);	
}

//close layer with current dictionary boxes
function closeDictionaryLayer() {
	dictionaries.amount = 0;
	$('.dictionaryLayer').children('.boxDictionary').css('display','none');	
	$('.dictionaryLayer').css('display', 'none');
	$('.dictionaryBg').css('display', 'none');
	if ($.browser.msie && ($.browser.version < 7)) {
		$('body').removeClass('bgFixed');
	}	
}

//show layer with current dictionary boxes
function showDictionaryLayer() {
    $('.dictionaryLayer').height($('body').height());

	$('.dictionaryLayer').css('display', 'block');
	$('.dictionaryBg').css('display', 'block');
}

//close current dictionary box
function closeCurrentBox(current) {
	dictionaries.amount--;
	$(current).parents('.boxDictionary').css('display', 'none');
	if(!dictionaries.amount) {
		closeDictionaryLayer();
	}
}

//show additional info on the search results page
function showAddInfo(link, cookieName) 
{
	$current = $(link).parent().parent();
	$next = $(link).parent().parent().next('tr');	
		
	toggleLinkState(cookieName, 20);
	
	if($current.hasClass('last') || $current.hasClass('lastFlag')) 
	{	    	    
		if ($current.hasClass('last')) {
			$current.removeClass('last');
			$current.addClass('lastFlag');
		}
		else 
		{
			$current.removeClass('lastFlag');
			$current.addClass('last');
		}					
	}	
	
	$next.children().children().toggle('fast', function(){
        if($next.children().children('.moreInfo2Level').css('display') == 'none') {
            $(link).text(moreDetailsTitle);
        }
        else {
            $(link).text(lessDetailsTitle);
        }  		
	});

}

//initialization of datepicker
function initDatepicker() {
    $('input.datepicker').datepicker($.extend($.datepicker.regional['ru'], { dateFormat: "dd-mm-yy"}, {onSelect: function() {}}));	
}

//check if number
function isNumberKey(evt) {
     var charCode = (evt.which) ? evt.which : evt.keyCode;
     if (charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false;
     }
     return true;
}

function toggleLinkState(cookieName, minutes)
{
    //  read cookie value
	var currentValue = readCookie(cookieName);
	if (currentValue)
	{
	    if (currentValue == "true") {
	        currentValue = "false";
	    }
	    else {
	        currentValue = "true";
	    }
	    //  save expanded state to cookie
	    createCookie(cookieName, currentValue, minutes);
	}
}

//create browser cookies
function createCookie(name, value, minutes) 
{
    if (minutes) {
		var date = new Date();
		date.setTime(date.getTime()+(minutes * 60 * 1000));
		var expires = "; expires=" + date.toGMTString();
	}
	else {
	    var expires = "";
	}
	document.cookie = name + "=" + value+expires + "; path=/";
}

//read browser cookies
function readCookie(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;
}

//expand more details block on the search page
function expandAddInfo(link, cookieName) {
    $(link).next('.expand').toggle('fast');
    $(link).hide();

    toggleLinkState(cookieName, 20);
}

//contract more details block on the search page
function contractAddInfo(link, cookieName) {
    $(link).parent().toggle('fast');
	$(link).parent().prev('a.expandLink').show();

	toggleLinkState(cookieName, 20);
}

//show/hide more details block on the search page (Level 2)
function showDetailsLevel2(link, currentClass, cookieName) {
    switch(currentClass) {
        case 'netTaxesHeader':
            tmp = $(link).parents('.moreInfo2Level');
            tmp.find('.netTaxes').toggle();
            if(tmp.find('.netTaxes').css('display') == 'none') {
                $(link).text(moreDetailsTitle);
            }
            else {
                $(link).text(lessDetailsTitle);
            }
            break;
        case 'paymentToSupplierHeader':
            tmp = $(link).parents('.moreInfo2Level');
            tmp.find('.paymentToSupplier').toggle();
            if(tmp.find('.paymentToSupplier').css('display') == 'none') {
                $(link).text(moreDetailsTitle);
            }
            else {
                $(link).text(lessDetailsTitle);
            }            
            break;
        case 'taxesHeader':
            tmp = $(link).parents('.moreInfo2Level');
            tmp.find('.taxes').toggle();
            if(tmp.find('.taxes').css('display') == 'none') {
                $(link).text(moreDetailsTitle);
            }
            else {
                $(link).text(lessDetailsTitle);
            }              
            break;
    }

    toggleLinkState(cookieName, 20);
}

//set height of each row for float titles block on the compare page
function setComparePage() {

    var K = 10;

    $('#content').css('padding-left','0');
    $('.floatTitlesBlock ul li').each(function(){
        titleClassName = $(this).attr('class').split(' ').slice(-1) + '';
        cellClassName = titleClassName.slice(0, -6);
        neededHeight = $('tr.' +  cellClassName + ' td').height();
        
        if(!$(this).hasClass('separatorHeader'))
        {
        
            if($(this).hasClass('companyNameLogoHeader')) {
                $('li.'+ titleClassName).css('height', (135/K).toFixed(0) + 'em');
                $('tr.' +  cellClassName + ' td').css('height', (135/K).toFixed(0) + 'em');
            }
            else {
                $('li.'+ titleClassName).css('height', (neededHeight/K).toFixed(0) + 'em');
                $('tr.'+ cellClassName + ' td').css('height', (neededHeight/K).toFixed(0) + 'em');
            }
            
            //set minimal height of block (because css doesnt work for dynamically height)
            if( cellClassName == 'paymentsSelfUnloadingTitle' ||
                cellClassName == 'paymentsSupplierBindingPeriodTitle' ||
                cellClassName == 'paymentsProductBindingPeriod' ||
                cellClassName == 'paymentsNonPaymentTitle' ||
                cellClassName == 'leaveContractPossibility' ||
                cellClassName == 'leaveContractExpiredSituation' ||
                cellClassName == 'paymentIncludedInContract' ||
                cellClassName == 'deposit' ||
                cellClassName == 'paymentsNonPaymentTitle' ||
                cellClassName == 'paymentsSelfUnloadingTitle' ||
                cellClassName == 'paymentsMovingToNewAddressTitle' ||
                cellClassName == 'paymentsMovingToNewAddressTitle' ||
                cellClassName == 'paymentsSupplierBindingPeriodTitle' ||
                cellClassName == 'paymentsProductBindingPeriod' ||
                cellClassName == 'contractConditionsTitle2' ||
                cellClassName == 'paymentConditionsTitle' ||
                cellClassName == 'paymentFixedSubscriptionsTitle' ||
                cellClassName == 'paymentsTriggeredFeesTitle' ||
                cellClassName == 'netTaxes')
               {
                    if($('tr.' +  cellClassName + ' td').height() < 60)
                    {
                        $('li.'+ titleClassName).css('height', (60/K).toFixed(0) + 'em');
                        $('tr.' +  cellClassName + ' td').css('height', (60/K).toFixed(0) + 'em');
                    }
               }
        }
        
        
    });

        
    comparePage.products = $('tr.companyNameLogo td').length;
    if(comparePage.products <= comparePage.productsPerPage) {
        comparePage.isNavigation = false;
        $('.compareContainer table tr.separator td').attr('colspan', '4');
        $('.compareContainer').css('border-right-width', '1px');
        $('.navButtonsComparePage a.next').addClass('noMore');
        $('.navButtonsComparePage a.prev').addClass('noMore');
    }
    else {
        comparePage.isNavigation = true;
    }
    
    $('.compare .loadingIcon ').css('display','none');
    if($.browser.msie && $.browser.version < 7) {
        $('.floatTitlesBlock').css('left', '-131px');
    }
    else {
        $('.floatTitlesBlock').css('left', '0');
    }
    $('.compare .compareContainer').css('position', 'relative');
    $('.compare .compareContainer').css('left', '0');
    

}

//recalculate height of hidden fields when they become visible
function recalculateComparePage(sign) {

    var K = 10;

    $('tr.' + sign + '.collapsed').toggle();
    $('li.' + sign).toggle();

    $('li.' + sign + '.collapsed').each(function(){
        titleClassName = $(this).attr('class').split(' ').slice(-1) + '';
        cellClassName = titleClassName.slice(0, -6);
        neededHeight = $('tr.' +  cellClassName + ' td').height();
        
        $('li.'+ titleClassName).css('height',(neededHeight/K).toFixed(0) + 'em');
        $('tr.'+ cellClassName + ' td').css('height',(neededHeight/K).toFixed(0) + 'em');
        if( cellClassName == 'localNet' ||
            cellClassName == 'commonNet' ||
            cellClassName == 'paymentsForGoverment') {
                if($('tr.' +  cellClassName + ' td').height() < 60) {
                    $('li.'+ titleClassName).css('height', (60/K).toFixed(0) + 'em');
                    $('tr.' +  cellClassName + ' td').css('height', (60/K).toFixed(0) +  'em'); 
                }
           }                
    });
        
    
    if($('li.' + sign).css('display') == 'none') {
        $('.compare table td a.' + sign).text(moreDetailsTitle);
    }
    else {
        $('.compare table td a.' + sign).text(lessDetailsTitle);
    }
   
}


//redirect to link address
function linkRedirect(link) {
    window.location = link;
}

function customConfirmBox() {
//    $('.thickbox').click();
//    alert('init');
}

//emulate details link click on the Search results page
function emulateDetailsLinkClick(val) {
    $(val).parent().find('a.showSPAddInfo').click();
}

//call of Send to friend form
function callSendToFriendForm(title, bottomFormText, subject) {
    $('a.showFormSendToFriend').click();
    setFormSendToFriend(title, bottomFormText, subject);
}

//set text into form send to friend
function setFormSendToFriend(title, bottomFormText, subject) {
    $('.formSentToFriend h2.title').text(title);
    $('.formSentToFriend input.subjectHiddenInput').attr('value', subject);
    $('.formSentToFriend span.bottomFormText').text(bottomFormText);
}

function greenBoxAction() {
    greenChildAmount = 6;

	if($('.chkBox.green').is(':checked')){
	    $('.extraServices').show();            		
        $('.extraServices').find('input').attr('checked', true);  
	}
	else {
	    $('.extraServices').hide();
	    $('.extraServices').find('input').attr('checked', false);  
	}
	searchUtility.Filter();
}

//fix for IE <= 7 when clicked on the image (company list on the frontpage)
function emulateChoose(spanHandler)
{
    if($.browser.msie && $.browser.version < 8)
    {
        url = $(spanHandler).parent().attr('id');
        __doPostBack(url.replace(/_/g,"$"),'');
    }
}

function Trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
}

////////////////////////////////////////////////////////////////////////////////////////////////////
//validation.functions.js
////////////////////////////////////////////////////////////////////////////////////////////////////

var numberRegex = '^[0-9]+$';
var priceRegex = '^[0-9]{1,14},?([0-9]{0,3})$';
var daDkDateRegex = '^(0[1-9]|[12][0-9]|3[01])[-](0[1-9]|1[012])[-](19|20)[0-9]{2}$';
var phoneNumber = '^[+]{0,1}[- 0-9\\)\\(]{6,50}$';
var mailRegex = '^.*@.{1,}\..{1,}$';
var urlRegex = '^http://';
var allowedMaxUsage = 100000;
var allowedProductDescriptionLength = 300;

function ValidateDate(source, value)
{
    if (matches = value.Value.match(/^(\d{2,2})-(\d{2,2})-(\d{4,4})$/)) 
    {
        var date = new Date(matches[3], matches[2] - 1, matches[1]);
        if(parseInt(matches[3], 10) != date.getFullYear() 
            || parseInt(matches[2], 10) != (date.getMonth() + 1))
        {
            value.IsValid = false;
            return false;
        }
    }
   return ValidateWithRegex(source, value, daDkDateRegex);
}

function ValidatePrice(source, value)
{
   return ValidateWithRegex(source, value, priceRegex);     
}

function ValidateNumber(source, value)
{
    return ValidateWithRegex(source, value, numberRegex);
}

function ValidateMailAddress(source, value)
{
    return ValidateWithRegex(source, value, mailRegex);
}

function ValidatePhoneNumber(source, value) 
{
    return ValidateWithRegex(source, value, phoneNumber);
}

function ValidateUrl(source, value)
{
    return ValidateWithRegex(source, value, urlRegex);
}

function ValidateElectricityUsage(source, value)
{
    if(value.Value && value.Value.length > 0)
    {
        value.IsValid = parseInt(value.Value) <= allowedMaxUsage;
        return value.IsValid;
    }
    value.IsValid = false;
}

function ValidateProductDescription(source, value)
{
    if(value.Value && value.Value.length > allowedProductDescriptionLength)
    {
        value.IsValid = false;
        return false;
    }
    value.IsValid = true;
    return true;
}

function ValidateWithRegex(source, value, regex) {
    var control = document.getElementById(source.controltovalidate);
    if(value.Value && value.Value.match(regex))
    {
        value.IsValid = true;
        return true;
    }
    value.IsValid = false;
    return false;
}

function GetNextElement(element) 
{
    var n = element;
    do n = n.nextSibling;
    while (n && n.nodeType != 1);
    return n;
}

//common.functions.js
////////////////////////////////////////////////////////////////////////////////////////////////////////
function ShowDeactivationAlert(productName)
{
    var deactivationContainer = document.getElementById('deactivationAlert');
    deactivationContainer.innerHTML = deactivationContainer.innerHTML.replace('##productname##', productName);
    deactivationContainer.style.display = "block";
}

function ShowMessageOnUserDelete(userName, alertMessage)
{
    alertMessage = alertMessage.replace('##username##', userName);
    return confirm(alertMessage);
}


function ShowMessageOnCompanyDeactivation(companyType, companyName, alertMessage) {
    alertMessage = alertMessage.replace('##companyType##', companyType);
    alertMessage = alertMessage.replace('##companyName##', companyName);
    return confirm(alertMessage);
}

function CompareDatesInStringRepresentation(dateValue1, dateValue2)
{
    var date1;
    var date2;
    
    if(dateValue1Matches = dateValue1.value.match(/^(\d{2,2})-(\d{2,2})-(\d{4,4})$/))
    {
        date1 = new Date(dateValue1Matches[3], dateValue1Matches[2], dateValue1Matches[1]);
    }
    
    if(dateValue2Matches = dateValue2.value.match(/^(\d{2,2})-(\d{2,2})-(\d{4,4})$/))
    {
        date2 = new Date(dateValue2Matches[3], dateValue2Matches[2], dateValue2Matches[1]);
    }
    
    if(date1 && date2)
    {
        if(date1 < date2)
        {
            return -1;
        }
        else if(date1 > date2)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    else
    {
        throw new Error("Wrong date format");
    }
}

function AddOnLoadEventHandler(handler)
{
    var oldonload = window.onload;
    if (typeof window.onload != 'function') 
    {
        window.onload = handler;
    } 
    else 
    {
        window.onload = function() 
        {
            if (oldonload) 
            {
                oldonload();
            }
            handler();
        }
    }
}

/*
// sorting of Search results
function quickSort(link, column)
{
//    console.profile();
    if($(link).parent().hasClass('sorted'))
    {
        dynSearchResult.sortDirection = !dynSearchResult.sortDirection;
    }
    else {
        dynSearchResult.sortDirection = true;
    }

    $(link).parent().parent().children('th').attr('class', '');    
    

	f_compare = function(a, b) {
	    a = parseFloat(a);
	    b = parseFloat(b);
	    if(dynSearchResult.sortDirection) {
	        return ((a == b) ? 0 : ((a < b) ? 1 : -1));
	    }
	    else {
	        return ((a == b) ? 0 : ((a > b) ? 1 : -1));
	    }
	    
	};
	f_change = function(i, j) {
	    var c = dynSearchResult.resTable[i];
	    dynSearchResult.resTable[i] = dynSearchResult.resTable[j];
	    dynSearchResult.resTable[j] = c;
	};
 
	var qs = function (l, r)  {
	
		var i = l, 
			j = r,
			x = dynSearchResult.resTable[Math.floor(Math.random()*(r-l+1))+l][column];
 
		while(i <= j) {
			while(f_compare(dynSearchResult.resTable[i][column], x) == -1) {i++;}
			while(f_compare(dynSearchResult.resTable[j][column], x) == 1) {j--;}
			if(i <= j) {f_change(i++, j--);}
		};
		if(l < j) {qs(l, j);}
		if(i < r) {qs(i, r);}
	};
	
    qs(0, dynSearchResult.resTableSize - 1);		

    swapRows();    
    
    $(link).parent().addClass('sorted');
    if(dynSearchResult.sortDirection) {
        $(link).parent().addClass('asc');
    }
    else {
        $(link).parent().addClass('desc');
    }
    
//    console.profileEnd();
}

function swapRows()
{
    var tempSearchResults = [];
    $('table#SearchResultsTable tr[id*="' + dynSearchResult.resultRowClassName + '"]').each(function(){
        tempSearchResults[$(this).attr('id')] = $(this).html();
    });
    
    i = 0;
    $('table#SearchResultsTable tr[id*="' + dynSearchResult.resultRowClassName + '"][id$="' + dynSearchResult.infoClassName + '"]').each(function(){
        prefixClassName = dynSearchResult.resTable[i++][4];
        $(this).attr('id', prefixClassName + '_' +dynSearchResult.infoClassName);
        $(this).next().attr('id', prefixClassName + '_' + dynSearchResult.addInfoClassName);
        $(this).html(tempSearchResults[prefixClassName + '_' + dynSearchResult.infoClassName]);
        $(this).next().html(tempSearchResults[prefixClassName + '_' +dynSearchResult.addInfoClassName]);
    });    
}

function initSearchResultsTable()
{
    i = 0;
    $('table#SearchResultsTable tr[id*="' + dynSearchResult.resultRowClassName + '"][id$="' + dynSearchResult.infoClassName + '"]').each(function(){
        dynSearchResult.resTable[i] = Array();
        dynSearchResult.resTable[i][0] = $(this).find('td div[id$="uiLengthOfContract"]').text();
        dynSearchResult.resTable[i][1] = $(this).find('td div[id$="uiKwhPrice"]').text();
        dynSearchResult.resTable[i][2] = $(this).find('td div[id$="uiSubscriptionPrice"]').text();
        dynSearchResult.resTable[i][3] = $(this).find('td div[id$="uiSummarizedPrice"]').text();
        dynSearchResult.resTable[i++][4] = $(this).attr('id').substring(0, $(this).attr('id').lastIndexOf('_'));
     });
    dynSearchResult.resTableSize = dynSearchResult.resTable.length;
    console.log(dynSearchResult.resTableSize);
    quickSort($('table#SearchResultsTable tr th.sorted a'), 3);
}
*/
