String.prototype.trim = function () {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
};

var userId = -1;
var subspopup;
var subPhoneNumber = "";
var zappId = -1;
function showSubsWin(user) {
    userId = user;
    if (subspopup == null) {
        subspopup = document.getElementById("subspop").innerHTML;
    }
    document.getElementById("zappedUserId").value = userId;
    document.getElementById("subscribewin").style.display = "";
    $("#subscribewin").dialog({resizable:false});
    document.getElementById("subspop").innerHTML = subspopup;
}

function closeSubsWin() {
    $("#subscribewin").dialog("close");
    document.getElementById("subscribewin").style.display = "none";
}

function flag(flagElement, zappId) {
    var link = 'public/flagZapp.action?zapp.id=' + zappId;
    callAHAH(link, zappId, 'Flagging the zapp. Wait...', 'Error');
    var flagOne = document.getElementById("zappcontainer");
    var flagRow = document.getElementById(flagElement);
    flagOne.removeChild(flagRow);
}

function approveFlag(flagElement, zappId) {
    var link = 'approveFlag.action?zapp.id=' + zappId;
    callAHAH(link, zappId, 'Flagging the zapp. Wait...', 'Error');

}

function rejectFlag(flagElement, zappId) {
    var link = 'rejectFlag.action?zapp.id=' + zappId;
    callAHAH(link, zappId, 'Flagging the zapp. Wait...', 'Error');
    var flagOne = document.getElementById("zappcontainer");
    var flagRow = document.getElementById(flagElement);
    flagOne.removeChild(flagRow);
}

function subscribe(zappId) {
    var phNumber = document.getElementById('subPhNum' + zappId).value;
    if (document.getElementById('userAlias' + zappId).innerHTML == "Guest") {
        if (phNumber.trim() == "") {
            document.getElementById('phErrMsg' + zappId).innerHTML = "Invalid Number";
            return false;
        }
    }
	if(!document.getElementById('sbsagreement'+ zappId).checked){
		    document.getElementById('phErrMsg' + zappId).innerHTML = "Please accept terms of service";
            return false;
	}
    document.getElementById('phErrMsg' + zappId).innerHTML = "";
    var link = 'public/subscribeZapp.action?zappedUserId=' + userId + '&' + 'subscribedPhoneNumber=' + phNumber + '&zappId=' + zappId;
    callAHAH(link, 'msg'+zappId, 'Subscribing to the zapp. Wait...', 'Error');
    document.getElementById('msg'+zappId).innerHTML="Requesting subscription, please wait";
    closeSubsWindow(zappId);
}
function unsubscribe(zappId) {
    var phNumber = document.getElementById('subPhNum' + zappId).value;
    if (document.getElementById('userAlias' + zappId).innerHTML == "Guest") {
        if (phNumber.trim() == "") {
            document.getElementById('phErrMsg' + zappId).innerHTML = "Invalid Number";
            return false;
        }
    }
    document.getElementById('phErrMsg' + zappId).innerHTML = "";
    var link = 'public/unSubscribeZapp.action?zappedUserId=' + userId + '&' + 'subscribedPhoneNumber=' + phNumber + '&zappId=' + zappId;
    callAHAH(link, null, 'UnSubscribing to the zapp. Wait...', 'Error');

}

function closeSubsWindow(zappId) {
    document.getElementById('subwindow' + zappId).style.display = "none";
//    document.getElementById('subPhNum' + zappId).value = "";
    document.getElementById('phErrMsg' + zappId).innerHTML = "";
}

function agreementChanged(zappId){
	 var agBox = document.getElementById('sbsagreement' + zappId);
	if(agBox.checked){
		document.getElementById('subsbutton' + zappId).style.display="";
	}else{
		document.getElementById('subsbutton' + zappId).style.display="none";
	}
}

function showSubsWindow(user, zappId) {
    userId = user;
    document.getElementById('subwindow' + zappId).style.display = "";
    document.getElementById("zappedUserId").value = userId;
}

// javascript function to return only numbers.
function numberOnly(evt) {
    //validate digits only
    var key;
    var keychar;
    if (window.event)
        key = window.event.keyCode;
    else if (evt)
        key = evt.which;
    else
        return true;
    keychar = String.fromCharCode(key);

	// other control keys like backspace, home, end, arrow keys
    if ((key == null) || (key == 0) || (key == 8) ||
        (key == 9) || (key == 13) || (key == 27) || key == 59)
        return true;

    // allowing only numbers
    else if ((("0123456789").indexOf(keychar) > -1))
        return true;

	//for all other keys return false
    return false;
}



// Determine browser and version.
// Usage
//<div id="boxA" class="box content" style="left:400px;top:50px;width:12em;" onmousedown="dragStart(event)">
//<div id="boxB" class="box" style="left:400px;top:150px;">
//<div class="bar" style="width:12em;"
// onmousedown="dragStart(event, 'boxB')">Drag Box B</div>
//<div class="content" style="width:12em;">This is Box B, drag it using the bar above.</div>
//</div>
function Browser() {

    var ua, s, i;

    this.isIE = false;
    this.isNS = false;
    this.version = null;

    ua = navigator.userAgent;

    s = "MSIE";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isIE = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

    s = "Netscape6/";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = parseFloat(ua.substr(i + s.length));
        return;
    }

  // Treat any other "Gecko" browser as NS 6.1.

    s = "Gecko";
    if ((i = ua.indexOf(s)) >= 0) {
        this.isNS = true;
        this.version = 6.1;
        return;
    }
}

var browser = new Browser();

// Global object to hold drag information.

var dragObj = new Object();
dragObj.zIndex = 0;

function dragStart(event, id) {

    var el;
    var x, y;

  // If an element id was given, find it. Otherwise use the element being
    // clicked on.

    if (id)
        dragObj.elNode = document.getElementById(id);
    else {
        if (browser.isIE)
            dragObj.elNode = window.event.srcElement;
        if (browser.isNS)
            dragObj.elNode = event.target;

    // If this is a text node, use its parent element.

        if (dragObj.elNode.nodeType == 3)
            dragObj.elNode = dragObj.elNode.parentNode;
    }

  // Get cursor position with respect to the page.

    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
                + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
                + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

  // Save starting positions of cursor and element.

    dragObj.cursorStartX = x;
    dragObj.cursorStartY = y;
    dragObj.elStartLeft = parseInt(dragObj.elNode.style.left, 10);
    dragObj.elStartTop = parseInt(dragObj.elNode.style.top, 10);

    if (isNaN(dragObj.elStartLeft)) dragObj.elStartLeft = x - 90;
    if (isNaN(dragObj.elStartTop))  dragObj.elStartTop = y - 85;

  // Update element's z-index.

    dragObj.elNode.style.zIndex = ++dragObj.zIndex;

  // Capture mousemove and mouseup events on the page.

    if (browser.isIE) {
        document.attachEvent("onmousemove", dragGo);
        document.attachEvent("onmouseup", dragStop);
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS) {
        document.addEventListener("mousemove", dragGo, true);
        document.addEventListener("mouseup", dragStop, true);
        event.preventDefault();
    }
}

function dragGo(event) {

    var x, y;

  // Get cursor position with respect to the page.

    if (browser.isIE) {
        x = window.event.clientX + document.documentElement.scrollLeft
                + document.body.scrollLeft;
        y = window.event.clientY + document.documentElement.scrollTop
                + document.body.scrollTop;
    }
    if (browser.isNS) {
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    }

  // Move drag element by the same amount the cursor has moved.

    dragObj.elNode.style.left = (dragObj.elStartLeft + x - dragObj.cursorStartX) + "px";
    dragObj.elNode.style.top = (dragObj.elStartTop + y - dragObj.cursorStartY) + "px";

    if (browser.isIE) {
        window.event.cancelBubble = true;
        window.event.returnValue = false;
    }
    if (browser.isNS)
        event.preventDefault();
}

function dragStop(event) {

    // Stop capturing mousemove and mouseup events.

    if (browser.isIE) {
        document.detachEvent("onmousemove", dragGo);
        document.detachEvent("onmouseup", dragStop);
    }
    if (browser.isNS) {
        document.removeEventListener("mousemove", dragGo, true);
        document.removeEventListener("mouseup", dragStop, true);
    }
}



// Functions related to friends module

//function for loading the contact details for edit
function loadFriendsDetailsForEdit(firstName, lastName, phoneNumber, id) {
    document.getElementById('friendFirstName').value = firstName;
    document.getElementById('friendLastName').value = lastName;
    document.getElementById('friendMobile').value = phoneNumber;
    document.getElementById('friendIdForEdit').value = id;
    document.getElementById('savebutton').value = 'Update';
    var link = 'getFriendDetail.action?friendIdForEdit=' + id;
    callAHAH(link, 'friendDetail', 'Adding/Modifying Contact details. Please wait...', 'Error');

}

// function to validate and submit the friends details
function addFriends() {
    var friendFirstName = (document.getElementById('friendFirstName').value).trim();
    var friendLastName = (document.getElementById('friendLastName').value).trim();
    var friendMobile = (document.getElementById('friendMobile').value).trim();
    var friendIdForEdit = document.getElementById('friendIdForEdit').value;
    var canSubmit = true;
    if (friendFirstName == "") {
        document.getElementById('errFriendFirstName').innerHTML = "Firstname cannot be empty";
        document.getElementById('errFriendFirstName').style.display = "";
        canSubmit = false;
    }
    if (friendMobile == "" || isNaN(parseInt(friendMobile)) == 'true') {
        document.getElementById('errFriendMobile').style.display = "";
        document.getElementById('errFriendMobile').innerHTML = "Invalid phone number";
        canSubmit = false;
    }
    if (canSubmit) {
        var link = 'public/addFriend.action?friendIdForEdit=' + friendIdForEdit + '&' + 'friendFirstName=' + friendFirstName + '&friendLastName=' + friendLastName;
        link = link + '&friendMobile=' + friendMobile;
        clearAddFriendsForm();
//		document.getElementById('selectedFriendDetail').innerHTML="";
        callAHAH(link, 'friendsList', 'Adding/Modifying Contact details. Please wait...', 'Error');
    }
}

// JS function which takes care of updating a group.
function updateGroup() {
    var groupName = document.getElementById('groupName').value;
    if (groupName.trim() == "") {
        document.getElementById('errGroupName').innerHTML = "Groupname is mandatory";
        document.getElementById('errGroupName').style.display = "";
    } else {
        selectAllDest(document.getElementById('selectedcontacts'));
        document.loadGroupForEdit.action = 'updateGroup.action';
        document.loadGroupForEdit.submit();
    }

}

// function to delete a friend
function deleteFriend() {
    var friendIdForEdit = (document.getElementById('friendIdForEdit').value).trim();
    if (friendIdForEdit == "") {
        document.getElementById('errDeleteFriend').innerHTML = "Select a contact to delete";
        document.getElementById('errFriendFirstName').style.display = "";
    } else {
        var link = 'public/deleteFriend.action?friendIdForEdit=' + friendIdForEdit;
        clearAddFriendsForm();
        callAHAH(link, 'friendsList', 'Adding/Modifying Contact details. Please wait...', 'Error');

    }
}

// function to delete a group
function deleteGroup() {
    var groupIdForEdit = document.getElementById('groupForEditId').value;
    if (groupIdForEdit == "") {
        document.getElementById('errDeleteGroup').innerHTML = "Select a group to delete";
        document.getElementById('errDeleteGroup').style.display = "";
    } else {
        var link = "deleteGroup.action?groupIdForEdit=" + groupIdForEdit;
        clearAddGroupsForm();
        callAHAH(link, 'groupList', 'Deleting group. Please wait...', 'Error');
    }
}

// function to reset the add grou form
function clearAddGroupsForm() {
    document.getElementById('savebutton').value = 'Add New';
    document.getElementById('groupForEditId').value = "";
    moveAllOption(document.getElementById('selectedcontacts'), document.getElementById('availablecontacts'));
    document.getElementById('groupName').value = '';
    document.getElementById('groupDesc').value = '';
    document.getElementById('errDeleteGroup').innerHTML = "";
    document.getElementById('errDeleteGroup').style.display = "none";
    document.getElementById('errGroupName').innerHTML = "";
    document.getElementById('errGroupName').style.display = "none";


}

// function to reset the add friends form
function clearAddFriendsForm() {
    document.getElementById('friendFirstName').value = "";
    document.getElementById('friendLastName').value = "";
    document.getElementById('friendMobile').value = "";
    document.getElementById('friendIdForEdit').value = "";
    document.getElementById('savebutton').value = 'Add New';
    document.getElementById('errFriendFirstName').innerHTML = "";
    document.getElementById('errFriendMobile').innerHTML = "";
    document.getElementById('errFriendFirstName').style.display = "none";
    document.getElementById('errFriendMobile').style.display = "none";
    document.getElementById('errDeleteFriend').innerHTML = "";
    document.getElementById('errFriendFirstName').style.display = "none";
}

/**
 * This function after the displayTag table has been created adds a onclick event
 * handler to each row in the table. The onclick event will first reset all rows to
 * the default background color which is white and then assign the clicked row to the
 * highlight color which is a light green.
 */
var previousClass = '';
function highlightTableRows(tableId, functionName) {
    var methodName = eval(functionName)
    var table = document.getElementById(tableId);
    var tbody = table.getElementsByTagName("tbody")[0];
    var rows = tbody.getElementsByTagName("tr");
    // add event handlers so rows light up and are clickable
    for (i = 0; i < rows.length; i++) {
        rows[i].onmouseover = function() {
            previousClass = this.className;
            this.className = 'mouseoverclass';
        };

        rows[i].onmouseout = function() {
            this.className = previousClass;
        };
        rows[i].onclick = function() {
            methodName(this);
        }
    }
}

function highlightTableData(tableId, functionName) {
    var methodName = eval(functionName)
//    var table = document.getElementById(tableId);
//    var tbody = table.getElementsByTagName("tbody")[0];
    var rows = $('.friendslist');
    // add event handlers so rows light up and are clickable
    for (i = 0; i < rows.length; i++) {
        rows[i].onmouseover = function() {
            previousClass = this.className;
            this.className = 'mouseoverclass';
        };

        rows[i].onmouseout = function() {
            this.className = previousClass;
        };
        rows[i].onclick = function() {
            methodName(this);
        }
    }
}
// Get the required details of the contact from the selected table row.
function getContactDetailsFromTableRow(object) {
    if (document.all)
    {
        var firstName = object.getElementsByTagName('contactfirstname')[0].value;
        var lastName = object.getElementsByTagName('contactlastname')[0].value;
        var mobileNumber = object.getElementsByTagName('contactmobile')[0].value;
        var id = object.getElementsByTagName('contactid')[0].value;
        loadFriendsDetailsForEdit(firstName, lastName, mobileNumber, id);
    } else {
        var firstName = object.getElementsByTagName('contactfirstname')[0].innerHTML;
        var lastName = object.getElementsByTagName('contactlastname')[0].innerHTML;
        var mobileNumber = object.getElementsByTagName('contactmobile')[0].innerHTML;
        var id = object.getElementsByTagName('contactid')[0].innerHTML;
        loadFriendsDetailsForEdit(firstName, lastName, mobileNumber, id);
    }
}

// Get the required details of the group from the table row
function getGroupDetalsFromTableRow(object) {
    var groupIdForEdit = -1;
	// For IE
    if (document.all) {
        groupIdForEdit = object.getElementsByTagName('groupidforedit')[0].value;
    } else { // for other browsers
        groupIdForEdit = object.getElementsByTagName('groupidforedit')[0].innerHTML;
    }
    var link = 'public/loadGroupForEdit.action?groupIdForEdit=' + groupIdForEdit;
    callAHAH(link, 'addgroup', 'Loading Group Details. Please wait....', 'Error');
}


// Function for moving objects orm one listbox to another

function moveOption(objSourceElement, objTargetElement) {
    var aryTempSourceOptions = new Array();
    var x = 0;
        //looping through source element to find selected options
    for (var i = 0; i < objSourceElement.length; i++) {
        if (objSourceElement.options[i].selected) {
            //need to move this option to target element
            var intTargetLen = objTargetElement.length++;
            objTargetElement.options[intTargetLen].text = objSourceElement.options[i].text;
            objTargetElement.options[intTargetLen].value = objSourceElement.options[i].value;
        }
        else {
            //storing options that stay to recreate select element
            var objTempValues = new Object();
            objTempValues.text = objSourceElement.options[i].text;
            objTempValues.value = objSourceElement.options[i].value;
            aryTempSourceOptions[x] = objTempValues;
            x++;
        }
    }
        //resetting length of source
    objSourceElement.length = aryTempSourceOptions.length;
        //looping through temp array to recreate source select element
    for (var i = 0; i < aryTempSourceOptions.length; i++) {
        objSourceElement.options[i].text = aryTempSourceOptions[i].text;
        objSourceElement.options[i].value = aryTempSourceOptions[i].value;
        objSourceElement.options[i].selected = false;
    }
}



// Function to move all the options in a multiselect box to the destination.

function moveAllOption(objSourceElement, objTargetElement) {
    for (var i = 0; i < objSourceElement.length; i++) {
        objSourceElement.options[i].selected = true;
    }
    moveOption(objSourceElement, objTargetElement);

}

/*
* Function to select all the options moved to the destination combo.
*/
function selectAllDest(dest) {
    for (var i = 0; i < dest.length; i++) {
        dest.options[i].selected = true;
    }
    return false;

}



// function to toggle hide/show the add friend section.
function toggleDiv(dividtotoggle, hrefidforimagechange) {
    if (document.getElementById(dividtotoggle).style.display == "") {
        document.getElementById(dividtotoggle).style.display = "none"
        document.getElementById(hrefidforimagechange).innerHTML = "<img src='styles/images/plus.png' border='0'/>";
    } else {
        document.getElementById(dividtotoggle).style.display = "";
        document.getElementById(hrefidforimagechange).innerHTML = "<img src='styles/images/minus.png' border='0'/>";
    }
}


// function to show the sms email popup block
function showEmailSmsPopup(smsoremail, dividtoshow) {
    var divid = "sms_" + dividtoshow;
//    $("#contactselect").multiSelect(null,function(el){});
    var link = hostlocation + "/contactsForAjax.action";
    $.post(link,null,function(data){
       populateContacts(dividtoshow,data);
    },"json");
    if (smsoremail == 'email') {
        divid = "email_" + dividtoshow;
    }
    document.getElementById(divid).style.display = "";
}

function populateContacts(zappId,data){
    var contacts = data.contacts;
    var contactsSelect = $("#contactselect"+zappId);
    if(contacts == "error"){
        contactsSelect.val("No contacts found");
    }else{
        $("#contactselect"+zappId).removeOption(/./);
        for(i=0 ; i<contacts.length ; i++){
            var contact = contacts[i];
            //var option = "<option value='"+ contact.mobileNumber + "'>" + contact.name + "</option>";
            $("#contactselect"+zappId).addOption(contact.mobileNumber,
				contact.name,false);

        }
		$("#contactselect"+zappId).change(function () {
				var options = $("#contactselect"+zappId).selectedValues();
				var mobNumbers = "";
				for(i=0 ; i<options.length ; i++){
					mobNumbers += options[i];
					if(i<options.length-1){
						mobNumbers+=",";
					}
				}
				$("#smsphonenumbers"+zappId).val(mobNumbers);
			})
			.change();

    }
}

function friendSelected(){
    var options = this.selectedValues();
	var mobNumbers = "";
	for(i=0 ; i<options.length ; i++){
		mobNumbers += options[i];
		if(i<options.length-1){
			mobNumbers+=",";
		}
	}
	$("#smsphonenumbers").val(mobNumbers);
}

// function to show the sms email popup block
function hideEmailSmsPopup(smsoremail, dividtoshow) {
    var divid = "sms_" + dividtoshow;
    if (smsoremail == 'email') {
        divid = "email_" + dividtoshow;
    }
    document.getElementById(divid).style.display = "none";
}

function recommendZapp(smsemail, zappId) {
    if (smsemail == 'sms') {
        var phoneNumbers = document.getElementById('smsphonenumbers'+ zappId).value;
	    if (phoneNumbers.trim() == "") {
            document.getElementById('smsvalidationErrMsg' + zappId).innerHTML = "Invalid Number";
            return false;
        }
		if(!document.getElementById('smsats'+ zappId).checked){
		    document.getElementById('smsvalidationErrMsg' + zappId).innerHTML = "Please accept terms of service";
            return false;
		}
        var link = 'public/smsZapp.action?phoneNumbers=' + phoneNumbers + '&zappId=' + zappId;
        callAHAH(link, zappId, 'Recommending Zapp to friends. Please wait...', 'Error');
    } else {
        var phoneNumbers = document.getElementById('emailphonenumbers'+ zappId).value;
		var fromAlias = document.getElementById('fromAlias'+ zappId).value;
		if (fromAlias.trim() == "") {
            document.getElementById('validationErrMsg' + zappId).innerHTML = "Invalid Alias";
            return false;
        }
	    if (phoneNumbers.trim() == "") {
            document.getElementById('validationErrMsg' + zappId).innerHTML = "Invalid Email";
            return false;
        }
		if(!document.getElementById('ats'+ zappId).checked){
		    document.getElementById('validationErrMsg' + zappId).innerHTML = "Please accept terms of service";
            return false;
		}
        var link = 'public/emailZapp.action?phoneNumbers=' + phoneNumbers + '&zappId=' + zappId + '&fromAlias='+fromAlias;
        callAHAH(link, zappId, 'Recommending Zapp to friends. Please wait...', 'Error');
    }
}

//function to stop subscriber from subscribing to a persons zapp.
// initiated by the zapper
function stopSubscriber(subscriberUserId, formName) {
    document.getElementById('subscriberUserId').value = subscriberUserId;
    var frm = document.forms[formName];
    frm.action = "stopSubscriber.action"
    frm.submit();

}

function submitSubscriptionForm(tab, action) {
    document.getElementById("subtab1").className = "subtabtext";
    document.getElementById("subtab2").className = "subtabtext";
    document.getElementById("subtab" + tab).className = "subtabtextselected";

    document.forms[0].action = action;
    document.forms[0].submit();
}

function adSelect() {
	var adType = document.getElementsByName('adRad');
    var adRad;
    if(adType[0].checked){
        adRad = adType[0].value;
    }else{
        adRad = adType[1].value;
    }

    if (adRad==null) {
		document.getElementById('advertText').innerHTML = "";
	} else if(adRad=='Advertisement'){
		document.getElementById('advertText').innerHTML = document.getElementById('advert').innerHTML;
	}else{
        document.getElementById('advertText').innerHTML = document.getElementById('coupon').innerHTML;
    }
}


function highlightSelectedMenu(selectedMenu)
{
	if(document.getElementById(selectedMenu.trim()+"_Menu")) {
		document.getElementById(selectedMenu.trim()+"_Menu").className="selectedMenu";
	}
}

var proto =  location.protocol;
var host = location.host;
var hostlocation = proto + '//' + host;

function updateStatus(){
    $("#stedit").hide();
    $("#status").show("slow");
    $(".statusmessageedit").show("slow");
    var statusText = $("#sttext").val();
    var link = hostlocation + '/updateStatus.action';
    var data = {"user.status":statusText}
    $.post(link,data,
            function(data) {
                var restult = data.result;
                if (restult == "success") {
	                $("#status").html(statusText);
					// the options for this ajax request
                } else {
	                $("#status").hide();
                    $("#stedit").show("slow");
                    alert("Sorry, were unable to update the status, please try again.")

                }
            }, "json");
}

function showStatusUpdate(){
    $("#status").hide();
    $("#stedit").show("slow");
    $(".statusmessageedit").hide();
}