Singles = {
    version:    '1.0',
    copyright:  'Copyright (C) Datech Limited, 2007',
    author:     'RaR',
    notifierVersion:  '1.123',
	iconSet: 'singles',
	iconColorScheme: "orange",
    myCrowdVersion:  '1'
};
function include(src) {
document.write('<script src="'+src+'" type="text/javascript"></script>');
}

//Override some Notifier properties
include('/scripts/notifierConfig.js');


//-------------------------------------------------------------------------------------------------------
Singles.Lib = {
    onLoadHandlers: [],
	loaded:	false,

    onLoad:     function(handler) {
        if(typeof handler == 'function') this.onLoadHandlers.push(handler);
		
    },

    run:    function() {
		if(!Singles.Lib.loaded) {
        	for(var i=0; i<Singles.Lib.onLoadHandlers.length; i++) Singles.Lib.onLoadHandlers[i]();
			Singles.Lib.loaded = true;
		}
    }
};

if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", Singles.Lib.run, false);
}
else {
	window.onload = Singles.Lib.run;
}

if (/WebKit/i.test(navigator.userAgent)) { // for Safari
    var _timer = setInterval(function() {
	if (/loaded|complete/.test(document.readyState)) {
	    clearInterval(_timer);
	    Singles.Lib.run();
	}
    }, 10);
}

//Event.observe(window, 'load', function() { Singles.Lib.run(); }, true);
//-------------------------------------------------------------------------------------------------------
Singles.Listbox = {
    init: function() {
        var list = document.getElementsByTagName('SELECT');
        for(var i=0; i<list.length; i++) {
            for(property in Singles.Listbox) list[i][property] = Singles.Listbox[property];
        }
    },

    clear: function(empty, emptyText, emptyValue) {
        this.options.length = 0;
        if(empty == true) {
            this.options[0]         = new Option();
            this.options[0].value   = (emptyValue != null)?emptyValue:0;
            this.options[0].text    =  emptyText;
        }
    },

    selectAll: function() {
        if(this.multiple == true) {
            var count = this.options.length;
            for(var i=0; i<count; i++) this.options[i].selected = true;
        }
    },

    unselectAll: function() {
        if(this.multiple == true) {
            var count = this.options.length;
            for(var i=0; i<count; i++) this.options[i].selected = false;
        }
    },

    inverseSelection: function() {
        if(this.multiple == true) {
            var count = this.options.length;
            for(var i=0; i<count; i++) this.options[i].selected = !this.options[i].selected ;
        }
    },

    addItem: function (value, text) {
        var index = this.options.length;
        this.options[index]         = new Option();
        this.options[index].value   = value;
        this.options[index].text    = text;

        return this.options[index];
    },

    changeItem: function selectboxChangeItem(id, value, text) {
        this.options[id].value  = value;
        this.options[id].text   = text;
        return this.options[id];
    },

    attachData: function(data) {
        if(typeof(data) != "object") return;

        for(var i=0; i<data.length; i++) this.addItem(data[i][0], data[i][1]);
    },

    attachObjects: function (objects, valueAttribute, textAttribute, additional) {
        if(typeof(objects) != "object") return;

	
      for(var i=0; i<objects.length; i++) {
            if(objects[i][valueAttribute] != null && objects[i][textAttribute] != null) option = this.addItem(objects[i][valueAttribute], objects[i][textAttribute]);
            if(additional != null)
                for(var j=0; j<additional.length; j++) {
					
					if(j <= 2) {
					}
                    if(objects[i][additional[j]] != null) option.setAttribute(additional[j], objects[i][additional[j]]);
                }
        }
    },

    getValue: function(defaultValue) {
        if(this.selectedIndex != -1 && this.options[this.selectedIndex] != null) return this.options[this.selectedIndex].value;
        else return defaultValue;
    },

    getText: function (defaultValue) {
        if(this.selectedIndex != -1 && this.options[this.selectedIndex] != null) return this.options[this.selectedIndex].text;
        else return defaultValue;
    },

    getValuesAsArray: function() {
        var result = new Array();

        for(var i=0; i<this.options.length; i++) {
            if(this.options[i].selected == true) result[result.length] = this.options[i].value;
        }

        return result;
    },

    setValue: function(index, multiply) {
        var count = this.options.length;
        for(var i=0; i<count; i++) {
            if(this.options[i].value == index) {
                this.options[i].selected = true;
                if(multiply != true) break;
            }
        }
    },

    getOptionByValue: function(index) {
        var count = this.options.length;
        for(var i=0; i<count; i++) {
            if(this.options[i].value == index) return this.options[i];
        }
        return new Option();
    },

    getSelectedOption: function () {
        if(this.selectedIndex != -1 && this.options[this.selectedIndex] != null) return this.options[this.selectedIndex];
        else new Option();
    },

    getSelectedCount: function () {
        var selected = 0;
        var count = this.options.length;
        for(var i=0; i<count; i++) {
            if(this.options[i].selected) selected++;
        }
        return selected;
    },

    removeOptionByValue: function(index) {
        for(var i=0; i<this.options.length; i++) {
            if(this.options[i].value == index) this.options[i] = null;
        }
    }
};

Singles.Lib.onLoad(function() { Singles.Listbox.init() });
//-------------------------------------------------------------------------------------------------------
Singles.Errors = {
    errorsList: [],

    setup:  function() {
        var ul = $('errorGlobalList');
        if(ul) {
            for(var i=0; i<ul.childNodes.length; i++) {
                var child = ul.childNodes.item(i);
                if( child.nodeType == 1 &&
                    child.tagName == 'LI' &&
                    child.getAttribute('forfield') != '' &&
                    (field = $(child.getAttribute('forfield')))
                ) {
                    if(child.firstChild)    var msgText = child.firstChild.data;
                    else                    var msgText = '';

                    var meta = {
                                    'field':    field,
                                    'message':  msgText,
                                    'fixed':    false,
                                    'label':    Singles.Errors.markLabelWrong(field),
                                    'position': Position.cumulativeOffset(field)
                                };

                    Singles.Errors.errorsList.push(meta);
                    child.meta = meta;

                    if(field) {
                        field.meta = meta;
                        //ErrorHint.link(field);
                    }

                    child.style.cursor = 'pointer';
                    child.onclick = Singles.Errors.focus.bindAsEventListener(Singles.Errors);
                }
            }
        }
    },

	_getTextNode: function(element) {
		var parent = element.parentNode;
		
		switch(element.id) {
			case 'agreeToTOS':	return parent.parentNode;
			default:	return parent.parentNode.parentNode.cells[0];;
		}
	},

    markLabelWrong: function(field) {
		var label;
		if((field = $(field)) && field.parentNode) {
            label = field.parentNode;
            while(label != null) {
                if(label.tagName == 'LABEL') break;
                label = label.parentNode;
            }

            if(label != null) Element.addClassName(label, 'wrong');
		}
        if((field = $(field)) && Singles.Errors._getTextNode(field)) {
            label = Singles.Errors._getTextNode(field);
            if(label != null) Element.addClassName(label, 'wrong');

            return label;
        }
    },

    focus:  function(event) {
        var li = Event.element(event);
        if(li.meta && li.meta.field && li.meta.field.focus) li.meta.field.focus();
    }
};
//-------------------------------------------------------------------------------------------------------
Singles.SOAP = Class.create();
Singles.SOAP.prototype = {
    xmlns:          'urn:singles:operations',
    servicePath:    '/ws/',

    initialize: function (onResponse, onError, onRequest) {
        this.eventHandler = {
            on_request:     this.onRequest.bind(this),
            on_response:    this.onResponse.bind(this),
            on_error:       this.onError.bind(this)
        };

        this.userHandler = {
            on_request:     onRequest,
            on_response:    onResponse,
            on_error:       onError
        };
    },

    invoke: function(serviceName, methodName, params, tagName) {
        this.tagName = tagName;

        this.caller = new WS.Call(this.servicePath + serviceName);
        this.caller.add_handler(this.eventHandler);
        this.caller.invoke_rpc(
            new WS.QName(methodName, this.xmlns),
            params);
    },

    onRequest:  function(call,envelope, xml) {
        if(typeof this.userHandler.on_request == 'function') this.userHandler.on_request(call,envelope, xml);
    },

    onResponse: function(call,envelope, xml) {
        if(typeof this.userHandler.on_response == 'function') {
            var hash = [];
            if(this.tagName != null && xml.responseXML != null) hash = this.parse(xml.responseXML)
            this.userHandler.on_response(call,envelope, xml, hash);
        }
    },

    onError:    function(call,envelope, xml) {
        if(typeof this.userHandler.on_error == 'function') this.userHandler.on_error(call,envelope, xml);
    },

    parse:  function(dom) {
        var objects = [];
        var rows = dom.getElementsByTagName(this.tagName);

        if(rows != null) {
            for(var i=0; i<rows.length; i++) {
                var index = objects.length;
                objects[index] = new Object();

                var attributes = rows[i].attributes;
                for(var j=0; j<attributes.length; j++) {
                    objects[index][attributes[j].name] = attributes[j].value;
                }
				var children = rows[i].childNodes;
				
				for(var j=0; j<children.length; j++) {
					objects[index][children[j].tagName] = children[j].textContent || children[j].text;
				} 
            }
        }

        return objects;
    },

    getRegionsListByCountryId:  function(countryId) {
        this.invoke('GeoService', 'getRegionsListByCountryId', [{name:'countryId', value:countryId}], 'LiteProperty');
    },

    getCitiesListByCountryId:   function(countryId) {
        this.invoke('GeoService', 'getCitiesListByCountryId', [{name:'countryId', value:countryId}], 'City');
    },

    getCitiesListByRegionId:    function(regionId) {
        this.invoke('GeoService', 'getCitiesListByRegionId', [{name:'regionId', value:regionId}], 'City');
    },
	
    getCitiesListByRegionIdWithGeoInfo:    function(regionId) {
        this.invoke('GeoService', 'getCitiesListByRegionIdWithGeoInfo', [{name:'regionId', value:regionId}], 'CityWithGeoInfo');
    }

};
/*
Singles.SOAPParser = Class.create();
Singles.SOAPParser.prototype = {

};
*/
//-------------------------------------------------------------------------------------------------------
Singles.Flash = {
    flash:  function(id) {
    }
};
//-------------------------------------------------------------------------------------------------------
Singles.Notifier = {
    messengerLoaded:    false,

    swfNotifier:         null,
    swfMessenger:        null,

    winMessenger:       null,

    doCommand:  function(command, args) {
        if(typeof this[command] == 'function') {
            var args = args || '';
            var argv = args.split(',');
            this[command].apply(this, argv);
        }
    },

    // size = 'max' | 'min'; showFinalGiftMessage = '1' | '0'
    initNotifier:       function(size, showFinalGiftMessage) {
		
		var appearanceVersion;
		var version = Singles.notifierVersion;
		var iconSet = Singles.iconSet;
		var	myCrowdVersion = Singles.myCrowdVersion;
		var iconColorScheme = Singles.iconColorScheme;
		var height;
        var width;		
		
		if (myCrowdVersion == null) {
			myCrowdVersion = '1';
		}
		
		if(myCrowdVersion == '2') {
			height = (size == 'max') ? "91" : "45";
			width = "410";
		} else {
			height = (size == 'max') ? "95" : "45";
        	width = "576";
		}
		
		if (size == 'min') {
			appearanceVersion = "main_min";			
		} else {
			switch (myCrowdVersion) {
				case '2':
					appearanceVersion = "main_max_2"; 
					break;
				case '3':
					appearanceVersion = "main_max_3";
					break;
				default:
					appearanceVersion = "main_max";
			}
		}	

		if($('flash') != null) {
			$('flash').style.height = height + 'px';
			
			this.swfNotifier = new SWFObject("/images/swf/notifier/notifier_info.swf?version=" + version, "notifier_info", width, height, "8", "#ffffff");
			this.swfNotifier.addParam("quality",  "high");
			this.swfNotifier.addParam("wmode",    "opaque");
			this.swfNotifier.addParam("scale",    "noscale");
			this.swfNotifier.addParam("allowscriptaccess", "always"); /*samedomain*/
			this.swfNotifier.addVariable("showFinalGiftMessage",  showFinalGiftMessage);			
			this.swfNotifier.addVariable("appearance_version", appearanceVersion);
			if(iconSet  != null) {				
				this.swfNotifier.addVariable("iconSet", iconSet);
				this.swfNotifier.addVariable("iconsSet", iconSet);
			}
			if(iconColorScheme != null) {				
				this.swfNotifier.addVariable("iconColorScheme", iconColorScheme);
			}
			this.swfNotifier.write("flash");
		}
			if($('messenger')) document.body.appendChild($('messenger')); 
    },

    messengerWidth:550,
    messengerHeight:253,

    initMessenger:      function(LsoId) {
        this.winMessenger = new Layer('messenger', 0, 0, this.messengerWidth + 10, this.messengerHeight + 22, false, 'popup');
        this.winMessenger.setupAsWindow('Flash Messenger', false);

        this.swfMessenger = new SWFObject("/images/swf/notifier/notifier_msg.swf", "notifier_msg", this.messengerWidth, this.messengerHeight, "8", "#ffffff");
        this.swfMessenger.addParam("quality", "high");
        this.swfMessenger.addParam("wmode",   "opaque");
        this.swfMessenger.addParam("scale",   "noscale");
        this.swfMessenger.addParam("allowscriptaccess", "always"); /*samedomain*/
        //this.foMessenger.addVariable("html_test_shish", "test-1415");
        this.swfMessenger.addVariable("html_object_lso_id", LsoId);
        this.swfMessenger.write("messenger");

        this.messengerLoaded = true;
    },


    init:     function(LsoId) {
        if(!this.messengerLoaded) {
            this.initMessenger(LsoId);
            this.hide();
        }
    },

    show:       function () {
        if(this.messengerLoaded) {
            this.winMessenger.zIndex(100);
            this.winMessenger.center(true);
        }
    },

    hide:       function() {
        if(this.messengerLoaded) {
            if(document.all && !window.opera) {
                this.winMessenger.moveTo(-5000, -50);
                this.winMessenger.show();
            }
            else {
                 if(!this.passed) {
                     this.winMessenger.moveTo(-this.messengerWidth, -50);
                     this.winMessenger.show();

                     this.passed = true;
                 }
                 else
                     this.winMessenger.zIndex(-1);
            }
        }
    },

    hint:       function(msg) {
        if(msg != '')   window.status = msg;
        else            window.status = window.defaultStatus;
    }
}
//-------------------------------------------------------------------------------------------------------
Singles.UI = {
    keepMaxCount_Listbox: function(listbox, count) {
			var selected = 0;
            var maxCount = parseInt(count);

            if(isNaN(maxCount)) return;
            if(listbox.value < 0) {
	            if(listbox.selectedIndex > 0) {
					for(var i = listbox.selectedIndex + 1; 
							(i < listbox.options.length) && (i < listbox.selectedIndex + 1 + maxCount)
							; i++) {
						listbox.options[i].selected = true;
						/* //Add checking of &nbsp; sign at the beginning of the text
						var s = new String(listbox.options[i].text);
						s = s.substr(0, 1);
						window.alert(s.charAt(0));
						if(s.indexOf("&") != -1) {
							window.alert("s == &nbsp;");
							listbox.options[i].selected = true;
						} else {
//							break;
						} */
					}

				}
			}
			//=====================
            for(var i=0; i<listbox.options.length; i++) {
                if( (listbox.options[i].selected) 
					&& (listbox.options[i].value > 0) ) {//Filter out subgroups
						selected++;
				}
                if(selected > count) {
                    listbox.options[i].selected = false;
                    selected--;
                }
            }
    }
}


//-PARAMS FOR FLASH FOR NEW IE PACK-------------------------------------------------------------------------------------
Singles.FlashSwf = {	
    foFlashSwf:         null,
    doCommand:  function(command, args) {
        if(typeof this[command] == 'function') {
            var args = args || '';
            var argv = args.split(',');
            this[command].apply(this, argv);
        }
    },

    initFlashSwf:	function(url,id,height,width,divName) {
        $(divName).style.height = height + 'px';
		$(divName).style.width = width + 'px';
        this.foFlashSwf = new FlashObject(url, id, width, height, "8", "#ffffff");
        this.foFlashSwf.addParam("quality",  "high");
        this.foFlashSwf.addParam("wmode",    "opaque");
        this.foFlashSwf.addParam("scale",    "noscale");
		this.foFlashSwf.addParam("allowscriptaccess", "always"); 
        this.foFlashSwf.write(divName);
    }
}
//-------------------------------------------------------------------------------------------------------
//use example: Singles.Cookie.get(name), Singles.Cookie.set(name, value)
Singles.Cookie = {
 DEFAULT_COOKIE_AGE_DAYS: 365,

 set: function (name, value, expires, path, domain, secure) {
  var curCookie = name + "=" + value +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  
  document.cookie = curCookie;
 },
 
 get: function (name) {
  var prefix = name + "=";
        var cookieStartIndex = document.cookie.indexOf(prefix);
        if (cookieStartIndex == -1)  return null;
        var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
        if (cookieEndIndex == -1) cookieEndIndex = document.cookie.length;
        return document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex);
 },
 
 remove: function (name, path, domain) {
  if (Singles.Cookie.get(name)) {
   document.cookie = name + "=" + 
   ((path) ? "; path=" + path : "") +
   ((domain) ? "; domain=" + domain : "") +
   "; expires=Thu, 01-Jan-70 00:00:01 GMT";
  }
 },

 getDefaultAge: function () {
  var expires = new Date();
  expires.setTime(expires.getTime() + Singles.Cookie.DEFAULT_COOKIE_AGE_DAYS * 24 * 3600 * 1000);
  return expires;
 }
}

/* 
	Disables PING command from Notifier during media uploading process 
	Should be called after multipart form submitting.
	Requires Flash 8+
*/
function enableMessageIgnoreFlag() {
	var notifier = null;	
	notifier = thisMovie("notifier_info");
	if(notifier != null) {
		notifier.enableMessageIgnoreFlag();
	}
}

function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName]
    }
    else {
        return document[movieName]
    }
}

function callNotifierPopUp() {

	var notifier = null;
	notifier = thisMovie("notifier_info");

	var firstShow = true;
	var inputElement = findObjectById('firstShow');	
	if (inputElement) {		
		firstShow = (inputElement.value == 'true');
		inputElement.value = 'false';
	}	

	if ((notifier != null) && (!window.giftDialogCalled) && firstShow) {
		notifier.callGiftDialog();
		window.giftDialogCalled = true;
	} else {
		submitForm('deleteform');
	}
	
}  